在nls中处理0错误 - R脚本

Sta*_*nLe 3 r nonlinear-functions nls

有没有办法让我的nls在非线性拟合时有0个残差?在我的数据中有一些情况,其中拟合应该有0错误,但是nls总是失败并且吐出错误.

谁能告诉我:

  1. 如何测试这是否是由nls吐出的错误?
  2. 如何允许0个错误案例?(完美契合)

这是我的nls电话:

fit <- nls(y ~ ifelse(g, m1 * (x - x0) + y0, m2 * (x - x0) + y0),
            start = c(m1 = -1, m2 = 1, y0 = 0, x0 = split),
            algorithm = "port",
            lower = c(m1 = -Inf, m2 = -Inf, y0 = -Inf, x0 = split),
            upper = c(m1 = Inf, m2 = Inf, y0 = Inf, x0 = (split+1)),
            data=data.frame(x,y))
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 6

至于提到的在前面的回答,?nls 明确规定,你不应该使用nls为0的错误数据.要直接引用您正在使用的功能的帮助文件:

不要在人工"零残留"数据上使用nls.

nls函数使用相对偏移收敛标准,该标准将当前参数估计的数值不精确度与残差平方和进行比较.这在表单数据上表现良好

y = f(x,θ)+ eps

(var(eps)> 0).它无法表明表格数据的趋同

y = f(x,θ)

因为该标准相当于比较舍入误差的两个分量.如果您希望在人工数据上测试nls,请添加噪声分量,如下例所示.

一个有潜在危险的选择是使用warnOnly = TRUE强制nls在收敛之前返回仅警告(无错误):

x <- -(1:100)/10
y <- 100 + 10 * exp(x / 2)
nlmod <- nls(y ~  Const + A * exp(B * x),control = nls.control(warnOnly = TRUE))
Run Code Online (Sandbox Code Playgroud)

上面的例子也几乎直接来自?nls.