我正在尝试进行递归nls估计。然而,由于结构破坏,nls对于大多数样品而言不会收敛。所以比代码中断。 我怎么能用R来克服这个?即使用不同的起始值,并动态或自动选择?如果出现错误,请继续使用下一个样本量。
此外,是否可以看到哪个样本存在这种非收敛并存储?代码如下:
Scaling=0.1175962
start=475
end=774
expandalfa0=matrix(nrow=length(PPPrate)-start+1,ncol=1)
expandalfa1=matrix(nrow=length(PPPrate)-start+1,ncol=1)
expandalfa2=matrix(nrow=length(PPPrate)-start+1,ncol=1)
expandalfa3=matrix(nrow=length(PPPrate)-start+1,ncol=1)
for (i in start:length(PPPrate)){
tempSpread=Spread[1:i-1]
tempPPPrate=PPPrate[1:i-1]
nlsresults=nls(tempPPPrate ~ Scaling*(alfa0+(alfa1/(1+exp(alfa2+alfa3*tempSpread)))),
data=tempdata,
start=list(alfa0=0.003,alfa1=0.014,alfa2=4.1,alfa3=-147),trace=TRUE,weights=weightnotional[1:i-1])
Paraexpand=summary(nlsresults)$parameters
expandalfa0[i-start+1]=Paraexpand[1,1]
expandalfa1[i-start+1]=Paraexpand[2,1]
expandalfa2[i-start+1]=Paraexpand[3,1]
expandalfa3[i-start+1]=Paraexpand[4,1]
alfa0=Paraexpand[1,1]
alfa1=Paraexpand[2,1]
alfa2=Paraexpand[3,1]
alfa3=Paraexpand[4,1]
alfa4=Paraexpand[5,1]
alfa5=Paraexpand[6,1]
}
expandforecast=Scaling*(expandalfa0+(expandalfa1/(1+exp(expandalfa2+expandalfa3*Spread[start:end]))))
答案 0 :(得分:2)
如果您的主要问题是如何在发生错误时继续循环,请查看?try
和?trycatch
以了解如何测试每个nls
来电和报告失败而不会导致{ {1}}循环本身。您可以输入诊断信息以识别for
收敛失败的值。
答案 1 :(得分:1)
当我使用nlm(类似于optim(),并且可能有点类似于nls())时,我在自举循环中使用以下代码:
tryCatch(nlm(NLL_Function, ...), error=function(e){NA})
这样它只返回NA而不是抛出错误并导致整个程序崩溃。这基本上就是@Carl Witthoft所建议的。
我承认我对nls()并不十分熟悉,但就像我说的那样,我认为这是一种优化方法。如果确实如此,也许您可以使用另一种优化算法。 R中的optim()
函数是几种算法的包装器。如果您在陷入局部最小值时遇到困难(对于最小化问题),那么模拟退火optim(..., method="SANN")
可能是一种很好的尝试方法 - 它会定期进行大跳跃(我认为这是一次Lévy飞行参数空间),因此可能不太可能卡住。
当然,我的建议是重写您的代码以使用您自己的损失函数(例如,最大可能性)。如果你不能让nls()工作,也许值得尝试。
祝你好运。