1

我正在尝试进行递归 nls 估计。然而,由于 ?structural 破坏了函数,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]))))
4

2 回答 2

2

如果您的主要问题是在发生错误时如何继续循环,请查看?try?trycatch查看如何测试每个调用并报告失败,而不会使循环本身nls崩溃。for您可以输入诊断信息以识别例如哪些i收敛值失败。

于 2013-05-13T12:52:43.257 回答
1

当我使用 nlm(类似于 optim(),并且可能有点类似于 nls())时,我在引导循环中使用以下代码:

tryCatch(nlm(NLL_Function, ...), error=function(e){NA})

这样它只会返回一个 NA 而不是抛出错误并导致整个程序崩溃。这基本上是@Carl Witthoft 所建议的。

我承认我对 nls() 不是很熟悉,但就像我说的,我认为这是一种优化方法。如果确实如此,也许您可​​以使用另一种优化算法。R 中的optim()函数是几个算法的包装器。如果您无法陷入局部最小值(对于最小化问题),那么模拟退火optim(..., method="SANN")可能是一个很好的尝试方法 --- 它需要周期性地大幅跳跃(我认为这是通过参数空间的 Lévy 飞行),所以它可能不太可能被卡住。

当然,我的建议涉及重写代码以使用您自己的损失函数(例如,最大似然)。如果你不能让 nls() 工作,也许值得一试。

祝你好运。

于 2013-05-13T13:10:49.150 回答