Como posso amostrar a partir de uma distribuição de mistura e, em particular, uma mistura de distribuições normais R
? Por exemplo, se eu quisesse provar de:
como eu pude fazer isso?
r
random-generation
mixture
- Reinstate Monica
fonte
fonte
Respostas:
É uma boa prática evitar
for
loopsR
por razões de desempenho. Uma solução alternativa que explora o fatornorm
é vetorizada:fonte
samples <- rnorm(N)*sds[components]+mus[components]
. Acho que é mais fácil de ler :)Em geral, uma das maneiras mais fáceis de coletar amostras de uma distribuição de mistura é a seguinte:
Etapas do algoritmo
1) Gere uma variável aleatóriavocê∼ Uniforme ( 0 , 1 )
3) Repita as etapas 1) e 2) até obter a quantidade desejada de amostras da distribuição da mistura
Agora, usando o algoritmo geral fornecido acima, você pode fazer uma amostra do seu exemplo de mistura de normais usando o seguinte
R
código:O que gera:
e como verificação de sanidade:
fonte
R
fonte
ifelse()
declaração, mas vou ter que descobrir isso mais tarde. Substituí esse código com um loop.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()
comando antes, no entanto, gosto de escrever código aqui da maneira mais simplista possível, porque quero que seja uma ferramenta para entender e não para eficiência.Já recebi respostas perfeitas, então, para quem quer conseguir isso em Python, aqui está a minha solução:
fonte