R - 初始参数估计的奇异梯度矩阵
R - Singular gradient matrix at initial parameter estimates
我正在尝试将调和方程拟合到我的数据中,但是当我应用 nls
函数时,R 给出了以下错误:
Error in nlsModel(formula, mf, start, wts) : singular gradient matrix at initial parameter estimates.
我看到的所有与此错误相关的帖子都是指数函数,其中使用线性化来修复此错误,但在这种情况下,我无法通过这种方式解决它。我尝试使用其他起点,但仍然无法正常工作。
代码:
y <- c(20.91676, 20.65219, 20.39272, 20.58692, 21.64712, 23.30965, 23.35657, 24.22724, 24.83439, 24.34865, 23.13173, 21.96117)
t <- c(1, 2, 3, 4 , 5 , 6, 7, 8, 9, 10, 11, 12)
# Fitting function
fit <- function(x, a, b, c) {a+b*sin(2*pi*x)+c*cos(2*pi*x)}
res <- nls(y ~ fit(t, a, b, c), data=data.frame(t,y), start = list(a=1,b=0, c=1))
你能帮帮我吗?谢谢!
有几个问题:
cos(2*pi*t)
是问题中给出的 t
的所有矢量,因此模型无法识别,因为已经有截距
模型的参数是线性的,因此可以使用 lm
而不是 nls
并且不需要起始值
即使我们解决了第二大系数所见的那些点,模型也无法正常工作。改进模型。
lm(y ~ sin(2*pi*t))
给予:
Call:
lm(formula = y ~ sin(2 * pi * t))
Coefficients:
(Intercept) sin(2 * pi * t)
2.195e+01 -2.262e+14
改为使用 plinear 算法尝试此模型,该算法不需要线性输入参数的起始值。这实现了模型 .lin1 + .lin2 * cos(a * t + b)
,其中 .lin1 和 .lin2 参数是线性输入的隐式参数,不需要起始值。
fm <- nls(y ~ cbind(1, cos(a * t + b)), start = list(a = 1, b = 1), alg = "plinear")
plot(y ~ t)
lines(fitted(fm) ~ t, col = "red")
fm
给予:
Nonlinear regression model
model: y ~ cbind(1, cos(a * t + b))
data: parent.frame()
a b .lin1 .lin2
0.5226 4.8814 22.4454 -2.1530
residual sum-of-squares: 0.7947
Number of iterations to convergence: 9
Achieved convergence tolerance: 8.865e-06
我正在尝试将调和方程拟合到我的数据中,但是当我应用 nls
函数时,R 给出了以下错误:
Error in nlsModel(formula, mf, start, wts) : singular gradient matrix at initial parameter estimates.
我看到的所有与此错误相关的帖子都是指数函数,其中使用线性化来修复此错误,但在这种情况下,我无法通过这种方式解决它。我尝试使用其他起点,但仍然无法正常工作。
代码:
y <- c(20.91676, 20.65219, 20.39272, 20.58692, 21.64712, 23.30965, 23.35657, 24.22724, 24.83439, 24.34865, 23.13173, 21.96117)
t <- c(1, 2, 3, 4 , 5 , 6, 7, 8, 9, 10, 11, 12)
# Fitting function
fit <- function(x, a, b, c) {a+b*sin(2*pi*x)+c*cos(2*pi*x)}
res <- nls(y ~ fit(t, a, b, c), data=data.frame(t,y), start = list(a=1,b=0, c=1))
你能帮帮我吗?谢谢!
有几个问题:
cos(2*pi*t)
是问题中给出的t
的所有矢量,因此模型无法识别,因为已经有截距模型的参数是线性的,因此可以使用
lm
而不是nls
并且不需要起始值即使我们解决了第二大系数所见的那些点,模型也无法正常工作。改进模型。
lm(y ~ sin(2*pi*t))
给予:
Call:
lm(formula = y ~ sin(2 * pi * t))
Coefficients:
(Intercept) sin(2 * pi * t)
2.195e+01 -2.262e+14
改为使用 plinear 算法尝试此模型,该算法不需要线性输入参数的起始值。这实现了模型 .lin1 + .lin2 * cos(a * t + b)
,其中 .lin1 和 .lin2 参数是线性输入的隐式参数,不需要起始值。
fm <- nls(y ~ cbind(1, cos(a * t + b)), start = list(a = 1, b = 1), alg = "plinear")
plot(y ~ t)
lines(fitted(fm) ~ t, col = "red")
fm
给予:
Nonlinear regression model
model: y ~ cbind(1, cos(a * t + b))
data: parent.frame()
a b .lin1 .lin2
0.5226 4.8814 22.4454 -2.1530
residual sum-of-squares: 0.7947
Number of iterations to convergence: 9
Achieved convergence tolerance: 8.865e-06