我有一個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)'的函數,然後將數據分類爲這兩位高斯的相對幅度? (當瑞利標準沒有得到很好的滿足時,這當然不會奏效) –