Suponha que tenhamos
onde é uma amostra aleatória uniforme de tamanho n, e
Então a correlação entre e é .
Como posso estender isso para três variáveis: , X 2 , X 3 ?
Suponha que tenhamos
onde é uma amostra aleatória uniforme de tamanho n, e
Então a correlação entre e é .
Como posso estender isso para três variáveis: , X 2 , X 3 ?
Respostas:
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)
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
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:
-
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
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
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.
Primeiro, você assume que são independentes? Se forem, o coeficiente de correlação entre e não é . Seria E se foram definidos como .
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 entre series se as séries forem tratadas como vetores, com cada ponto de dados sendo tratado como uma dimensão de um vetor. Se você tem série independente em pares, são três vetores ortogonais entre si (porque o dos ângulos entre eles são todos '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.