R:NLS doens't不会收敛

问题描述:

我正在尝试做递归nls估计。然而,由于?结构性中断,nls对大多数样本不起作用。比代码中断。 我怎样才能克服这个使用R?即使用不同的起始值,并动态或自动选择它?如果出现错误,请继续下一个样本量。R:NLS doens't不会收敛

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

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呼叫并没有崩溃的for循环本身报告失败。您可以输入诊断信息来确定(例如)收敛失败的值。

+0

是的,这是主要关心的问题。其他问题是如何选择这些起始值 – user2298382 2013-05-13 13:12:12

+0

那么,选择初始值接近黑色艺术。除非你有一个好主意,当地的极值是:-)。 – 2013-05-13 15:06:42

当我使用NLM(类似的Optim(),也可能有点类似于NLS()),我用下面的代码在我的引导循环:

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

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

我承认我对nls()并不熟悉,但正如我所说的,我认为这是一种优化方法。如果确实如此,也许你可以利用另一种优化算法。 R中的optim()函数是几种算法的封装。如果遇到困难局部最小化问题(用于最小化问题),那么模拟退火optim(..., method="SANN")可能是一个很好的尝试方法 - 周期性地进行大跳转(我认为这是一个通过参数空间的Lévy飞行),所以它可能不太可能卡住。

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

祝你好运。