Estou tentando gerar sequência aleatória correlacionada com média = , variância = , coeficiente de correlação = . No código abaixo, eu uso s1
& s2
como desvio padrão e m1
& m2
como 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 x
e y
. Minha pergunta é: como posso gerar uma série significa que, se eu quiser, z
isso também está correlacionado com y
(com a mesma correlação ), mas não com x
. Existe uma fórmula específica que eu preciso saber? Encontrei um, mas não consegui entender.
Respostas:
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 Σ Ax AE(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. Ω = A Σ AT UMA
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 Ω .Σ = I UMA Ω A x Ω
No seu exemplo, você parece querer algo assim:
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
seria suficiente. Não sei como calcular a raiz quadrada de cholesky no matlab (que parece ser o que você está usando), mas
R
você pode usar achol()
funçãoNeste exemplo, para o dois s listados acima dos múltiplos de matriz adequados (respectivamente) seriaΩ
O
R
código usado para chegar a isso foi:fonte
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. :)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 Σ γ λ Σ
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.
fonte
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= I . 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) = A AT .
fonte