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+(1n)Y

donde

nBernoulli(π)

XNormal(μ1,σ1)

Ytν(μ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 Nk 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