Gere três variáveis ​​aleatórias uniformemente distribuídas correlacionadas

15

Suponha que tenhamos

X1unif(n,0,1),
X2unif(n,0,1),

onde unif(n,0,1) é uma amostra aleatória uniforme de tamanho n, e

Y=X1,

Z=0.4X1+10.4X2.

Então a correlação entre Y e Z é 0.4 .

Como posso estender isso para três variáveis: , X 2 , X 3X1X2X3 ?

user9292
fonte
Editei sua pergunta para facilitar a leitura. Por favor, verifique se está tudo bem. Em relação à sua pergunta, em que sentido você estenderia seu procedimento? A correlação é definida para duas variáveis ​​aleatórias, portanto não está claro para mim o que você quer dizer.
Ocram 06/07/12
3
não é uniforme; portanto, se você está tentando generalizar esse resultado, não parece que está tentando gerar três RVs uniformes correlacionados. Você está pensando em como calcular a correlação entre X 1 e um X 1 + b X 2 + c X 3 ? ZX1aX1+bX2+cX3
MånsT
Suponha que temos , X 2 , X 3 u n i f ( n , 0 , 1 ) e Y = f ( X 2 , X 3 ) , Z = f ( X 1 , X 2 , X 3 ) . Então, o que são Y e Z ? X1X2X3  unif(n,0,1)Y=f(X2,X3)Z=f(X1,X2,X3)YZ
User9292
6
{Distributions of correlated uniforms}{Copulas}
cardeal
4
Por que n entra na discussão? Se X1 e X2 são variáveis ​​aleatórias univariadas, elas não são simplesmente uniformes em [0,1]?
Michael R. Chernick

Respostas:

12

A pergunta contém vários erros, conforme observado nos comentários - conforme definido na pergunta, Z não é uniforme nem tem a correlação especificada.

o cardeal menciona cópulas, e essa é a maneira mais geral de fazer isso. No entanto, existem várias maneiras fáceis de obter uniformes correlacionados (que podem ser vistos como meros atalhos para diferentes tipos de cópulas).

Então, vamos começar com algumas maneiras de obter um par de uniformes correlacionados.

1) Se você adicionar dois uniformes, o resultado será triangular, não uniforme. Mas você pode usar o cdf da variável resultante como uma transformação para retornar o resultado a um uniforme. O resultado não está mais linearmente correlacionado, é claro.

Aqui está uma função R para transformar um triangular simétrico em (0,2) em uniforme padrão

t2u = function(x) ifelse(x<1, x^2, 2-(2-x)^2)/2

Vamos verificar se dá um uniforme

u1 = runif(30000)
u2 = runif(30000)
v1 = t2u(u1+u2)

insira a descrição da imagem aqui

E está correlacionado com u1 e u2:

> cor(cbind(u1,u2,v1))
            u1          u2        v1
u1 1.000000000 0.006311667 0.7035149
u2 0.006311667 1.000000000 0.7008528
v1 0.703514895 0.700852805 1.0000000

mas não linearmente, devido à transformação monotônica em uniformidade

insira a descrição da imagem aqui

Com isso como ferramenta, podemos gerar algumas variáveis ​​adicionais para obter três uniformes equicorrelacionados:

u3 = runif(30000)
v2 = t2u(u1+u3)
v3 = t2u(u2+u3)

cor(cbind(v1,v2,v3))
          v1        v2        v3
v1 1.0000000 0.4967572 0.4896972
v2 0.4967572 1.0000000 0.4934746
v3 0.4896972 0.4934746 1.0000000

A relação entre as variáveis-v é assim:

insira a descrição da imagem aqui

-

Uma segunda alternativa é gerar tomando uma mistura . Em vez de somar uniformes, leve-os com probabilidades fixas.

por exemplo

z = ifelse(rbinom(30000,1,.7),u1,u2)

cor(cbind(u1,z))
          u1         z
u1 1.0000000 0.7081533
z  0.7081533 1.0000000

enter image description here

O que pode ser novamente usado para gerar vários uniformes correlacionados.

-

Uma terceira abordagem simples é gerar normais correlacionados e transformar em uniformidade.

n1=rnorm(30000)
n2=rnorm(30000)
n3=rnorm(30000)
x=.6*n1+.8*n2
y=.6*n2+.8*n3
z=.6*n3+.8*n1
cor(cbind(x,y,z))

          x         y         z
x 1.0000000 0.4763703 0.4792897
y 0.4763703 1.0000000 0.4769403
z 0.4792897 0.4769403 1.0000000

Então agora convertemos para uniforme:

w1 = pnorm(x)
w2 = pnorm(y)
w3 = pnorm(z)
cor(cbind(w1,w2,w3))
          w1        w2        w3
w1 1.0000000 0.4606723 0.4623311
w2 0.4606723 1.0000000 0.4620257
w3 0.4623311 0.4620257 1.0000000

enter image description here

Uma coisa legal dos métodos 2 e 3 é que você tem muita variedade de opções de como as coisas podem ser correlacionadas (e elas não precisam ser correlacionadas como os exemplos aqui).

É claro que há uma grande variedade de outras abordagens, mas todas são rápidas e fáceis.

A parte complicada é obter exatamente a correlação populacional desejada; não é tão simples como quando você quer apenas gaussianos correlacionados. A resposta de Quantibex em Gerar pares de números aleatórios uniformemente distribuídos e correlacionados fornece uma abordagem que modifica meu terceiro método aqui, que deve fornecer a correlação populacional desejada.

Glen_b -Reinstate Monica
fonte
Glen_b. Obrigado, resposta muito bonita e interessante!
user9292
Não entendo de onde vêm os 0,6 e 0,8 na sua terceira abordagem.
manuel
ρρNi+1ρ2NjNiNjρNi1ρ2NjXYZ são normais normais correlacionados. (Esta não é a maneira possível mais eficiente de fazer isso, mas é um caminho.)
Glen_b -Reinstate Monica
2

Primeiro, você assume que X1 1,X2são independentes? Se forem, o coeficiente de correlação entreZ e X1 1não é 0,4. Seria0,4 E se Y foram definidos como Y=0,4X1 1+1 1-(0,4)2X2.

Uma simples olhada na definição da fórmula do coeficiente de correlação e na lei dos cossenos deve convencê-lo de que ρ é um porque entre 2series se as séries forem tratadas como vetores, com cada ponto de dados sendo tratado como uma dimensão de um vetor. Se você tem3 série independente em pares, são três vetores ortogonais entre si (porque o porquedos ângulos entre eles são todos 0 0's.

Isso deve iniciar o processo de decomposição de uma série em seus componentes, da mesma maneira que decompôs um vetor em seus componentes ortogonais.

Dmitry Rubanovich
fonte