nls - 收敛失败:奇异收敛(7)

6
以下的nls代码在Data2数据集中运行时会出现以下错误:Convergence failure: singular convergence (7)。但同样的代码在类似的数据集Data1中可以正常工作(对于fm1)。

对于这个数据集运行正常

Data1 <-
structure(list(D = c(0L, 0L, 0L, 0L, 5L, 5L, 5L, 5L,
10L, 10L, 10L, 10L, 15L, 15L, 15L, 15L, 20L, 20L, 20L, 20L),
    Y = c(11.6, 9.3, 10.7, 9.2, 7.8, 8, 8.6, 7.9, 7.7,
    7.6, 7.5, 7.5, 7.2, 7.3, 7, 6.5, 6.3, 5.7, 5.6, 6)), .Names = c("D",
"Y"), class = "data.frame", row.names = c(NA, 20L))

fm1  <-
  nls(
      formula=Y~w*(1-(i*D/(100*(1+i*D/A))))
    , data=Data1
    , start=list(w=13, i=3, A=80)
    , algorithm="port"
    )

无法处理此数据集

Data2 <-
structure(list(D = c(0L, 0L, 0L, 0L, 5L, 5L, 5L, 5L,
10L, 10L, 10L, 10L, 15L, 15L, 15L, 15L, 20L, 20L, 20L, 20L),
    Y = c(10.8, 10.7, 8.4, 8.5, 8, 8, 8, 7.9, 7.9, 7.2,
    7.8, 7.2, 6.6, 6.5, 6.5, 6.4, 2.2, 4.5, 4.2, 6.2)), .Names = c("D",
"Y"), class = "data.frame", row.names = 21:40)

fm2  <-
  nls(
      formula=Y~w*(1-(i*D/(100*(1+i*D/A))))
    , data=Data2
    , start=list(w=13, i=3, A=80)
    , algorithm="port"
    )
1个回答

7

我认为它在参数化方面存在问题。我们可以通过让B等于i/A,利用线性特性,.lin1=w,.lin2=i*w,这样.lin1和.lin2就可以线性进入,使用alg=plinear只需要为非线性参数设置起始值:

> fo <- Y ~ cbind(1, -D/(100*(1+B*D)))
> nls(fo, Data, start = list(B = 3/80), alg = "plinear")
Nonlinear regression model
  model: Y ~ cbind(1, -D/(100 * (1 + B * D)))
   data: Data
       B    .lin1    .lin2 
-0.02217  9.26808 13.61471 
 residual sum-of-squares: 15.76

Number of iterations to convergence: 9 
Achieved convergence tolerance: 4.236e-06

根据结果w = .lin1; i*w = .lin2(因此i = .lin2 / .lin1),B = i / A(因此A = i / B)。

修订 改进了表述。


答案明确地给出了关系。 - G. Grothendieck
你能详细解释一下吗? - MYaseen208
我已经提供了确切的方程式。除了给出确切的对应关系,还能说什么呢? - G. Grothendieck
1
使用summary(nls(...))函数来总结模型。了解转换参数的Delta方法,或者尝试使用已知解作为起始值运行模型,并对其使用summary函数。 - G. Grothendieck
不好意思,你没有提供需要翻译的内容。 请提供需要翻译的文本或URL。 - Ben Bolker
显示剩余6条评论

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