我需要帮助拟合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
答案 0 :(得分:2)
st
以下是您的起始值,除了我们使用Epsup=1
以避免退化为0. fo
是公式。为了防止将负数增加到某个权限,我们将Epsup
替换为sqrt(Epsup^2)
,同样替换为Epsdn
- 这增加了假设Epsup
和Espdn
不能负。 (这与使用abs(Epsup)
相同;但是,nlxb在其派生表中没有abs
。)接下来使用nls2
在边界{{1}之间的网格上生成值}和st/10
。 10*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
注意:我们使用了这个输入:
fit.nlxb.nls <- nls2(fo, start = coef(fit.nlxb))
plot(y ~ x)
lines(fitted(fit.nlxb.nls) ~ x)