Muestreo CDF inverso para una distribución mixta

9

La versión corta fuera de contexto

Sea una variable aleatoria con CDF y

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

Digamos que quería simular dibujos de usando el método inverso de CDF. ¿Es eso posible? Esta función no tiene exactamente una inversa. Por otra parte, hay un muestreo de transformación inversa para la distribución de mezclas de dos distribuciones normales que sugiere que hay una forma conocida de aplicar el muestreo de transformación inversa aquí.y

Soy consciente del método de dos pasos, pero no sé cómo aplicarlo a mi situación (ver más abajo).


La versión larga con fondo

Ajusté el siguiente modelo para una respuesta con valor vectorial, , usando MCMC (específicamente, 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

donde indexa observaciones, es una matriz de correlación es un vector de predictores / regresores / características.N R xiNRx

Es decir, mi modelo es un modelo de regresión en el que se supone que la distribución condicional de la respuesta es una cópula gaussiana con márgenes log-normales inflados a cero. He publicado sobre este modelo antes; Resulta que Song, Li y Yuan (2009, cerrada ) lo han desarrollado y lo llaman un vector GLM o VGLM. La siguiente es su especificación tan cercana a textual como pude obtenerla: MiF 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)
FKcorresponde a su , mi corresponde a su , y mi corresponde a su ; los detalles se encuentran en la página 62 (página 3 del archivo PDF) pero son idénticos a lo que escribí aquí.GmzqRΓ

La parte inflada a cero sigue aproximadamente las especificaciones de Liu y Chan (2010, sin delegar ).

Ahora me gustaría simular datos de los parámetros estimados, pero estoy un poco confundido sobre cómo hacerlo. Primero pensé que podía simular directamente (en código 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])
    }
}

que no usa en absoluto. Me gustaría intentar usar la matriz de correlación que estimé.R

Mi siguiente idea fue tomar sorteos de y luego convertirlos nuevamente a . Esto también parece coincidir con las respuestas en Generar muestras de Cópula en R y Muestreo bivariado para distribución expresadas en el teorema de cópula de Sklar? . Pero, ¿qué diablos es mi aquí? El muestreo de transformación inversa para la distribución de mezclas de dos distribuciones normales hace que parezca posible, pero no tengo idea de cómo hacerlo.y F - 1zyF1

Shadowtalker
fuente
@ Xi'an es una cópula gaussiana, para estimar la dependencia entre los componentes . y
shadowtalker
1
El hilo al que hace referencia sobre el muestreo de mezclas de normales se aplica directamente a su problema sin ninguna modificación esencial: en lugar de usar los CDF inversos de las normales, use los CDF inversos de sus dos componentes. El CDF inverso del átomo en es la función constante, siempre igual a . 0y=00
whuber
@whuber Estoy confundido acerca de cómo usar los CDF inversos de los dos componentes: ¿qué dibujo, de qué lo saco y luego en qué enchufo cada cosa?
shadowtalker
1
@ Xi'an explica muy bien eso en su respuesta a la pregunta de la mezcla normal: utiliza una variante uniforme para seleccionar el componente de la mezcla y luego extrae un valor de ese componente (de la forma que desee). En su caso, es excepcionalmente fácil extraer un valor del primer componente: ¡siempre es ! Para dibujar un valor del segundo componente, use cualquier generador de números aleatorios lognormal que desee. En cada caso, terminas con un número: no hay que "enchufarlo" para lograrlo; El objetivo de la generación de números aleatorios es obtener ese número. 0
whuber
@whuber la nueva respuesta me lo aclaró. Gracias a los dos.
shadowtalker

Respuestas:

5

La respuesta a la versión larga con antecedentes:

Esta respuesta a la versión larga de alguna manera aborda otro problema y, dado que parece que tenemos dificultades para formular el modelo y el problema, elijo reformularlo aquí, con suerte correctamente.

