考虑下面这个模型 \( Y=5-10X+\epsilon \)
set.seed(10)
n <- 1000
x <- rnorm(n,0,5)
y <- 5-10*x+rnorm(n)
直接调用optim函数求解最优的回归系数
optim(c(beta0_1,beta1_1),function(b) sum(abs(y-b[1]-b[2]*x)))
结果最优值833.4,beta0=4.95,beta1=-9.99
然后用MM算法来求解
i=1
p0=2 #p0就是上一楼提到的p
下面是迭代过程
while(i<3000)
{
beta0_0=beta0_1
beta1_0=beta1_1
s1=s2=s3=s4=0
j=1
while(j<=n)
{
delta=y[j]-beta0_0-beta1_0*x[j]
s1=s1+sign(delta)
s2=s2+x[j]*sign(delta)
s3=s3+(1+abs(x[j])^p0)/abs(delta)
s4=s4+x[j]^2*(1+abs(x[j])^p0)/abs(delta)/abs(x[j])^p0
j=j+1
}
beta0_1=s1/s3+beta0_0
beta1_1=s2/s4+beta1_0
print(sum(abs(y-beta0_1-beta1_1*x)))
if(abs(beta0_0-beta0_1)<1e-8 && abs(beta1_1-beta1_0)<1e-8)
{
break
}
i=i+1
}
结果算法在最优值1100左右就停止迭代了,输出beta0=5.8,beta1=-10
如果我把p0设置得大点(3,5,10,……),算法会在最优值大于1100的地方就开始停止迭代。
如果p0设置得很小,大约0.2左右,那么他可以取得上面optim函数的结果。
显然p0影响了算法迭代结果。
按照MM算法的收敛定理的话,由于目标函数是凸的,且majoring函数与原函数f相等的成立条件是俩迭代值等于真实\( \beta \),(这好像不关p0什么事),MM应该收敛到最优值。实际上p0的选择不同,它却不一定能收敛到最优值,具体问题出在哪里?