R:研究非线性回归中的奇异梯度

R: investigating singular gradient in non-linear regression

library(nls2)
# Investigate singular gradient.
# Note that this cannot be done with nls since the singular gradient at
# the initial conditions would stop it with an error.
DF1 <- data.frame(y=1:9, one=rep(1,9))
xx <- nls2(y~(a+2*b)*one, DF1, start = c(a=1, b=1), algorithm = "brute-force")
svd(xx$m$Rmat())[-2]

我正在使用 nls2 包,它确定非线性回归的非线性最小二乘估计。在文档中,其中一个示例(如上所示)指出它正在研究奇异梯度。我看到 xx 是一个没有参数估计的 nls 对象。这是否意味着算法没有收敛?为什么是这样? svd(xx$m$Rmat())[-2] 到底在做什么?

没有暴力收敛的概念。它只是根据给定的起始值或给定值计算 objective 函数,并根据特定参数计算 returns 一个或多个 nls 对象。有关详细信息,请参阅 ?nls2

通常它用于获取输入到 nls 或其他优化函数的起始值,用于研究奇异值(因为 nls 阻塞它们但 nls2 不阻塞)或简单地评估 nls objective 以已知值运行。

由于问题中复制的文档中的示例为 nls2 提供了一个起始值,因此它在该单个值处评估了 objective 并返回。参数估计值只是对其进行评估的参数值,即起始值。

> coef(xx)
a b 
1 1 

xx$m$Rmat() 是一个矩阵,如果问题在计算点处是奇异的,则其奇异值向量至少包含一个零。 R 函数 svd(...) returns 一个列表,其中分量 d 是奇异值向量,u 和 v 是接下来的两个分量,v 是特征向量。我们这里对你不感兴趣,所以用[-2]来省略它。

对于这种特殊情况,我们看到第二个奇异值为零:

s <- sv(xx$m$Rmat)
s$d
## [1] 6.708204 0.000000

对应特征向量

v2 <- s$v[, 2]; v2
## [1] -0.8944272  0.4472136

并且由于特征向量仅确定为与以下相同的标量倍数:

v2/v2[2]
## [1] -2  1

这是当前评估点的奇点方向。在这种情况下,将 (-2, 1) 的任意倍数添加到 (1, 1) 得到的 RHS 的值与 (1, 1) 处的 RHS 相同,因此它在该方向上显然是奇异的。由于 RHS 的线性,在这种情况下它比一般情况更简单,但它相对于切线 space 的工作方式类似,即无限小,对于非线性 objective 函数。