Par exemple, dans R
, la MASS::mvrnorm()
fonction est utile pour générer des données pour illustrer diverses choses dans les statistiques. Il prend un Sigma
argument obligatoire qui est une matrice symétrique spécifiant la matrice de covariance des variables. Comment créer une matrice symétrique avec des entrées arbitraires?
21
Réponses:
Créer une matrice A avec des valeurs arbitrairesn × n UNE
puis utilisez comme matrice de covariance.Σ = ATUNE
Par exemple
la source
Sigma <- A + t(A)
.J'aime avoir le contrôle sur les objets que je crée, même s'ils peuvent être arbitraires.
Considérez donc que possible matrices de covariance Σ peut être exprimée sous la formen × n Σ
où est une matrice orthogonale et σ 1 ≥ σ 2 ≥ ⋯ ≥ σ n ≥ 0 .P σ1≥σ2≥⋯≥σn≥0
Géométriquement, cela décrit une structure de covariance avec une gamme de composants principaux de tailles . Ces composants vont dans le sens des rangées de P . Voir les figures dans Comprendre l'analyse des composants principaux, les vecteurs propres et les valeurs propres pour des exemples avec n = 3 . La définition de σ i définira les amplitudes des covariances et leurs tailles relatives, déterminant ainsi toute forme ellipsoïdale souhaitée. Les rangées de P orientent les axes de la forme comme vous préférez.σi P n=3 σje P
Un avantage algébrique et informatique de cette approche est que lorsque , Σ est facilement inversé (ce qui est une opération courante sur les matrices de covariance):σn> 0 Σ
Ne se soucient pas des directions, mais seulement des plages de tailles du ? C'est très bien: vous pouvez facilement générer une matrice orthogonale aléatoire. Il suffit d'envelopper n 2 iid les valeurs normales standard dans une matrice carrée, puis de l'orthogonaliser. Cela fonctionnera presque sûrement (à condition que n ne soit pas énorme). La décomposition QR fera cela, comme dans ce codeσje n2 n
Cela fonctionne parce que la distribution multinormale à variables ainsi générée est "elliptique": elle est invariante sous toutes les rotations et réflexions (à travers l'origine). Ainsi, toutes les matrices orthogonales sont générées uniformément, comme expliqué dans Comment générer des points uniformément distribués sur la surface de la sphère unitaire 3D? .n
crossprod
R
Sigma
zapsmall(Sigma %*% Tau)
la source
svd(Sigma)
seront réorganisées - cela m'a dérouté pendant une minute.Vous pouvez simuler des matrices définies positives aléatoires à partir de la distribution Wishart en utilisant la fonction "rWishart" du package largement utilisé "stats".
la source
Il existe un package spécialement pour cela
clusterGeneration
(écrit entre autres par Harry Joe, un grand nom dans ce domaine).Il existe deux fonctions principales:
genPositiveDefMat
générer une matrice de covariance, 4 méthodes différentesrcorrmatrix
: générer une matrice de corrélationExemple rapide:
Créé le 2019-10-27 par le package reprex (v0.3.0)
Enfin, notez qu'une autre approche consiste à faire un premier essai à partir de zéro, puis à utiliser
Matrix::nearPD()
pour rendre votre matrice positive-définie.la source