Comment puis-je échantillonner à partir d'une distribution de mélange, et en particulier d'un mélange de distributions normales dans R
? Par exemple, si je voulais échantillonner à partir de:
comment pourrais-je faire ça?
r
random-generation
mixture
gung - Réintégrer Monica
la source
la source
Réponses:
Il est recommandé d'éviter les
for
bouclesR
pour des raisons de performances. Une solution alternative qui exploite le faitrnorm
est vectorisée:la source
samples <- rnorm(N)*sds[components]+mus[components]
. Je trouve plus facile à lire :)En général, l'un des moyens les plus simples d'échantillonner à partir d'une distribution de mélange est le suivant:
Étapes de l'algorithme
1) Générer une variable aléatoireU∼ Uniforme ( 0 , 1 )
3) Répétez les étapes 1) et 2) jusqu'à ce que vous ayez la quantité désirée d'échantillons de la distribution du mélange
Maintenant, en utilisant l'algorithme général donné ci-dessus, vous pouvez échantillonner à partir de votre exemple de mélange de normales en utilisant le
R
code suivant :Ce qui génère:
et comme vérification de santé mentale:
la source
R
la source
ifelse()
déclaration, mais je devrai le découvrir plus tard. J'ai remplacé ce code avec une boucle.R
findInterval()
cumsum()
mu
s
p
mix <- function(n,mu,s,p) { ii <- findInterval(runif(n),cumsum(p))+1; x <- rnorm(n,mean=mu[ii],sd=sqrt(s[ii])); return(x); }
findInterval()
commande auparavant, cependant, j'aime écrire du code ici aussi simplement que possible car je veux que ce soit un outil de compréhension plutôt que d'efficacité.Déjà donné des réponses parfaites, donc pour ceux qui veulent y parvenir en Python, voici ma solution:
la source