Je suis désolé si cela semble un peu trop fondamental, mais je suppose que je cherche simplement à confirmer que nous comprenons. J'ai l'impression que je devrais le faire en deux étapes et j'ai commencé à essayer de grogner des matrices de corrélation, mais cela commence à peine à sembler vraiment impliqué. Je cherche une explication concise (idéalement avec des suggestions pour une solution de pseudocode) d'un bon moyen, idéalement rapide, de générer des nombres aléatoires corrélés.
Étant donné deux variables pseudo-aléatoires taille et poids avec des moyennes et des variances connues et une corrélation donnée, je pense que j'essaie essentiellement de comprendre à quoi cette deuxième étape devrait ressembler:
height = gaussianPdf(height.mean, height.variance)
weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient),
correlated_variance(height.variance,
correlation_coefficient))
- Comment calculer la moyenne et la variance corrélées? Mais je tiens à confirmer que c'est vraiment le problème pertinent ici.
- Dois-je recourir à la manipulation matricielle? Ou ai-je quelque chose de très faux dans mon approche de base de ce problème?
probability
correlation
conditional-probability
random-generation
Joseph Weissman
la source
la source
Réponses:
Pour répondre à votre question sur "un bon moyen, idéalement rapide, de générer des nombres aléatoires corrélés": Soit une matrice de variance-covariance souhaitée , définie par définition positive, sa décomposition de Cholesky est la suivante: = ; étant la matrice triangulaire inférieure.C L L T LC C L LT L
Si vous utilisez maintenant cette matrice pour projeter un vecteur de variable aléatoire non corrélé , la projection résultante sera celle de variables aléatoires corrélées.X Y = L XL X Y= L X
Vous pouvez trouver une explication concise pourquoi cela se produit ici .
la source
+1 à @ user11852 et @ jem77bfp, ce sont de bonnes réponses. Permettez-moi d’aborder la question sous un angle différent, non pas parce que je pense que c’est nécessairement meilleur dans la pratique , mais parce que je pense que c’est instructif. Voici quelques faits pertinents que nous connaissons déjà:
est la proportion de la variance dans Y attribuable à la variance dans X ,r2 Y X
(aussi, à partir des règles pour les écarts ):
Nous pouvons maintenant combiner ces quatre faits pour créer deux variables normales standard dont les populations auront une corrélation donnée, (plus exactement, ρ ), bien que les échantillons que vous générez auront des corrélations d’échantillon variables. L’idée est de créer une variable pseudo-aléatoire, X , qui est normale normale, N ( 0 , 1 ) , puis de trouver un coefficient, a , et une variance d’erreur, v e , tels que Y ∼ N ( 0 , a 2 + v e ) , où unr ρ X N( 0 , 1 ) une ve Y∼ N( 0 , un2+ ve) . (Notez que | a | doit être ≤ 1 pour que cela fonctionne et que, en outre, a = r .) Ainsi, vous commencez avec le r que vous voulez; c'est votre coefficient, a . Ensuite, vous déterminez la variance d'erreur dont vous aurez besoin, il s'agit de 1 - r 2 . (Si votre logiciel nécessite l'utilisation de l'écart type, prenez la racine carrée de cette valeur.) Enfin, pour chaque variable pseudo-aléatoireque vous avez générée, x i , générez une variable d'erreur pseudo-aléatoire, e iune2+ ve= 1 | a | ≤ 1 a = r r une 1 - r2 Xje eje , avec la variance d'erreur appropriée , et calculez la variable pseudo-aléatoire corrélée, y i , en multipliant et en ajoutant. ve yje
Si vous voulez faire cela dans R, le code suivant peut fonctionner pour vous:
(Edit: j'ai oublié de mentionner :) Comme je l'ai décrit, cette procédure vous donne deux variables corrélées normales standard. Si vous ne voulez pas standards Normales, mais que vous voulez les variables d'avoir des moyens de spécifiques (non 0) et (pas 1 SDs), vous pouvez les transformer sans affecter la corrélation. Ainsi, vous soustrairez la moyenne observée pour vous assurer que la moyenne est exactement égale à , multipliez la variable par le SD que vous voulez et ajoutez ensuite la moyenne de votre choix. Si vous souhaitez que la moyenne observée fluctue normalement autour de la moyenne souhaitée, vous devez rajouter la différence initiale. Il s’agit essentiellement d’une transformation z-score inversée. Puisqu'il s'agit d'une transformation linéaire, la variable transformée aura la même corrélation avec l'autre variable qu'avant.0
Encore une fois, ceci, dans sa forme la plus simple, ne vous permet que de générer une paire de variables corrélées (cela peut être étendu, mais devient très vite), et ce n’est certainement pas le moyen le plus pratique d’accomplir votre travail. Dans R, vous voudriez utiliser ? Mvrnorm dans le package MASS , à la fois parce que c'est plus facile et parce que vous pouvez générer de nombreuses variables avec une matrice de corrélation de population donnée. Néanmoins, je pense que cela vaut la peine d'avoir parcouru ce processus pour voir comment certains principes de base s'appliquent de manière simple.
la source
En général, ce n’est pas une chose simple à faire, mais je pense qu’il existe des packages pour la génération de variables normales multivariées (au moins dans R, voir
mvrnorm
l’MASS
emballage), dans lesquels vous entrez simplement une matrice de covariance et un vecteur moyen.Si vous ne comprenez pas le sens de l'insertion d'une variable uniforme dans une fonction de distribution de probabilité inverse, essayez de faire un croquis du cas univarié, puis souvenez-vous de l'interprétation géométrique de la fonction inverse.
la source
Si vous êtes prêt à abandonner votre efficacité, vous pouvez utiliser un alogorithme à jeter. Son avantage est qu'il permet tout type de distribution (pas seulement gaussienne).
Bonne chance!
la source