1 votos

Simular una distribución de mezcla en R

Hola sólo quiero tratar de simular una distribución de mezcla con la combinación de un distribución normal y un distribución t no central ,

la variable aleatoria Z se define como

$$Z = nX+(1-n)Y$$

donde

$$n \sim \mathrm{Bernoulli}(\pi) $$

$$ X \sim \mathrm{Normal}(\mu_1, \sigma_1) $$

$$ Y \sim t_\nu(\mu_2, 1) $$

Tengo los códigos como abajo pero un poco ineficientes, ¿alguien puede ayudar a mejorar?

    mix.dist.alt <- function(n,mix.par,mu1,sigma1,mu2,df) {
    #Purpose: Alternative implementation of routine to sample n values
    #  from the mixture distribution
    #Inputs:
    # n - number of samples to return
    # mix.par - pi in the practical notes -- proportion of samples from norm dist
    # mu1 - mean of norm dist
    # sigma1 - sd of norm dist
    # mu2 - mean of t dist
    # df - df for t dist
    #Outputs:
    # vector of n values from the mixture distribution
    #create results vector
    Z<-numeric(n)
    #go through each observation...
    for(i in 1:n){
    #...determine if it comes from the normal or t distribution
    if(rbinom(1,1,mix.par)==1) {
    #normal distribution
    Z[i]<-rnorm(1,mu1,sigma1)
      } else {
    #t distribution
    Z[i]<-mu2+rt(1,df)
     }
        }
    return(Z)
           }

2voto

Dipstick Puntos 4869

Una solución mucho más simple es simplemente tomar $k$ valores de una distribución y $N-k$ de la otra, donde $k$ sigue una distribución binomial ( $N$ Ensayos de Bernoulli):

mix.dist.alt2 <- function(n, mix.par, mu1, sigma1, mu2, df) {
  k <- rbinom(1, n, mix.par)
  sample(c(rnorm(k, mu1, sigma1), mu2+rt(n-k, df))) #shuffle the values
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X