Se eu tiver um vetor de

8

Meu objetivo final é ser capaz de gerar um vetor de tamanho de variáveis ​​aleatórias correlacionadas de Bernoulli. Uma maneira de fazer isso é usar a abordagem Gaussian Coupla. No entanto, a abordagem Gaussian Coupla apenas me deixa com um vetor:N

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

Suponha que eu tenha gerado modo que a correlação comum entre eles seja . Agora, como posso transformá-los em um novo vetor de ou 's? Em outras palavras, eu gostaria de:(p1,,pN)0 1ρ01

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

mas com a mesma correlação .ρ

Uma abordagem que pensei foi atribuir uma regra de corte rígido, de modo que se , então deixe e se , então deixe .X i = 0 p i0,5 X i = 1pi<0.5Xi=0pi0.5Xi=1

Isso parece funcionar bem em simulações, pois mantém a estrutura de correlação, mas é muito arbitrário para mim qual valor de corte deve ser escolhido além de .0.5

Outra maneira é tratar cada como uma variável aleatória de Bernoulli com probabilidade de sucesso e obter uma amostra dela. No entanto, essa abordagem parece causar perda de correlação e, em vez de , posso obter ou .p i ρ ρXipiρ ρρ2ρ3

Alguém tem alguma opinião ou opinião sobre isso? Obrigado.

user321627
fonte
3
Você tem N variáveis. Por que você está falando apenas de rho único e não de uma matriz de rhos?
ttnphns
4
Veja esta questão do mathoverflow
Jakub Bartczuk

Respostas:

3

Não compreendo a Cópula Gaussiana o suficiente para saber qual é o problema. Mas eu encontrei uma maneira de gerar vetores Bernoulli correlacionados.

Seguindo https://mathoverflow.net/a/19436/105908, se usarmos um conjunto de vetores fixos e um vector aleatório na unidade de esfera u , podemos transformar u em binário X onde X i = ( u v i > 0 ) . Nesta configuração, c o r ( X i , X j ) = π - 2 * θ ( i , jv1...vnuuXXi=(uvi>0) ondeθ(i,j)é o ângulo entrevievj.cor(Xi,Xj)=π2θ(i,j)πθ(i,j)vivj

Como encontrar matriz adequada para produzir uma matriz de correlação desejada R ? A condição angular é convertida em V V T = c o s ( - π R - πV=|v1...vn|Re, portanto, podemos encontrarVcom decomposição de Cholesky.VVT=cos(πRπ2)V

Um código de exemplo em R é o seguinte:

#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 

Obrigado @ jakub-bartczuk por vincular à pergunta do MO - eu não encontraria isso sozinho.


XiBernoulli(0.5)

Martin Modrák
fonte
VVT=cos(πRπ2)
1
Ri,j=π2θ(i,j)πθ(i,j)=arccos(vi.vj|vi|.|vj|)