Para , el objetivo es simular los vectores modo que, condicional a una covariable , con . Por lo tanto, si uno quiere simular datos de este modelo, podría proceder de la siguiente manera:1iIyi=(y1i,,yKi)xi

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

Para ,1iI

  1. Generarzi=(z1i,,zKi)NK(0,R)
  2. Genereu1i,,uKiiidU(0,1)
  3. Derive parayki=I{uki>logit1(αkxi)}log{σkzki+βkxi}1kK

Si uno está interesado en la generación desde la parte posterior de dada la , este es un problema más difícil, aunque factible por muestreo de Gibbs o ABC.(α,β,μ,σ,R)yki

Xi'an
fuente
1
Sabía que me faltaba algo. "Todo es obvio en retrospectiva". Mi intención: estoy interesado en el valor de , así que sí, estoy interesado en dibujar desde la articulación posterior de los parámetros. Quiero las simuladas para ver si el modelo se ajusta. yF(yi|xi)y
shadowtalker
1
¿Cómo es el segundo problema mucho más difícil? Ya he estimado el modelo y tengo dibujos posteriores. Podemos continuar en el chat si lo desea, para evitar abarrotar los comentarios aquí.
shadowtalker
1
Oh, en general, si. Afortunadamente tengo a Stan y al Sampler No-U-Turn haciendo el trabajo duro por mí allí.
shadowtalker
7

La respuesta a la versión corta fuera de contexto:

"Invertir" un cdf que no es invertible en el sentido matemático (como su distribución mixta) es factible, como se describe en la mayoría de los libros de texto de Monte Carlo. (Al igual que el nuestro , vea el Lema 2.4.) Si define el inverso generalizado entonces Esto significa que, cuando tiene un salto de en , para . En otras palabras, si dibujas un uniforme y termina más pequeño que , tu generación de

F(u)=inf{xR; F(x)u}
F ( y ) θ y = 0 F -
XF is equivalent to X=F(U) when UU(0,1).
F(y)θy=0u θ UF(u)=0uθU(0,1)θXes . De lo contrario, cuando , terminas generando a partir de la parte continua, es decir, el log-normal en tu caso. Esto significa usar una segunda generación aleatoria uniforme, , independiente del primer sorteo uniforme y establecer para obtener una generación logarítmica normal.x=0u>θvy=exp(μ+σΦ1(v))

Esto es casi lo que su código R

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

está haciendo. un Bernoulli con probabilidad y si es igual a , lo conviertes en un log-normal. Dado que es igual a 1 con probabilidad , en su lugar, debe convertirlo en una simulación logarítmica normal cuando sea igual a cero , terminando con el código R modificado:θkiθ i k1θki

Y_hat <- rbinom(1, 1, theta[i, k])
    if (Y_hat == 0)
        Y_hat <- rlnorm(1, mu[i, k], sigma[k])
Xi'an
fuente
Entonces, en conjunto, mi procedimiento de simulación sería: 1) dibujar , 2) calcular , luego 3) calcular si y contrario. ¿Correcto? u k = Φ ( z k ) y k = 0 u kθ y k = F - 1zuk=Φ(zk)yk=0ukθyk=Flog-normal1(uk)
shadowtalker
No, incorrecto Dibuja un primer uniforme para decidir entre y log-normal, luego un segundo uniforme en caso de que haya decidido un log-normal. Vea la versión editada de mi respuesta. 0
Xi'an
Pero eso ignora el componente ; De ahí mi pregunta. Hice una edición aclaratoria y también abordé el error en mi pseudocódigo. z
shadowtalker
Mi respuesta es para la versión corta y para el código R que proporcionó. Espero que ayude para la versión larga, pero su fórmula para el modelo conjunto sigue siendo incorrecta. Debe definir el modelo en las sin usar los uniformes ...y
Xi'an
¿Cómo es incorrecto ese modelo? Acabo de conectar mi en la fórmula proporcionada por el documento que cité (correspondiente a en su notación). ¿Es eso inválido? G 1 , ... , G mF1,,FKG1,,Gm
shadowtalker