首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nls -收敛失败:奇异收敛(7)

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

Stack Overflow用户
提问于 2014-03-06 15:49:51
回答 1查看 7.5K关注 0票数 6

下面的nls代码为fm2抛出以下错误Convergence failure: singular convergence (7) (用于Data2)。但是,对于类似的数据集,相同的代码可以正常工作(fm1用于Data1)。

适用于此数据集

代码语言:javascript
复制
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"
    )

不适用于此数据集

代码语言:javascript
复制
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"
    )
EN

回答 1

Stack Overflow用户

发布于 2014-03-06 16:03:41

我觉得你的参数化有问题。我们可以通过让B为i/A、.lin1 =w和.lin2 = i*w来利用线性特性,在这种情况下,.lin1和.lin2线性地进入,并且使用alg=plinear只需要一个起始值:

代码语言:javascript
复制
> 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 (so i= .lin2 / .lin1)和B= i/A (so A= i/B)。

修订后的提法得到改进。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22229352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档