nls - 收敛失败:奇异收敛(7) [英] nls - Convergence failure: singular convergence (7)

查看:75
本文介绍了nls - 收敛失败:奇异收敛(7)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

The following nls code throws the following error Convergence failure: singular convergence (7) for fm2(for Data2). But the same code for similar dataset works fine (fm1 for Data1).

适用于此数据集

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"
    )

推荐答案

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

I think its having problems with your parameterization. We can take advantage of linearlity by letting B be i/A, .lin1 = w and .lin2 = i*w in which case .lin1 and .lin2 enter linearly and using alg=plinear only the non-linear parameter needs a starting value:

> 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).

From the result w = .lin1; i*w = .lin2 (so i = .lin2 / .lin1) and B = i/A (so A = i/B).

REVISED 改进了公式.

这篇关于nls - 收敛失败:奇异收敛(7)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