Comment générer une matrice de corrélation aléatoire qui a des entrées hors diagonale approximativement normalement distribuées avec un écart-type donné?


11

Je voudrais générer une matrice de corrélation aléatoire telle que la distribution de ses éléments hors diagonale ressemble approximativement à la normale. Comment puis-je le faire?

La motivation est la suivante. Pour un ensemble de données de séries chronologiques, la distribution de corrélation semble souvent assez proche de la normale. Je voudrais générer de nombreuses matrices de corrélation "normales" pour représenter la situation générale et les utiliser pour calculer le nombre de risques.n


Je connais une méthode, mais l'écart-type résultant (de la distribution des éléments hors diagonale) est trop petit pour mon objectif: générer lignes aléatoires uniformes ou normales d'une matrice , standardiser les lignes (soustraire la moyenne, diviser par l'écart-type), puis l'échantillon de matrice de corrélation a normalement distribué des entrées hors diagonale [ Mise à jour après les commentaires: l'écart-type sera ].X 1nX1n1XXn1/2

Quelqu'un peut-il suggérer une meilleure méthode avec laquelle je peux contrôler l'écart-type?


1
@Richard, merci pour votre question. Malheureusement, la méthode que vous décrivez ci-dessus ne produira pas d' entrées normalement distribuées. Les diagonales sont 1 avec une probabilité un et les hors diagonales sont limitées entre et . Maintenant, les rééchelonnés entrées vont converger asymptotiquement vers une distribution normale centrée autour de zéro. Pouvez-vous nous donner plus d'informations sur le problème que vous essayez de résoudre? Et pourquoi voulez-vous des diagonales "normalement distribuées"? + 11+1
Cardinal

1
@ Richard, ce que je veux dire, c'est que supposons que et sont deux vecteurs indépendants tels que les entrées de chacun sont iid standard normales. Calculer ; qui est, la corrélation entre l' échantillon et . Alors converge en distribution vers une variable aléatoire normale standard. Par "redimensionné", je voulais dire la multiplication par qui est ce qui est nécessaire pour obtenir une distribution limite non dégénérée. Y = ( Y 1 , Y 2 , ... , Y n ) ρ n = de x de y / ( de les x de l'y ) X Y n 1 / 2 ρ n n 1 / deuxX=(X1,X2,,Xn)Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)XYn1/2ρ^nn1/2
Cardinal

1
@ Richard, l'essence du "problème" est qu'en faisant deux restrictions (a) que les normes de chaque ligne sont 1 et (b) que les entrées sont générées à partir d'un échantillon aléatoire, vous forcez forcément les corrélations à être assez petit (de l'ordre de . La raison en est que vous ne pouvez pas avoir de corrélations arbitrairement grandes entre les lignes et que les normes de chaque ligne soient toujours égales à 1 en présence d'une telle indépendance.n1/2
cardinal

1
... maintenant, vous pouvez obtenir des corrélations de magnitude plus importantes en corrélant d' abord les lignes entre elles avant de les renormaliser. Mais, vous n'avez essentiellement qu'un seul paramètre pour jouer, donc la moyenne asymptotique et la variance seront liées à ce paramètre. Donc, cela ne vous donnera probablement pas non plus la flexibilité que vous semblez vouloir.
Cardinal

1
Bien sûr, prenons un cas simple. Appelons la matrice génératrice , que nous supposerons être sans perte de généralité. Maintenant, générez les colonnes de tant que vecteurs iid de telle sorte que les éléments de chaque vecteur soient des variables aléatoires normales standard qui sont corrélées avec la corrélation . Maintenant, utilisez la procédure que vous avez suivie. Let représentent la corrélation d'échantillon entre le ème et ème rangée * de . Puis pour fixe , laissant ,Xm×nXρρ^ijijXmnn1/2(ρ^ijρ)converge en distribution vers une variable aléatoire . N(0,(1ρ2)2)
Cardinal

Réponses:


5

J'ai d'abord fourni ce que je crois maintenant être une réponse sous-optimale; j'ai donc modifié ma réponse pour commencer par une meilleure suggestion.


Utilisation de la méthode de la vigne

Dans ce fil: Comment générer efficacement des matrices de corrélation aléatoire semi-définie positive? - J'ai décrit et fourni le code de deux algorithmes efficaces de génération de matrices de corrélation aléatoire. Les deux proviennent d'un article de Lewandowski, Kurowicka et Joe (2009).

S'il vous plaît voir ma réponse là pour beaucoup de chiffres et de code matlab. Ici, je voudrais seulement dire que la méthode de la vigne permet de générer des matrices de corrélation aléatoires avec n'importe quelle distribution de corrélations partielles (notez le mot "partiel") et peut être utilisée pour générer des matrices de corrélation avec de grandes valeurs hors diagonales. Voici la figure pertinente de ce fil:

Méthode de la vigne

La seule chose qui change entre les sous-parcelles est un paramètre qui contrôle la concentration de la distribution des corrélations partielles autour de . Comme OP demandait une distribution hors diagonale approximativement normale, voici le tracé avec des histogrammes des éléments hors diagonale (pour les mêmes matrices que ci-dessus):±1

Éléments hors diagonale

Je pense que ces distributions sont raisonnablement "normales", et on peut voir comment l'écart-type augmente progressivement. Je dois ajouter que l'algorithme est très rapide. Voir le fil lié pour les détails.


Ma réponse originale

Une modification directe de votre méthode pourrait faire l'affaire (selon la proximité que vous souhaitez que la distribution soit normale). Cette réponse a été inspirée par les commentaires de @ cardinal ci-dessus et par la réponse de @ psarka à ma propre question Comment générer une grande matrice de corrélation aléatoire de rang complet avec de fortes corrélations présentes?

L'astuce consiste à faire des échantillons de votre corrélés (pas des fonctionnalités, mais des échantillons). Voici un exemple: je génère une matrice aléatoire de (tous les éléments de la normale standard), puis j'ajoute un nombre aléatoire de à chaque ligne, pour . Pour la matrice de corrélation (après standardisation des entités) aura des éléments hors diagonale répartis normalement normalement avec l'écart type . PourX 1000 × 100 [ - a / 2 , a / 2 ] a = 0 , 1 , 2 , 5 a = 0 XX 1 / XX1000×100[a/2,a/2]a=0,1,2,5a=0XX a>0aa=0,1,2,51/1000a>0, Je calcule la matrice de corrélation sans centrer les variables (cela préserve les corrélations insérées), et l'écart-type des éléments hors diagonale croît avec comme indiqué sur cette figure (les lignes correspondent à ):aa=0,1,2,5

matrices de corrélation aléatoire

Toutes ces matrices sont bien sûr définies positives. Voici le code 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

La sortie de ce code (valeurs propres minimum et maximum) est:

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

pouvez-vous tracer la valeur des plus petites valeurs propres que vous obtenez en utilisant cette méthode à côté de vos tracés?
user603

1
Sans changer le chiffre, je peux simplement écrire ici que les plus petites valeurs propres sont respectivement 0,5, 0,4, 0,3 et 0,1 (pour chaque ligne de ma figure). Les plus grands passent de 1,7 à 48.
Amoeba dit Reinstate Monica

mais sont-ce les valeurs propres de la matrice de corrélation ou celles de X'X ?.
user603

Ce sont les valeurs propres de ma matrice , qui est normalisée pour en avoir sur la diagonale, donc de la matrice de corrélation. J'ai mis à jour ma réponse pour que vous puissiez la voir dans le code. Puis-je vous demander ce qui vous fait douter que cela soit possible? Y a-t-il une raison de penser que les grandes matrices de corrélation devraient avoir de très petits éléments hors diagonale? C
amibe dit Réintégrer Monica

Je ne pense pas que ce soit impossible, je ne pouvais tout simplement pas le voir dans le code (n'ayant pas utilisé matlab pendant des années à ce stade)
user603


1

Si vous essayez de générer des matrices de corrélation aléatoires, pensez à échantillonner à partir de la distribution de Wishart. Cette question suivante fournit des informations sur la distribution de Wishart ainsi que des conseils sur la façon d'échantillonner: Comment générer efficacement des matrices de corrélation positives-semi-finies aléatoires?


Mais peut-on contrôler l'écart type des éléments hors diagonale résultants avec les paramètres de la distribution de Wishart? Si c'est le cas, comment?
amibe dit Reinstate Monica

1

Ce n'est pas une réponse très sophistiquée, mais je ne peux m'empêcher de penser que c'est toujours une bonne réponse ...

Si votre motivation est que les paramètres de corrélation produits par les données de séries chronologiques ont tendance à sembler normaux, pourquoi ne pas simplement simuler des données de séries chronologiques, calculer les paramètres de corrélation et les utiliser?

Vous avez peut-être une bonne raison de ne pas le faire, mais cela ne ressort pas clairement de votre question.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.