Si tengo un vector de probabilidades correlacionadas. ¿Cómo puedo convertirlos en binario sin destruir la correlación?

8

Mi objetivo final es poder tener una forma de generar un vector de tamaño de variables aleatorias de Bernoulli correlacionadas. Una forma en que estoy haciendo esto es usar el enfoque de Gaussian Coupla. Sin embargo, el enfoque de Gaussian Coupla me deja con un vector:N

(p1,,pN)[0,1]N

Supongamos que he generado modo que la correlación común entre ellos es . Ahora, ¿cómo puedo transformarlos en un nuevo vector de o ? En otras palabras, me gustaría:(p1,,pN)ρ01

(X1,,XN){0,1}N

pero con la misma correlación .ρ

Un enfoque en el que pensé fue asignar una regla de corte rígida tal que si , entonces dejara y si , entonces dejara .pi<0.5Xi=0pi0.5Xi=1

Esto parece funcionar bien en las simulaciones, ya que retiene la estructura de correlación, pero es muy arbitrario para mí qué valor de corte debe elegirse aparte de .0.5

Otra forma es tratar cada como una variable aleatoria de Bernoulli con probabilidad de éxito y muestras de ella. Sin embargo, este enfoque parece causar pérdida de correlación y en lugar de , puedo obtener o .Xipiρρ2ρ3

¿Alguien tiene alguna idea o entrada en esto? Gracias.

usuario321627
fuente
3
Tienes N variables. ¿Por qué estás hablando de un solo rho y no de una matriz de rhos?
ttnphns
44
Vea esta pregunta de mathoverflow
Jakub Bartczuk,

Respuestas:

3

No entiendo la cópula gaussiana lo suficiente como para saber cuál es el problema. Pero encontré una manera de generar vectores de Bernoulli correlacionados.

Siguiendo https://mathoverflow.net/a/19436/105908 si tomamos un conjunto de vectores fijos y un vector aleatorio en la esfera unitaria , podemos transformar en binario donde . En esta configuración, donde es el ángulo entre y .v1...vnuuXXi=(uvi>0)cor(Xi,Xj)=π2θ(i,j)πθ(i,j)vivj

Cómo encontrar la matriz adecuadapara producir una matriz de correlación deseada ? La condición de ángulo se traduce en y así podemos encontrar con descomposición de Cholesky.V=|v1...vn|RVVT=cos(πRπ2)V

A continuación se muestra un código de ejemplo en R:

#Get a simple correlation matrix 
N = 3
cor_matrix <- matrix(c(1,0.5,0.8,0.5,1,0.3,0.8,0.3,1), N, N)

#Calculate the vectors with desired angles
vector_matrix <- chol(cos( (pi * cor_matrix - pi) * -0.5))

#You can generate random unit vectors by normalizing a vector 
#of normally distributed variables, note however that the normalization
#does not affect the sign of the dot product and so we ignore it
num_samples <- 10000
normal_rand <- matrix(rnorm(num_samples * N), num_samples, N)

#Generate the target variables
B <- (normal_rand %*% vector_matrix) > 0

#See for yourself that it works
cor(B)  
cor(B) - cor_matrix 

Gracias @ jakub-bartczuk por vincularse a la pregunta de MO: no lo encontraría solo.


El código anterior tiene una gran limitación: las distribuciones marginales se fijan en . Actualmente no sé cómo extender este enfoque para que se ajuste tanto a las correlaciones como a las distribuciones marginales. Otra respuesta tiene un enfoque para el caso general, pero pierde mucha simplicidad (implica integración numérica). También hay un documento llamado Generando trenes de espigas con coeficientes de correlación especificados y el paquete de Matlab que lo acompaña donde el muestreo implica "solo" encontrar numéricamente el cero único de una función monotónica por bisección.XiBernoulli(0.5)

Martin Modrák
fuente
Gracias, esto es genial! ¿Puedo preguntar cómo llegó a que la condición del ángulo sea ? ¡Gracias! VVT=cos(πRπ2)
usuario321627
1
@ user321627 Comienza con y la relación del producto punto con el ángulo A partir de ahí es un álgebra lineal relativamente simple. Soy demasiado flojo para escribir en la computadora :-)Ri,j=π2θ(i,j)πθ(i,j)=arccos(vi.vj|vi|.|vj|)
Martin Modrák