我有一个mle2
模型,我在这里开发只是为了演示问题。我从两个独立的高斯分布x1
和x2
生成值,将它们组合在一起形成x=c(x1,x2)
,然后创建一个MLE,尝试将x
值重新归类为属于值的左侧特定值或特定x
值的右侧通过xsplit
数据表。高斯混合模型与mle2 /优化
问题是发现的参数并不理想。特别是,xsplit
总是返回,因为它的起始值是什么。如果我改变它的初始值(例如,4或9),那么结果的对数似然差异很大。
这里是完全重复的例子:
set.seed(1001)
library(bbmle)
x1 = rnorm(n=100,mean=4,sd=0.8)
x2 = rnorm(n=100,mean=12,sd=0.4)
x = c(x1,x2)
hist(x,breaks=20)
ff = function(m1,m2,sd1,sd2,xsplit) {
outs = rep(NA,length(xvals))
for(i in seq(1,length(xvals))) {
if(xvals[i]<=xsplit) {
outs[i] = dnorm(xvals[i],mean=m1,sd=sd1,log=T)
}
else {
outs[i] = dnorm(xvals[i],mean=m2,sd=sd2,log=T)
}
}
-sum(outs)
}
# change xsplit starting value here to 9 and 4
# and realize the difference in log likelihood
# Why isn't mle finding the right value for xsplit?
mo = mle2(ff,
start=list(m1=1,m2=2,sd1=0.1,sd2=0.1,xsplit=9),
data=list(xvals=x))
#print mo to see log likelihood value
mo
#plot the result
c=coef(mo)
m1=as.numeric(c[1])
m2=as.numeric(c[2])
sd1=as.numeric(c[3])
sd2=as.numeric(c[4])
xsplit=as.numeric(c[5])
leftx = x[x<xsplit]
rightx = x[x>=xsplit]
y1=dnorm(leftx,mean=m1,sd=sd1)
y2=dnorm(rightx,mean=m2,sd=sd2)
points(leftx,y1*40,pch=20,cex=1.5,col="blue")
points(rightx,y2*90,pch=20,cex=1.5,col="red")
如何修改我的mle2捕捉到正确的参数,专门为xsplit
?
为什么它的价值,这是一个优化问题,而不是特别是一个'mle2'问题; 'mle2'只是包装'optim'函数。 **众所周知的混合模型很难拟合 - 为它们开发了许多专用优化算法。 –
如果mle2包装了优化函数,那么我不明白为什么它解释了这是失败的原因,因为在引擎盖下它做的很好。 – CodeGuy
通过使用'nls'来适应排序'a1 * exp(-x^2/b1)+ a2 * exp(-x^2/b2)'的函数,然后将数据分类为这两位高斯的相对幅度? (当瑞利标准没有得到很好的满足时,这当然不会奏效) –