NLS曲线拟合奇异矩阵错误

时间:2017-02-28 14:24:43

标签: r curve-fitting nls

我需要帮助拟合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

感谢, Krina

1 个答案:

答案 0 :(得分:2)

st以下是您的起始值,除了我们使用Epsup=1以避免退化为0. fo是公式。为了防止将负数增加到某个权限,我们将Epsup替换为sqrt(Epsup^2),同样替换为Epsdn - 这增加了假设EpsupEspdn不能负。 (这与使用abs(Epsup)相同;但是,nlxb在其派生表中没有abs。)接下来使用nls2在边界{{1}之间的网格上生成值}和st/1010*st将生成这些并返回nls2个对象,找到最好的对象。现在使用它作为nlmrt包的"nls"的起始值。它处理比nlxb更难的问题。 nls不会返回nlxb个对象(尽管该包有"nls"运行wrapnls后跟nlxb但是我们没有获得直接输出来自nls),然后通过nlxb再次提供,以创建nls2对象,以便我们使用"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 

screenshot

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

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