R:NLS doens和#x27;不能适当地收敛

R:NLS doens和#x27;不能适当地收敛,r,R,我正在尝试做一个递归nls估计。然而,由于函数的结构断裂,nls对大多数样本不收敛。因此,代码会中断。 如何使用R克服这个问题?ie使用不同的起始值,并动态或自动选择?如果有错误,继续下一个样本大小 此外,是否有可能看到哪个样本存在这种非收敛性,并将其存储?代码如下: Scaling=0.1175962 start=475 end=774 expandalfa0=matrix(nrow=length(PPPrate)-start+1,ncol=1) expandalfa1=matrix(n

我正在尝试做一个递归nls估计。然而,由于函数的结构断裂,nls对大多数样本不收敛。因此,代码会中断。 如何使用R克服这个问题?ie使用不同的起始值,并动态或自动选择?如果有错误,继续下一个样本大小

此外,是否有可能看到哪个样本存在这种非收敛性,并将其存储?代码如下:

   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]))))

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

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

tryCatch(nlm(NLL_函数,…),error=Function(e){NA})

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

我承认我对nls()不太熟悉,但正如我所说,我认为这是一种优化方法。如果确实是这样,也许您可以使用另一种优化算法。R中的
optim()
函数是几种算法的包装器。如果你在陷入局部极小值(对于最小化问题)时遇到困难,那么模拟退火
optim(…,method=“SANN”)
可能是一个很好的尝试方法——它会周期性地进行大跳跃(我认为这是一次通过参数空间的快速飞行),因此它不太可能陷入困境

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


祝你好运。

是的,这是最主要的问题。另一个问题是如何选择这些起始值。嗯,选择初始值几乎是一门黑色艺术。除非你知道局部极值在哪里:-)。