Como posso gerar dados com uma matriz de correlação pré-especificada?

19

Estou tentando gerar sequência aleatória correlacionada com média = 0 , variância = 1 , coeficiente de correlação = 0.8 . No código abaixo, eu uso s1& s2como desvio padrão e m1& m2como meio.

p = 0.8 
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2

Isso me dá o correto corrcoef()de 0,8 entre xe y. Minha pergunta é: como posso gerar uma série significa que, se eu quiser, zisso também está correlacionado com y(com a mesma correlação r=0.8 ), mas não com x. Existe uma fórmula específica que eu preciso saber? Encontrei um, mas não consegui entender.

anisa
fonte

Respostas:

21

Parece que você está perguntando como gerar dados com uma matriz de correlação específica.

Um fato útil é que, se você tiver um vetor aleatório com matriz de covariância Σ , o vetor aleatório A x terá a média A E ( x ) e a matriz de covariânciaxΣAxAE(x) . Portanto, se você começar com dados com média zero, a multiplicação por A não mudará isso; portanto, seu primeiro requisito é facilmente satisfeito. Ω=UMAΣUMATUMA

Vamos dizer que você começar com dados não correlacionadas (média zero) (ou seja, a matriz de covariância é diagonal) - já que estamos falando sobre a matriz de correlação, vamos apenas dar . Você pode transformar isso em dados com uma dada matriz de covariância escolhendo A para ser a raiz quadrada de cholesky de Ω - então A x teria a matriz de covariância desejada Ω .Σ=EuUMAΩUMAxΩ

No seu exemplo, você parece querer algo assim:

Ω=(1.80 0.81.80 0.81)

Infelizmente, essa matriz não é definida positivamente, portanto não pode ser uma matriz de covariância - você pode verificar isso vendo que o determinante é negativo. Talvez, ao invés

Ω=(1.8.3.81.8.3.81)    or   Ω=(12/30 02/312/30 02/31)

seria suficiente. Não sei como calcular a raiz quadrada de cholesky no matlab (que parece ser o que você está usando), mas Rvocê pode usar a chol()função

Neste exemplo, para o dois s listados acima dos múltiplos de matriz adequados (respectivamente) seriaΩ

A=(100.8.60.3.933.1972)    or   A=(1002/3.745300.8944.4472)

O Rcódigo usado para chegar a isso foi:

x = matrix(0,3,3)
x[1,]=c(1,.8,.3)
x[2,]=c(.8,1,.8)
x[3,]=c(.3,.8,1)
t(chol(x))

     [,1]      [,2]      [,3]
[1,]  1.0 0.0000000 0.0000000
[2,]  0.8 0.6000000 0.0000000
[3,]  0.3 0.9333333 0.1972027

x[1,]=c(1,2/3,0)
x[2,]=c(2/3,1,2/3)
x[3,]=c(0,2/3,1)
t(chol(x))

      [,1]      [,2]      [,3]
[1,] 1.0000000 0.0000000 0.0000000
[2,] 0.6666667 0.7453560 0.0000000
[3,] 0.0000000 0.8944272 0.4472136
Macro
fonte
1
A função MATLAB também é chamada chol. Observe que isso pode ser instável numericamente se for quase singular. Nesse caso, o uso da raiz quadrada simétrica obtida, por exemplo, através do SVD, geralmente é uma escolha melhor em termos de estabilidade numérica. :)Ω
cardeal
1
Claro que está certo @ cardinal - muitas coisas teoricamente justificadas ficam ruins quando você está tentando fazer coisas numericamente com matrizes quase singulares. Eu estava (convenientemente) imaginando a situação em que a matriz de correlação alvo não estava no domínio em que isso era um problema. Bom é que você apontou isso - graças (e obrigado pela edição para minha outra resposta)
Macro
1
A principal razão pela qual eu estava pensando sobre isso se deveu ao seu grande interesse em reconhecer que a primeira sugestão do OP nem sequer era positiva. E, esperançosamente, a edição da outra pergunta não tenha sido excessivamente zelosa; Eu gosto das duas respostas.
cardeal
7

Se você estiver usando R, também poderá usar a função mvrnorm do pacote MASS, assumindo que deseja variáveis ​​distribuídas normalmente. A implementação é semelhante à descrição de Macro acima, mas usa os vetores próprios da matriz de correlação em vez da decomposição e escala de cholesky com uma decomposição de valor singular (se a opção empírica estiver configurada como verdadeira).

Se é uma matriz com entradas extraídas de uma distribuição normal, Σ é uma matriz de correlação definida positiva com os vetores próprios γ e λ é uma matriz quadrada com os valores de raiz quadrada de eigen de Σ ao longo da diagonal:XΣγλΣ

X=γλXT

ΣX

Observe que a matriz de correlação deve ser definida positivamente, mas a conversão com a função nearPD do pacote Matrix em R será útil.

zzk
fonte
1

Uma solução alternativa sem fatoração de Cholesky é a seguinte. DeixeiΣy a matriz de covariância desejada e suponha que você tenha dados x com Σx=Eu. SuponhaΣy é positivo definitivo com Λ a matriz diagonal dos valores próprios e V a matriz dos vetores próprios da coluna.

Você pode escrever Σy=VΛVT=(VΛ)(ΛTVT)=UMAUMAT.

y=UMAx gere os dados desejados.

Mario Sansone
fonte