【问题标题】:NLS Curve Fit Singular matrix errorNLS 曲线拟合奇异矩阵误差
【发布时间】:2017-07-19 13:45:26
【问题描述】:

我需要帮助来拟合 nls 并找到不会导致奇异矩阵的初始估计。我将非常感谢任何帮助。

via_data$Concentration <- c(0.197, 0.398, 0.792, 1.575,
                            3.154, 6.270, 12.625, 25.277,
                            25.110, 49.945, 74.680)
via_data$Viability <- c(100, 94.62, 96.21, 87.53, 
                        80,  62.22,  39.11, 
                        30.80,  30, 22, 2.56) 
x <- via_data$Concentration
y <- via_data$Viability
fit <- nls(y ~((1/(1+Epsup/x)^Bup)*(1/(1+Epsdn/x)^Bdn)), start=list(Epsup=0, Bup=1, Epsdn=10, Bdn=-5), trace=T)

Error in nlsModel(formula, mf, start, wts) : 
  singular gradient matrix at initial parameter estimates

谢谢, 克里纳

【问题讨论】:

  • 您的公式与y ~ 1/(1+Epsup/x)^(Bup+Bdn) 相同,因此您只能估计Bup+Bdn。同样相同:y ~ (1+Epsup/x)^(-Bup-Bdn)
  • 这和stackoverflow.com/questions/34201377/… 不是同一个问题。在那个问题中,问题是过度参数化。这个问题通常不会过度参数化,但只有在Epsup = Epsdn 或任何参数接近零的情况下,以及我们必须确保1+Epsup/x1+Epsdn/x 保持正数的问题。因此,如果我们能找到足够好的起始值以远离这些糟糕的区域,它就可以解决......

标签: r curve-fitting nls


【解决方案1】:

st 下方是您的起始值,但我们使用 Epsup=1 来避免 0 处的退化。fo 是公式。为了防止将负数提高到幂,我们将Epsup 替换为sqrt(Epsup^2)Epsdn 类似——这增加了EpsupEspdn 不能为负数的假设。 (这与使用abs(Epsup) 相同;但是,nlxb 在其派生表中没有abs。)接下来使用nls2 在边界st/1010*st 之间的网格上生成值。 nls2 将生成这些并返回一个 "nls" 对象,其中包含找到的最佳对象。现在使用它作为 nlmrt 包的nlxb 的起始值。它比nls 更好地处理难题。 nlxb 不返回 "nls" 对象(虽然包确实有 wrapnls 运行 nlxb 后跟 nls 但是我们没有从 nlxb 获得直接输出)所以通过 @ 987654346@ 再次创建一个"nls" 对象,允许我们使用fitted 方法。我们绘制结果拟合。

library(nlmrt)
library(nls2)

st <- c(Epsup=1, Bup=1, Epsdn=10, Bdn=-5)
fo <- y ~ (1/(1+sqrt(Epsup^2)/x)^Bup)*(1/(1+sqrt(Epsdn^2)/x)^Bdn)

fit.nls2 <- nls2(fo, start = data.frame(rbind(st/10, 10*st)), alg = "brute")
fit.nlxb <- nlxb(fo, data = data.frame(x, y), start = coef(fit.nls2))

给出以下内容:

> fit.nlxb
nlmrt class object: x 
residual sumsquares =  171.2  on  11 observations
    after  19    Jacobian and  25 function evaluations
  name            coeff          SE       tstat      pval      gradient    JSingval   
Epsup            10.7464         10.95     0.9814     0.3591   6.855e-05        1584  
Bup              1.15049        0.5928      1.941    0.09345    0.001839       120.2  
Epsdn            642.754         908.5     0.7075     0.5021  -1.298e-06       1.406  
Bdn             -1.13885        0.6315     -1.804     0.1143    0.004964    0.005443 

并进行绘图以直观地评估拟合度:

fit.nlxb.nls <- nls2(fo, start = coef(fit.nlxb))
plot(y ~ x)
lines(fitted(fit.nlxb.nls) ~ x)

注意:我们使用了这个输入:

via_data <- data.frame(Concentration = c(0.197, 0.398, 0.792, 1.575,
     3.154, 6.270, 12.625, 25.277, 25.110, 49.945, 74.680),
Viability = c(100, 94.62, 96.21, 87.53, 80,  62.22,  39.11, 
                        30.80,  30, 22, 2.56))
x <- via_data$Concentration
y <- via_data$Viability

【讨论】:

  • 非常有帮助。谢谢
猜你喜欢
  • 2021-07-10
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2016-12-20
  • 2013-07-08
  • 2014-08-27
  • 2016-02-02
相关资源
最近更新 更多