Échantillonnage CDF inverse pour une distribution mixte

9

La version courte hors contexte

Soit une variable aléatoire avec CDF y

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

Disons que je voulais simuler des tirages de utilisant la méthode CDF inverse. Est-ce possible? Cette fonction n'a pas exactement d'inverse. Là encore, il y a l' échantillonnage par transformation inverse pour la distribution du mélange de deux distributions normales, ce qui suggère qu'il existe un moyen connu d'appliquer l'échantillonnage par transformation inverse ici.y

Je connais la méthode en deux étapes, mais je ne sais pas comment l'appliquer à ma situation (voir ci-dessous).


La version longue avec fond

J'ai ajusté le modèle suivant pour une réponse vectorielle, , en utilisant MCMC (spécifiquement, Stan):yi=(y1,,yK)i

θkilogit1(αkxi),μkiβkxiσk22F(){θ y = 0 θ+(1θ)×CDFlog-normal(;μ,σ) y > 0ukF(yk),zkΦ1(uk)zN(0,R)×kf(yk)(α,β,σ,R)priors

où indexe observations, est une matrice de corrélation et est un vecteur de prédicteurs / régresseurs / caractéristiques.N R xiNRx

Autrement dit, mon modèle est un modèle de régression dans lequel la distribution conditionnelle de la réponse est supposée être une copule gaussienne avec des marginaux log-normaux gonflés à zéro. J'ai déjà publié des articles sur ce modèle; il s'avère que Song, Li et Yuan (2009, gated ) l'ont développé et ils l'appellent un vecteur GLM ou VGLM. Ce qui suit est leur spécification aussi proche du mot que je pourrais l'obtenir: MonF K G m z q R Γ

f(y;μ,φ,Γ)=c{G1(y1),,Gm(ym)|Γ}i=1mg(yi;μi,φi)c(u|Γ)=|Γ|1/2exp(12qT(ImΓ1)q)q=(q1,,qm)T,qi=Φ1(ui)
FKcorrespond à leur , mon correspond à leur , et mon correspond à leur ; les détails se trouvent à la page 62 (page 3 du fichier PDF) mais ils sont par ailleurs identiques à ce que j'ai écrit ici.GmzqRΓ

La partie zéro gonflée suit à peu près la spécification de Liu et Chan (2010, non fermée ).

Maintenant, je voudrais simuler des données à partir des paramètres estimés, mais je suis un peu confus quant à la façon de procéder. J'ai d'abord pensé que je pouvais simuler directement (en code 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])
    }
}

qui n'utilise pas du tout. Je voudrais essayer d'utiliser la matrice de corrélation que j'ai estimée.R

Mon idée suivante était de prendre des tirages de , puis de les reconvertir en . Cela semble également coïncider avec les réponses dans Génération d'échantillons à partir de la copule en R et échantillonnage bivarié pour la distribution exprimée dans le théorème de la copule de Sklar? . Mais que diable est mon ici? L'échantillonnage par transformation inverse pour la distribution de mélange de deux distributions normales donne l'impression que cela est possible, mais je ne sais pas comment le faire.y F - 1zyF1

shadowtalker
la source
@ Xi'an c'est une copule gaussienne, pour estimer la dépendance entre les composantes . y
shadowtalker
1
Le fil que vous référencez sur l'échantillonnage à partir de mélanges de normales s'applique directement à votre problème sans modification essentielle: au lieu d'utiliser les CDF inverses de normales, utilisez les CDF inverses de vos deux composants. Le CDF inverse de l'atome à est la fonction constante, toujours égale à . 0y=00
whuber
@whuber Je suis juste confus quant à la façon d'utiliser les CDF inverses des deux composants: de quoi puis-je dessiner, de quoi puis-je tirer, puis à quoi dois-je brancher chaque chose?
shadowtalker
1
@ Xi'an explique gentiment que dans sa réponse à la question du mélange normal: vous utilisez une variable uniforme pour sélectionner le composant de mélange, puis vous tirez une valeur de ce composant (comme vous le souhaitez). Dans votre cas, il est exceptionnellement facile de tirer une valeur du premier composant: c'est toujours ! Pour tirer une valeur du deuxième composant, utilisez n'importe quel générateur de nombres aléatoires lognormal que vous aimez. Dans chaque cas, vous vous retrouvez avec un nombre: il n'y a pas de "branchement" à accomplir; tout l'objectif de la génération de nombres aléatoires est d'obtenir ce nombre. 0
whuber
@whuber la nouvelle réponse m'a éclairé. Merci à vous deux.
shadowtalker

Réponses:

5

La réponse à la version longue avec fond:

