Campionamento CDF inverso per una distribuzione mista


9

La versione breve fuori contesto

Sia y una variabile casuale con CDF

F(){θ y = 0 θ+(1θ)×CDFlog-normal(;μ,σ) y > 0

Diciamo che volevo simulare i disegni di usando il metodo inverso CDF. È possibile? Questa funzione non ha esattamente un contrario. Poi di nuovo c'è il campionamento della trasformazione inversa per la distribuzione della miscela di due distribuzioni normali, il che suggerisce che qui esiste un modo noto per applicare il campionamento della trasformazione inversa.y

Sono a conoscenza del metodo in due passaggi, ma non so come applicarlo alla mia situazione (vedi sotto).


La versione lunga con sfondo

Ho adattato il seguente modello per una risposta con valori vettoriali, , usando MCMC (in particolare, Stan):yi=(y1,,yK)i

θKiologit-1(αKXio),μKioβKXio-σK22F(){θ y = 0 θ+(1-θ)×CDFlog-normale(;μ,σ) y> 0uKF(yK),zKΦ-1(uK)z~N(0,R)×ΠKf(yK)(α,β,σ,R)~priori

dove indicizza osservazioni, è una matrice di correlazione e è un vettore di predittori / regressori / caratteristiche.N R xioNRX

Cioè, il mio modello è un modello di regressione in cui si presume che la distribuzione condizionale della risposta sia una copula gaussiana con margini log-normali a zero inflazionati. Ho pubblicato su questo modello prima; si scopre che Song, Li e Yuan (2009, gated ) l'hanno sviluppato e lo chiamano un vettore GLM o VGLM. Di seguito sono riportate le specifiche il più vicino possibile alla parola: MyF K G m z q R Γ

f(y;μ,φ,Γ)=c{sol1(y1),...,solm(ym)|Γ}Πio=1mg(yio;μio,φio)c(u|Γ)=|Γ|-1/2exp(12qT(iom-Γ-1)q)q=(q1,...,qm)T,qio=Φ-1(uio)
FKcorrisponde alla loro , la mia corrisponde alla loro e la mia corrisponde alla loro ; i dettagli sono a pagina 62 (pagina 3 del file PDF) ma sono identici a quelli che ho scritto qui.solmzqRΓ

La parte a zero inflazione segue approssimativamente le specifiche di Liu e Chan (2010, non assegnata ).

Ora vorrei simulare i dati dai parametri stimati, ma sono un po 'confuso su come procedere. Per prima cosa ho pensato di poter semplicemente simulare (nel codice R):y

for (i in 1:N) {
    for (k in 1:K) {
        Y_hat <- rbinom(1, 1, 1 - theta[i, k])
        if (Y_hat == 1)
            Y_hat <- rlnorm(1, mu[i, k], sigma[k])
    }
}

che non usa affatto. Vorrei provare a utilizzare effettivamente la matrice di correlazione che ho stimato.R

La mia prossima idea era di prendere i sorteggi di e poi convertirli nuovamente in . Questo sembra anche coincidere con le risposte in Generazione di campioni da Copula in R e campionamento bivariato per la distribuzione espressa nel teorema di copula di Sklar? . Ma che diamine è la mia qui? Il campionamento della trasformazione inversa per la distribuzione della miscela di due distribuzioni normali fa sembrare che sia possibile, ma non ho idea di come farlo.y F - 1zyF-1


@ Xi'an è una copula gaussiana, per stimare la dipendenza tra le componenti . y
Shadowtalker,

1
Il thread che fai riferimento al campionamento da miscele di Normali si applica direttamente al tuo problema senza alcuna modifica essenziale: invece di utilizzare i CDF inversi dei Normali, usa i CDF inversi dei tuoi due componenti. Il CDF inverso dell'atomo in è la funzione costante, sempre uguale a 0 . y=00
whuber

@whuber Sono solo confuso su come usare i CDF inversi dei due componenti: cosa disegno, da cosa lo disegno, e poi in cosa inserisco ogni cosa?
Shadowtalker,

1
@ Xi'an spiega bene che nella sua risposta alla domanda sulla miscela normale: usi una variabile uniforme per selezionare il componente della miscela e quindi disegni un valore da quel componente (nel modo che preferisci). Nel tuo caso è eccezionalmente facile trarre un valore dal primo componente: è sempre ! Per trarre un valore dal secondo componente usa qualsiasi generatore di numeri casuali lognormale che ti piace. In ogni caso ti ritrovi con un numero: non c'è nessun "collegamento" da realizzare; l'intero obiettivo della generazione di numeri casuali è ottenere quel numero. 0
whuber

@whuber la nuova risposta mi ha chiarito. Grazie ad entrambi.
Shadowtalker,

Risposte:


5

La risposta alla versione lunga con sfondo:

Questa risposta alla versione lunga affronta in qualche modo un altro problema e, poiché sembra che abbiamo difficoltà a formulare il modello e il problema, ho scelto di riformularlo qui, si spera correttamente.

Per 1ioio , l'obiettivo è simulare i vettori yio=(y1io,...,yKio) tale che, in base a una covariata Xio ,

yKio={0 con probabilità logit-1(αKXio)log(σKzKio+βKXio) con probabilità 1-logit-1(αKXio)
conzio=(z1io,...,zKio)~NK(0,R). Pertanto, se si desidera simulare i dati da questo modello, è possibile procedere come segue:

Per 1ioio ,

  1. Genera zio=(z1io,...,zKio)~NK(0,R)
  2. Genera u1io,...,uKio~iidU(0,1)
  3. Deriva yKio=io{uKio>logit-1(αKXio)}log{σKzKio+βKXio} per1KK

Se uno è interessato alla generazione dal posteriore di (α,β,μ,σ,R) dato yKio , questo è un problema più difficile, sebbene fattibile dal campionamento di Gibbs o ABC.


1
Sapevo che mi mancava qualcosa. "Tutto è evidente col senno di poi." Il mio intento: sono interessato al valore di , quindi sì, mi interessa disegnare dal posteriore congiunto dei parametri. Voglio che le y simulate vedano se il modello si adatta. F(yio|Xio)y
Shadowtalker,

1
In che modo il secondo problema è molto più difficile? Ho già stimato il modello e ho i disegni posteriori. Se lo desideri, possiamo continuare a chattare per evitare di ingombrare i commenti qui.
Shadowtalker,

1
Oh, in generale, si. Fortunatamente ho Stan e il No-U-Turn Sampler che fanno il duro lavoro per me lì.
Shadowtalker,

7

La risposta alla versione breve fuori contesto:

"Inversione" di un cdf che non è invertibile in senso matematico (come la tua distribuzione mista) è fattibile, come descritto nella maggior parte dei libri di testo di Monte Carlo. (Come il nostro , vedi Lemma 2.4.) Se definisci l'inverso generalizzato quindi Ciò significa che, quando ha un salto di su , per

F-(u)=inf{XR; F(X)u}
F ( y ) θ y = 0 F - ( u ) = 0 u θ U ( 0 , 1 ) θ X x = 0 u > θ v y = exp ( μ + σ Φ - 1 ( v ) )
X~F è equivalente a X=F-(U) quando U~U(0,1).
F(y)θy=0F-(u)=0uθ. In altre parole, se disegni un'uniforme e finisce più piccola di , la tua generazione di è . Altrimenti, quando per generare dalla parte continua, vale a dire il log-normale nel tuo caso. Ciò significa utilizzare una seconda generazione casuale uniforme, , indipendente dalla prima estrazione uniforme e impostare per ottenere una generazione log-normale.U(0,1)θXX=0u>θvy=exp(μ+σΦ-1(v))

Questo è quasi il tuo codice R.

Y_hat <- rbinom(1, 1, theta[i, k]) if (Y_hat == 1) Y_hat <- rlnorm(1, mu[i, k], sigma[k])

θKio1θKio

Y_hat <- rbinom(1, 1, theta[i, k])
    if (Y_hat == 0)
        Y_hat <- rlnorm(1, mu[i, k], sigma[k])

zuK=Φ(zK)yK=0uKθyK=Flog-normale-1(uK)

No, errato. Disegna una prima divisa per decidere tra e log-normale, quindi una seconda divisa nel caso in cui tu abbia deciso per una log-normale. Vedi la versione modificata della mia risposta. 0
Xi'an,

Ma questo ignora il componente ; da qui la mia domanda. Ho apportato una modifica chiarificatrice e ho anche risolto l'errore nel mio pseudocodice. z
Shadowtalker,

La mia risposta è per la versione breve e per il codice R che hai fornito. Spero che sia d'aiuto per la versione lunga, ma la tua formula per il modello comune è ancora errata. Dovresti definire il modello su senza usare le uniformi ...y
Xi'an

F1,...,FKsol1,...,solm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.