Génération de données avec une matrice de covariance d'échantillon donnée

22

Étant donné une matrice de covariance , comment générer des données telles qu'elles auraient l'échantillon de matrice de covariance ?ΣsΣ^=Σs


Plus généralement: nous sommes souvent intéressés à générer des données à partir d'une densité , avec des données x données à un vecteur de paramètre \ boldsymbol \ theta . Il en résulte un échantillon, à partir duquel nous pouvons alors à nouveau estimer une valeur \ boldsymbol {\ hat \ theta} . Ce qui m'intéresse, c'est le problème inverse: que se passe-t-il si on nous donne un ensemble de paramètres \ boldsymbol \ theta_ {s} , et que nous aimerions générer un échantillon x tel que \ boldsymbol {\ hat \ theta} = \ boldsymbol \ theta_ {s} .f(x|θ)xθθ^θsxθ^=θs

Est-ce un problème connu? Une telle méthode est-elle utile? Des algorithmes sont-ils disponibles?

Kees Mulder
la source
Une solution évolutive est fournie par Attilio Meucci. Voir cet article sur les risques et le code Matlab
Peter Cotton

Réponses:

16

Il existe deux situations types différentes pour ce type de problèmes:

i) vous souhaitez générer un échantillon à partir d'une distribution donnée dont les caractéristiques de population correspondent à celles spécifiées (mais en raison de la variation d'échantillonnage, vous n'avez pas les caractéristiques de l'échantillon correspondant exactement).

ii) vous souhaitez générer un échantillon dont les caractéristiques de l'échantillon correspondent à celles spécifiées (mais, en raison des contraintes de correspondance exacte des quantités d'échantillon à un ensemble de valeurs prédéfinies, ne proviennent pas vraiment de la distribution que vous souhaitez).

Vous voulez le deuxième cas - mais vous l'obtenez en suivant la même approche que le premier cas, avec une étape de standardisation supplémentaire.

Ainsi, pour les normales multivariées, l'une ou l'autre peut être effectuée de manière assez simple:

Dans le premier cas, vous pouvez utiliser des normales aléatoires sans la structure de la population (comme la norme standard iid qui a l'attente 0 et la matrice de covariance d'identité), puis l'imposer - transformer pour obtenir la matrice de covariance et dire ce que vous voulez. Si et sont la moyenne de la population et la covariance dont vous avez besoin et sont normaux normaux, vous calculez , pour certains où (par exemple, un approprié pourrait être obtenu via la décomposition de Cholesky) . Alors a les caractéristiques de population souhaitées.μΣzy=Lz+μLLL=ΣLy

Avec la seconde, vous devez d'abord transformer vos normales aléatoires pour éliminer même la variation aléatoire de la moyenne zéro et de la covariance d'identité (en faisant la moyenne de l'échantillon zéro et la covariance échantillon ), puis procédez comme précédemment. Mais cette étape initiale d'élimination de l'écart de l'échantillon de la moyenne exacte , la variance interfère avec la distribution. (Dans de petits échantillons, cela peut être assez grave.)In0I

Cela peut être fait en soustrayant la moyenne de l'échantillon de ( ) et en calculant la décomposition de Cholesky de . Si est le facteur de Cholesky gauche, alors devrait avoir la moyenne de l'échantillon 0 et la covariance de l'échantillon d'identité. Vous pouvez ensuite calculer et avoir un échantillon avec les moments d'échantillonnage souhaités. (Selon la façon dont vos quantités d'échantillons sont définies, il peut y avoir un petit violon supplémentaire impliqué dans la multiplication / division par des facteurs tels que , mais il est assez facile d'identifier ce besoin.)zz=zz¯zLz(0)=(L)1zy=Lz(0)+μn1n

Glen_b -Reinstate Monica
la source
1
+1. L'autre jour, j'avais besoin de générer des données avec un échantillon donné de matrice de covariance, je ne savais pas comment le faire, et pour une raison quelconque, il m'a fallu beaucoup de temps pour trouver votre réponse. Pour augmenter la visibilité de ce fil et pour illustrer vos suggestions, j'ai posté une autre réponse ici avec du code Matlab.
Amoeba dit Reinstate Monica
@amoeba Je me demande s'il est possible de mettre l'un des termes de recherche que vous avez utilisés qui ne sont pas déjà présents ici dans les balises de question (ou éventuellement d'en insérer plusieurs dans une petite modification dans le texte de la question, ce qui devrait encore aider à le trouver ). Je me demande maintenant si je devrais faire la même chose dans R ... mais est-ce que ça va mieux dans ma réponse, ou en complément de la vôtre?
Glen_b -Reinstate Monica
1
J'ai déjà pris la liberté de modifier la question, et j'ai également essayé de formuler ma réponse de telle sorte qu'elle comprenne autant de mots clés que possible. J'espère que cela vous aidera. J'ai été surpris, en passant, que cette simple astuce (blanchissant les données générées avant de les transformer en covariance requise) était si difficile à google; je n'ai rien trouvé (sur CV ou ailleurs), jusqu'à ce que je trouve enfin votre réponse.
Amoeba dit Reinstate Monica
1
@amoeba Oh, d'accord, merci. Oui, en fait, je ne peux pas dire que je me souvienne de l'avoir vu mentionné nulle part pour le cas multivarié (cela a sans doute été le cas, car c'est une idée assez évidente, surtout si vous y avez déjà pensé pour le cas univarié, ou si vous avez déjà vu dans le cas univarié).
Glen_b -Reinstate Monica
@Glen_b Comme vous le dites, la distribution résultante de ces échantillons "nettoyés" ne peut pas être normale. Avez-vous une idée de ce que pourrait être la distribution résultante? Ou peut-être si elle est égale / non égale à la distribution conditionnelle Zz¯=μ,Cov(z)=Σ
gg
17

@Glen_b a donné une bonne réponse (+1), que je veux illustrer avec du code.

Comment générer échantillons à partir d'une distribution gaussienne multivariée d- dimensionnelle avec une matrice de covariance donnée Σ ? Ceci est facile à faire en générant des échantillons à partir d'une gaussienne standard et en les multipliant par une racine carrée de la matrice de covariance, par exemple par c h o l ( Σ ) . Ceci est couvert dans de nombreux threads sur CV, par exemple ici: Comment puis-je générer des données avec une matrice de corrélation prédéfinie? Voici une implémentation simple de Matlab:ndΣchol(Σ)

n = 100;
d = 2;
Sigma = [ 1    0.7  ; ...
          0.7   1   ];
rng(42)
X = randn(n, d) * chol(Sigma);

L'échantillon de matrice de covariance des données résultantes ne sera bien sûr pas exactement ; par exemple dans l'exemple ci-dessus renvoieΣcov(X)

1.0690    0.7296
0.7296    1.0720

Comment générer des données avec un échantillon prédéfini matrice de corrélation ou de covariance d' ?

Ichol(Σ)

Voici la suite de mon exemple Matlab:

X = randn(n, d);
X = bsxfun(@minus, X, mean(X));
X = X * inv(chol(cov(X)));
X = X * chol(Sigma);

Maintenant cov(X), comme requis, retourne

1.0000    0.7000
0.7000    1.0000
amibe dit réintégrer Monica
la source
+1. D'une manière ou d'une autre, cette question se présente sous diverses formes à différents endroits du CV. Y a-t-il moyen de procéder si nous savons que la distribution multivariée est non gaussienne?
rgk
Si vous connaissez la forme de la distribution multivariée à laquelle vous voulez qu'elle ressemble, peut-être dans certains cas.
Glen_b -Reinstate Monica