Cette réponse à la version longue aborde quelque peu un autre problème et, comme nous semblons avoir des difficultés à formuler le modèle et le problème, j'ai choisi de le reformuler ici, espérons-le correctement.

Pour , le but est de simuler les vecteurs tels que, conditionnellement à une covariable , avec . Par conséquent, si l'on veut simuler des données de ce modèle, on pourrait procéder comme suit:1iIyi=(y1i,,yKi)xi

yki={0 with probability logit1(αkxi)log(σkzki+βkxi) with probability 1logit1(αkxi)
zi=(z1i,,zKi)NK(0,R)

Pour ,1iI

  1. Générerzi=(z1i,,zKi)NK(0,R)
  2. Générezu1i,,uKiiidU(0,1)
  3. Derive pouryki=I{uki>logit1(αkxi)}log{σkzki+βkxi}1kK

Si l'on s'intéresse à la génération à partir de la partie postérieure de étant donné le , c'est un problème plus difficile, bien que réalisable par échantillonnage de Gibbs ou ABC.(α,β,μ,σ,R)yki

Xi'an
la source
1
Je savais que je manquais quelque chose. "Tout est évident avec le recul." Mon intention: je suis intéressé par la valeur de , donc oui, je suis intéressé à dessiner à partir de la position postérieure conjointe des paramètres. Je veux que les simulés si le modèle convient. yF(yi|xi)y
shadowtalker
1
Comment le deuxième problème est-il beaucoup plus difficile? J'ai déjà estimé le modèle et j'ai des dessins postérieurs. Nous pouvons continuer à discuter si vous le souhaitez, pour ne pas encombrer les commentaires ici.
shadowtalker
1
Oh, en général, oui. Heureusement, Stan et l'échantillonneur No-U-Turn font le travail dur pour moi là-bas.
shadowtalker
7

La réponse à la version courte hors contexte:

"Inverser" un cdf qui n'est pas inversible au sens mathématique (comme votre distribution mixte) est faisable, comme décrit dans la plupart des manuels de Monte Carlo. (Comme le nôtre , voir le lemme 2.4.) Si vous définissez l'inverse généralisé alors Cela signifie que, lorsque a un saut de à , pour . En d'autres termes, si vous dessinez un uniforme et qu'il finit par être plus petit que , votre génération de X F  est équivalent à  X = F - ( U )  lorsque  U U ( 0 , 1 )

F(u)=inf{xR; F(x)u}
XF is equivalent to X=F(U) when UU(0,1).
F(y)θy=0F(u)=0uθU(0,1)θXest . Sinon, quand , vous finissez par générer à partir de la partie continue, à savoir la log-normale dans votre cas. Cela signifie utiliser une deuxième génération aléatoire uniforme, , indépendante du premier tirage uniforme et définir pour obtenir une génération log-normale.x=0u>θvy=exp(μ+σΦ1(v))

C'est presque ce que votre code R

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

fait. Vous générez un Bernoulli avec une probabilité et s'il est égal à , vous le transformez en log-normal. Puisqu'il est égal à 1 avec une probabilité vous devriez plutôt le transformer en une simulation log-normale quand il est égal à zéro à la place, pour finir avec le code R modifié:θki1θki

Y_hat <- rbinom(1, 1, theta[i, k])
    if (Y_hat == 0)
        Y_hat <- rlnorm(1, mu[i, k], sigma[k])
Xi'an
la source
Donc, tous ensemble, ma procédure de simulation serait: 1) dessiner , 2) calculer , puis 3) calculer si et sinon. Correct? u k = Φ ( z k ) y k = 0 u kθ y k = F - 1 log-normal ( u k )zuk=Φ(zk)yk=0ukθyk=Flog-normal1(uk)
shadowtalker
Non, incorrect. Vous dessinez un premier uniforme pour choisir entre et log-normal, puis un deuxième uniforme au cas où vous auriez opté pour un log-normal. Voir la version éditée de ma réponse. 0
Xi'an
Mais cela ignore la composante ; d'où ma question. J'ai fait un montage clarifiant et j'ai également corrigé l'erreur dans mon pseudocode. z
shadowtalker
Ma réponse est pour la version courte et pour le code R que vous avez fourni. J'espère que cela aide pour la version longue, mais votre formule pour le modèle commun est toujours incorrecte. Vous devez définir le modèle sur les sans utiliser les uniformes ...y
Xi'an
Comment ce modèle est-il incorrect? Je viens de brancher mon dans la formule fournie par l'article que j'ai cité (correspondant à dans leur notation). Est-ce invalide? G 1 , , G mF1,,FKG1,,Gm
shadowtalker