微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

nls() :“初始参数估计时的奇异梯度矩阵误差”

如何解决nls() :“初始参数估计时的奇异梯度矩阵误差”

我已经阅读了许多类似的问题,但仍然找不到答案。 以下是我用来校准以下等式的一些数据:

set.seed(100)
i <- sort(rexp(n = 100,rate = 0.01))
Tr <- sort(runif(n = 100,min = 5,max = 100))

k_start <- 3259
u_start <- 0.464
t0_start <- 38
n_start <- -1

i_test <- k_start*Tr^u_start * (5 + t0_start)^n_start

m <- nls(i~(k * Tr^u / (5+t0)^n),start = list(k = k_start,u = u_start,t0 = t0_start,n = n_start))

当我使用 nlsLM 并且出现同样的错误时:

nlsModel(formula,mf,start,wts) 中的错误:初始参数估计时的奇异梯度矩阵

对于起始值,我尝试使用 Python 中校准的值,但仍然出现相同的错误

还有另一种使用该等式的方法,如下所示: 然而,结果是同样的错误

d_start <- 43

m <- nls(i ~ (k * Tr^u / d),d=d_start))

当我只使用分子时,它可以工作,但这不是我需要的。 任何帮助将不胜感激。

解决方法

在第一个 nls 中,右手边仅通过 k / (5+t0)^n 所以它被过度参数化,因为一个参数可以表示 它们的综合作用。在第二个 nls 中,右侧仅取决于 在 k 和 d 到 k / d 上,问题再次被过度参数化并且 一个参数可以代表它们的组合效果。

去除多余的参数并使用它收敛的线性模型获取起始值。

fit.lm <- lm(log(i) ~ log(Tr))
co <- coef(fit.lm)
fit <- nls(i ~ k * Tr ^ u,start = list(k = exp(co[[1]]),u = co[[2]]))
fit
## Nonlinear regression model
##   model: i ~ k * Tr^u
##    data: parent.frame()
##         k         u 
## 0.0002139 3.0941602 
##  residual sum-of-squares: 79402
##
## Number of iterations to convergence: 43 
## Achieved convergence tolerance: 5.354e-06

互惠模型

下面我们拟合了一个“倒数模型”,该模型具有相同数量的参数,但通过作为残差平方和的偏差衡量的拟合更好。较低的值意味着更适合。

# reciprocal model
fit.recip <- nls(i ~ 1/(a + b * log(Tr)),start = list(a = 1,b = 1))

deviance(fit)
## [1] 79402.17
deviance(fit.recip)
## [1] 25488.1

图形

下面我们绘制了 fit(红色)和 fit.recip(蓝色)模型。

plot(i ~ Tr)
lines(fitted(fit) ~ Tr,col = "red")
lines(fitted(fit.recip) ~ Tr,col = "blue")
legend("topleft",legend = c("fit","fit.recip"),lty = 1,col = c("red","blue"))

(剧情后续) screenshot

线性

请注意,plinear 算法可用作拟合上述 fit 模型的替代算法,以避免必须为 k 提供起始值。它还具有额外的好处,即在这种情况下它需要的迭代次数要少得多(14 对 45)。对于 plinear,公式应省略线性参数 k,因为它是由算法隐含的,并将报告为 .lin

nls(i ~ Tr ^ u,start = list(u = co[[2]]),algorithm = "plinear")
## Nonlinear regression model
##   model: i ~ Tr^u
##    data: parent.frame()
##         u      .lin 
## 3.0941725 0.0002139 
##  residual sum-of-squares: 79402
##
## Number of iterations to convergence: 14 
## Achieved convergence tolerance: 3.848e-06

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。