使用 nls 函数产生奇异梯度
Working with nls function produces a singular gradient
我想使用 nls
函数将非线性最小二乘模型拟合到我的数据中,但出现错误:
我的数据是:
y=c(0.3,1.5,4.1,10.1,21.9,39,4,58.2,77,89.6,95,98.3,100)
x=c(30,35,40,45,50,55,60,65,70,75,80,85,90)
我使用了以下 R 命令:
fit<-nls(y~a/(1+exp(-b*(x-c))), start=list(a=1,b=0.5,c=25))
好像开始的时候出了问题,但不确定。
这里有几种方法:
1) nls 需要更好的起始值。首先取双方的倒数并使用不需要线性参数起始值的 "plinear"
算法,在本例中为 a
。然后将其用作适合您的起始值。
fit0 <- nls(1/y ~ 1 + exp(-b*(x-c)), start = list(b = .5, c = 25), alg = "plinear")
fit <- nls(y~1/(1+exp(-b*(x-c))),start=coef(fit0)[1:2], alg = "plinear")
plot(y ~ x)
lines(fitted(fit) ~ x)
fit
给予:
Nonlinear regression model
model: y ~ 1/(1 + exp(-b * (x - c)))
data: parent.frame()
b c .lin
0.1355 64.9761 106.7095
residual sum-of-squares: 1516
Number of iterations to convergence: 13
Achieved convergence tolerance: 6.85e-06
2) nls/SSlogis R 提供了SSlogis
自启动模型。不需要起始值。请注意,它是参数化的,因此 b = 1/B.
nls(y ~ SSlogis(x, a, c, B))
给予:
Nonlinear regression model
model: y ~ SSlogis(x, a, c, B)
data: parent.frame()
a c B
106.71 64.98 7.38
residual sum-of-squares: 1516
Number of iterations to convergence: 2
Achieved convergence tolerance: 4.087e-06
3) drc drc 包也可以适应这个并提供自己的起始值。参数名称与下面的b、d、e不同,对应问题中的-b、a、c。
library(drc)
fm <- drm(y ~ x, fct = L.3())
plot(fm)
fm
给予:
A 'drc' model.
Call:
drm(formula = y ~ x, fct = L.3())
Coefficients:
b:(Intercept) d:(Intercept) e:(Intercept)
-0.1355 106.7093 64.9761
我想使用 nls
函数将非线性最小二乘模型拟合到我的数据中,但出现错误:
我的数据是:
y=c(0.3,1.5,4.1,10.1,21.9,39,4,58.2,77,89.6,95,98.3,100)
x=c(30,35,40,45,50,55,60,65,70,75,80,85,90)
我使用了以下 R 命令:
fit<-nls(y~a/(1+exp(-b*(x-c))), start=list(a=1,b=0.5,c=25))
好像开始的时候出了问题,但不确定。
这里有几种方法:
1) nls 需要更好的起始值。首先取双方的倒数并使用不需要线性参数起始值的 "plinear"
算法,在本例中为 a
。然后将其用作适合您的起始值。
fit0 <- nls(1/y ~ 1 + exp(-b*(x-c)), start = list(b = .5, c = 25), alg = "plinear")
fit <- nls(y~1/(1+exp(-b*(x-c))),start=coef(fit0)[1:2], alg = "plinear")
plot(y ~ x)
lines(fitted(fit) ~ x)
fit
给予:
Nonlinear regression model
model: y ~ 1/(1 + exp(-b * (x - c)))
data: parent.frame()
b c .lin
0.1355 64.9761 106.7095
residual sum-of-squares: 1516
Number of iterations to convergence: 13
Achieved convergence tolerance: 6.85e-06
2) nls/SSlogis R 提供了SSlogis
自启动模型。不需要起始值。请注意,它是参数化的,因此 b = 1/B.
nls(y ~ SSlogis(x, a, c, B))
给予:
Nonlinear regression model
model: y ~ SSlogis(x, a, c, B)
data: parent.frame()
a c B
106.71 64.98 7.38
residual sum-of-squares: 1516
Number of iterations to convergence: 2
Achieved convergence tolerance: 4.087e-06
3) drc drc 包也可以适应这个并提供自己的起始值。参数名称与下面的b、d、e不同,对应问题中的-b、a、c。
library(drc)
fm <- drm(y ~ x, fct = L.3())
plot(fm)
fm
给予:
A 'drc' model.
Call:
drm(formula = y ~ x, fct = L.3())
Coefficients:
b:(Intercept) d:(Intercept) e:(Intercept)
-0.1355 106.7093 64.9761