在`nls`中捕获错误

6

我正在使用nls来拟合一些指数数据。

我使用的代码是:

fit <- nls(y ~ expFit(times, A, tau, C), start = c(A=100, tau=-3, C=0))

expFit 的定义如下:

expFit <- function(t, A, tau, C)
    {
    expFit <- A*(exp(-t/tau))+C
    }

对于大多数数据,初始参数(100、-3和0)表现良好。但有时候,我的某些数据与这些参数不兼容,会导致nls出错(例如“奇异梯度”等)。我该如何“捕捉”这些错误?
我尝试了以下方法:
fit <- NULL
fit <- nls(...)

if (is.null(fit))
    {
    // Try nls with other starting parameters
    }

但这样做行不通,因为nls似乎会停止执行,nls后面的代码将不会执行...有什么想法吗?谢谢nico
1个回答

12

我通常使用这个技巧:

params<-... # setup default params.

while(TRUE){

fit<-NULL
try(fit<-nls(...)); # does not stop in the case of error

if(!is.null(fit))break; # if nls works, then quit from the loop

params<-... # change the params for nls

}

太好了!那正是我所需要的!我刚刚添加了一个“silent="TRUE"”参数到try中,这样我就不会得到错误输出了。 - nico
@kohske,你的回答逻辑很有道理。了解try命令很有用,但我期望在你的帖子第四行看到一个nls调用,并且对出现在那里的nul函数不熟悉。在这里进行快速搜索没有帮助我找到nul的作用。你有什么提示可以告诉我在哪里找到更多信息吗?也许我不知道应该要求哪个包? - Jason Whyte
@JasonWhyte 这只是一个打错字。我想表达的是 try(fit <- nls(...)) ,当 nls 出现错误时,fit 将为 NULL。 - kohske
@kohske 感谢您的澄清。我曾经试图使用上述解决方案,但使用nls(而不是nul)在某些情况下仍然无法帮助我,因为nls拟合似乎陷入了循环中。后来我发现我正在处理完全不同类型的nls错误,这种错误并不会返回任何错误信息。我很快就会记录下来。 - Jason Whyte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接