J'ai estimé l'échantillon matrice de covariance d'un échantillon et obtenir une matrice symétrique. Avec C , je voudrais créer -variate rn normale distribuée , mais donc je besoin de la décomposition de Cholesky de . Que dois-je faire si n'est pas défini positif?C C
15
Réponses:
La question porte sur la façon de générer des variables aléatoires à partir d'une distribution normale multivariée avec une matrice de covariance (éventuellement) singulière . Cette réponse explique une manière qui fonctionnera pour n'importe quelle matrice de covariance. Il fournit une implémentation qui teste sa précision.C
R
Analyse algébrique de la matrice de covariance
Parce que est une matrice de covariance, elle est nécessairement symétrique et semi-définie positive. Pour compléter les informations de base, soit μ le vecteur des moyennes souhaitées.C μ
Parce que est symétrique, sa décomposition en valeurs singulières (SVD) et sa décomposition en eigendecomprendront automatiquement la formeC
pour une matrice orthogonale et une matrice diagonale D 2 . En général, les éléments diagonaux de D 2 sont non négatifs (ce qui implique qu'ils ont tous de vraies racines carrées: choisissez les positifs pour former la matrice diagonale D ). Les informations dont nous disposons à propos de C indiquent qu'un ou plusieurs de ces éléments diagonaux sont nuls - mais cela n'affectera aucune des opérations suivantes et n'empêchera pas le calcul du SVD.V ré2 ré2 ré C
Génération de valeurs aléatoires multivariées
Soit une distribution normale à plusieurs variables standard: chaque composant a une moyenne nulle, la variance unitaire et toutes covariances sont égales à zéro: la matrice de covariance est l'identité I . Alors la variable aléatoire Y = V D X a une matrice de covarianceX je Oui= V D X
Par conséquent , la variable aléatoire a une distribution normale à plusieurs variables avec une moyenne μ et la matrice de covariance C .μ + Y μ C
Calcul et exemple de code
LeOui 0 10 , 000 Oui 100 C 50
R
code suivant génère une matrice de covariance de dimensions et de rangs donnés, l'analyse avec le SVD (ou, dans le code commenté, avec une composition par eigendec), utilise cette analyse pour générer un nombre spécifié de réalisations de (avec le vecteur moyen 0 ) , puis compare la matrice de covariance de ces données à la matrice de covariance prévue à la fois numériquement et graphiquement. Comme on le voit, il génère 10 , 000 réalisations où la dimension de Y est de 100 et le rang de C est 50 . La sortie estAutrement dit, le rang des données est également de et la matrice de covariance estimée à partir des données est à une distance de 8 × 10 - 5 de C - qui est proche. À titre de vérification plus détaillée, les coefficients de C sont comparés à ceux de son estimation. Ils se situent tous près de la ligne de l'égalité:50 8 × 10- 5 C C
Le code est exactement parallèle à l'analyse précédente et devrait donc être explicite (même pour les non-ré2 ré
R
utilisateurs, qui pourraient l'émuler dans leur environnement d'application préféré). Il révèle une nécessité de prudence lors de l'utilisation d'algorithmes à virgule flottante: les entrées de peuvent facilement être négatives (mais minuscules) en raison de l'imprécision. Ces entrées doivent être remises à zéro avant de calculer la racine carrée pour trouver D lui-même.la source
Méthode de solution A :
Dans MATLAB, le code serait
Méthode de solution B : Formuler et résoudre un SDP convexe (programme semi-défini) pour trouver la matrice D à C la plus proche selon la norme de Frobenius de leur différence, de sorte que D soit défini positif, ayant spécifié la valeur propre minimale m.
En utilisant CVX sous MATLAB, le code serait:
Comparaison des méthodes de solution : Outre la symétrisation de la matrice initiale, la méthode de solution A ajuste (augmente) uniquement les éléments diagonaux d'une certaine quantité commune et laisse les éléments hors diagonale inchangés. La méthode de solution B trouve la matrice définie positive la plus proche (de la matrice d'origine) ayant la valeur propre minimale spécifiée, au sens de la norme de Frobenius minimale de la différence entre la matrice définie positive D et la matrice originale C, qui est basée sur les sommes de différences au carré de tous les éléments de D - C, pour inclure les éléments hors diagonale. Ainsi, en ajustant les éléments hors diagonale, cela peut réduire le montant auquel les éléments diagonaux doivent être augmentés, et les éléments diagoanl ne sont pas nécessairement tous augmentés du même montant.
la source
Je commencerais par penser au modèle que vous estimez.
Si une matrice de covariance n'est pas semi-définie positive, cela peut indiquer que vous avez un problème de colinéarité dans vos variables qui indiquerait un problème avec le modèle et ne devrait pas nécessairement être résolu par des méthodes numériques.
Si la matrice n'est pas semi-définie positive pour des raisons numériques, alors il y a quelques solutions qui peuvent être lues ici
la source
Une façon serait de calculer la matrice à partir d'une décomposition de valeurs propres. Maintenant, je dois admettre que je ne connais pas trop les mathématiques derrière ces processus, mais d'après mes recherches, il semble utile de consulter ce fichier d'aide:
http://stat.ethz.ch/R-manual/R-patched/library/Matrix/html/chol.html
et quelques autres commandes connexes dans R.
Consultez également «nearPD» dans le package Matrix.
Désolé, je n'ai pas pu vous aider davantage, mais j'espère que ma recherche autour de vous pourra vous aider à vous orienter dans la bonne direction.
la source
Vous pouvez obtenir les résultats de la fonction nearPD dans le package Matrix dans R. Cela vous donnera une vraie matrice de valeur.
la source