Como gerar uma matriz de correlação aleatória que tem entradas fora da diagonal aproximadamente distribuídas normalmente com determinado desvio padrão?


11

Eu gostaria de gerar uma matriz de correlação aleatória de modo que a distribuição de seus elementos fora da diagonal pareça aproximadamente normal. Como eu posso fazer isso?

A motivação é essa. Para um conjunto de dados de séries temporais, a distribuição de correlação geralmente parece bastante próxima do normal. Eu gostaria de gerar muitas matrizes de correlação "normais" para representar a situação geral e usá-las para calcular o número de risco.n


Conheço um método, mas o desvio padrão resultante (da distribuição dos elementos fora da diagonal) é muito pequeno para o meu objetivo: gerar linhas aleatórias uniformes ou normais de uma matriz X , padronizar as linhas (subtrair a média, dividir por desvio padrão), então a matriz de correlação da amostra 1nXentradas fora da diagonal tem normalmente distribuídos [Actualizarapós comentários: desvio-padrão irá ser~n-1/2].1n1XXn1/2

Alguém pode sugerir um método melhor com o qual eu possa controlar o desvio padrão?


1
1+1

1
X=(X1,X2,,Xn)Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)XYn1/2ρ^nn1/2

1
n1/2

1
... agora, você pode obter correlações maiores em magnitude, primeiro correlacionando as linhas entre si antes de renormalizar. Porém, você basicamente tem apenas um parâmetro para jogar, portanto, a média e a variação assintóticas serão vinculadas a esse parâmetro. Portanto, isso provavelmente também não dará a flexibilidade que você deseja.
cardeal

1
Xm×nXρρ^ijijXmnn1/2(ρ^ijρ)N(0,(1ρ2)2)

Respostas:


5

Forneci primeiro o que agora acredito ser uma resposta abaixo do ideal; portanto, editei minha resposta para começar com uma sugestão melhor.


Usando o método Vine

Neste tópico: Como gerar eficientemente matrizes de correlação aleatória positiva-semidefinida? - Descrevi e forneci o código para dois algoritmos eficientes de geração de matrizes de correlação aleatória. Ambos vêm de um artigo de Lewandowski, Kurowicka e Joe (2009).

Por favor, veja minha resposta lá para muitas figuras e código do matlab. Aqui, gostaria apenas de dizer que o método vine permite gerar matrizes de correlação aleatórias com qualquer distribuição de correlações parciais (observe a palavra "parcial") e pode ser usado para gerar matrizes de correlação com grandes valores fora da diagonal. Aqui está a figura relevante desse segmento:

Método Vine

±1

Elementos fora da diagonal

Eu acho que essas distribuições são razoavelmente "normais", e pode-se ver como o desvio padrão aumenta gradualmente. Devo acrescentar que o algoritmo é muito rápido. Veja o tópico vinculado para obter detalhes.


Minha resposta original

Uma modificação direta do seu método pode fazer o truque (dependendo de quão perto você deseja que a distribuição esteja do normal). Esta resposta foi inspirada nos comentários do @ cardinal acima e na resposta do @ psarka à minha própria pergunta Como gerar uma grande matriz de correlação aleatória com várias correlações fortes presentes?

XX1000×100[a/2,a/2]a=0,1,2,5a=0XX1/1000a>0aa=0,1,2,5

matrizes de correlação aleatória

Todas essas matrizes são, obviamente, positivas. Aqui está o código do matlab:

offsets = [0 1 2 5];
n = 1000;
p = 100;

rng(42) %// random seed

figure
for offset = 1:length(offsets)
    X = randn(n,p);
    for i=1:p
        X(:,i) = X(:,i) + (rand-0.5) * offsets(offset);
    end
    C = 1/(n-1)*transpose(X)*X; %// covariance matrix (non-centred!)

    %// convert to correlation
    d = diag(C);
    C = diag(1./sqrt(d))*C*diag(1./sqrt(d));

    %// displaying C
    subplot(length(offsets),3,(offset-1)*3+1)
    imagesc(C, [-1 1])

    %// histogram of the off-diagonal elements
    subplot(length(offsets),3,(offset-1)*3+2)
    offd = C(logical(ones(size(C))-eye(size(C))));
    hist(offd)
    xlim([-1 1])

    %// QQ-plot to check the normality
    subplot(length(offsets),3,(offset-1)*3+3)
    qqplot(offd)

    %// eigenvalues
    eigv = eig(C);
    display([num2str(min(eigv),2) ' ... ' num2str(max(eigv),2)])
end

A saída deste código (valores próprios mínimos e máximos) é:

0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48

você pode plotar o valor dos menores autovalores obtidos usando esse método ao lado de suas plotagens?
user603

1
Sem alterar a figura, posso simplesmente escrever aqui que os menores autovalores são 0,5, 0,4, 0,3 e 0,1 respectivamente (para cada linha da minha figura). Os maiores crescem de 1,7 para 48.
ameba diz Reinstate Monica

mas esses são os autovalores da matriz de correlação ou os de X'X ?.
user603

C

Eu não acho que é impossível, eu simplesmente não podia vê-lo a partir do código (com Matlab não é usado há anos, neste ponto)
user603


1

Se você estiver tentando gerar matrizes de correlação aleatória, considere a amostragem da distribuição Wishart. Esta pergunta a seguir fornece informações sobre a distribuição Wishart, bem como conselhos sobre como amostrar: Como gerar eficientemente matrizes de correlação aleatória positiva-semidefinida?


Mas pode-se controlar o desvio padrão dos elementos fora da diagonal resultante com parâmetros da distribuição Wishart? Se sim, como?
Ameba diz Reinstate Monica

1

Esta não é uma resposta muito sofisticada, mas não posso deixar de pensar que ainda é uma boa resposta ...

Se sua motivação é que os parâmetros de correlação produzidos pelos dados de séries temporais tendem a parecer normais, por que não apenas simular dados de séries temporais, calcular os parâmetros de correlação e usá-los?

Você pode ter um bom motivo para não fazer isso, mas não está claro para mim a sua pergunta.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.