R:NLS没有正确收敛

时间:2013-05-13 12:37:13

标签: r

我正在尝试进行递归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]))))

2 个答案:

答案 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()工作,也许值得尝试。

祝你好运。

相关问题