2017-06-04 3 views
-1

Je comprends la définition d'une variable en statistique. Supposons que je voudrais générer un ensemble de données à deux variables de mélange comme suit:Cela va-t-il générer une donnée bivariée (deux variables)?

0,3 Normal (1,3) + 0,7 Normale (2,5)

utilisant le code suivant:

N <- 100000     

#Sample N random uniforms U 
U <- runif(N) 

#Variable to store the samples from the mixture distribution            
rand.samples <- rep(NA,N) 

#Sampling from the mixture 
for(i in 1:N) { 
    if(U[i]<.3) { 
     rand.samples[i] <- rnorm(1,1,3) 
    } else { 
     rand.samples[i] <- rnorm(1,2,5) 
    } 
} 

Will cela génère une donnée bivariée (deux variables) ou non? Si non, alors comment puis-je générer des données de mélange bivariées ou multivariées?

+0

Non, ce n'est pas la même question. Cette question est de savoir comment avoir des données multivaraïtes où entre 2 variables dépend un mélange. Ici, j'ai essayé de comprendre si mon code va générer deux variables ou si c'est une seule variable. Ils sont différents. Merci pour votre commentaire. – Alice

Répondre

2

Le code de @Alice génère un mélange de deux gaussiennes unidimensionnelles. Ce n'est pas une distribution de mélange bivariée. Une référence introductive au mélange de gaussiennes peut être téléchargée à partir de ce link.
Voici le code R pour générer un mélange de deux distributions normales bivariées (avec des paramètres (mu1, Sigma1) et (mu2, Sigma2), avec les coefficients de mélange 0,3 et 0,7.
J'espère que cela peut vous aider.

rm(list=ls()) 
library(MASS) 
set.seed(1) 
N <- 10000 
p1 <- 0.3 
mu1 <- c(1,-1) 
Sigma1 <- matrix(c(1,0.6,0.6,2),nrow=2) 
mu2 <- c(-2,2) 
Sigma2 <- matrix(c(0.5,0.2,0.2,1),nrow=2) 

set.seed(1) 
U <- runif(N) 
X <- sapply(U, function(u) if (u<p1) mvrnorm(1,mu1,Sigma1) else mvrnorm(1,mu2,Sigma2)) 

Voici l'estimation de la densité du noyau de la distribution en deux dimensions:

bi.dens <- kde2d(X[1,], X[2,]) 
contour(bi.dens, levels = seq(0.001,0.05,length.out=10)) 

enter image description here

2

Il semble que oui. Vous pouvez chercher par

hist(rand.samples, prob = TRUE) 
curve(0.3 * dnorm(x, 1, 3) + 0.7 * dnorm(x, 2, 5), add = TRUE) 

Un code vectorisé au lieu de for boucle

U <- runif(N) 
rand.samples <- rnorm(N, ifelse(U < 0.3, 1, 2), ifelse(U < 0.3, 3, 5))