拟合R中的多峰分布; 从拟合分布中生成新值

avg*_*avg 4 r distribution random-sample mixed-models

我正在使用小样本数据:

>dput(dat.demand2050.unique)  
c(79, 56, 69, 61, 53, 73, 72, 86, 75, 68, 74.2, 80, 65.6, 60, 54)    
Run Code Online (Sandbox Code Playgroud)

其密度分布如下:
pdf数据

我知道这些值来自两个方案 - 低和高 - 并且假设基础过程是正常的,我使用该mixtools包来拟合双峰分布:

set.seed(99)  
dat.demand2050.mixmdl <- normalmixEM(dat.demand2050.unique, lambda=c(0.3,0.7), mu=c(60,70), k=2)
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果:
在此输入图像描述
(实线是拟合曲线,虚线是原始密度).

# get the parameters of the mixture
dat.demand2050.mixmdl.prop <- dat.demand2050.mixmdl$lambda    #mix proportions
dat.demand2050.mixmdl.means <- dat.demand2050.mixmdl$mu    #modal means
dat.demand2050.mixmdl.dev <- dat.demand2050.mixmdl$sigma   #modal std dev  
Run Code Online (Sandbox Code Playgroud)

混合参数是:

>dat.demand2050.mixmdl.prop  #mix proportions  
[1] 0.2783939 0.7216061  
>dat.demand2050.mixmdl.means  #modal means  
[1] 56.21150 73.08389  
>dat.demand2050.mixmdl.dev  #modal std dev  
[1] 3.098292 6.413906 
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

  1. 要生成一组近似于基础分布的新值,我的方法是正确的还是有更好的工作流程?
  2. 如果我的方法是正确的,我如何使用此结果从此混合分布生成一组随机值?

Hon*_*Ooi 6

您的样本量对于拟合混合物有点不确定,但不要紧.您可以按照以下方式从装配的混合物中取样:

probs <- dat.demand2050.mixmdl$lambda
m <- dat.demand2050.mixmdl$mu
s <- at.demand2050.mixmdl$sigma

N <- 1e5
grp <- sample(length(probs), N, replace=TRUE, prob=probs)
x <- rnorm(N, m[grp], s[grp])
Run Code Online (Sandbox Code Playgroud)