具有正确起始值的 nls 中的奇异梯度误差

机器算法验证 r 非线性回归 nls
2022-02-08 14:17:48

我正在尝试将一条线+指数曲线拟合到一些数据中。首先,我尝试在一些人工数据上做到这一点。功能是:

y=a+br(xm)+cx
它实际上是具有线性部分的指数曲线,以及附加的水平位移参数 ( m )。然而,当我使用 R 的nls()函数时,我得到了可怕的“初始参数估计时的奇异梯度矩阵”错误,即使我使用的参数与我最初用于生成数据的参数相同。
我尝试了不同的算法,不同的起始值,并尝试使用optim最小化残差平方和,但都无济于事。我读过这可能的原因可能是公式的过度参数化,但我认为不是(是吗?)
有人对这个问题有建议吗?或者这只是一个尴尬的模型?

一个简短的例子:

#parameters used to generate the data
reala=-3
realb=5
realc=0.5
realr=0.7
realm=1
x=1:11 #x values - I have 11 timepoint data
#linear+exponential function
y=reala + realb*realr^(x-realm) + realc*x
#add a bit of noise to avoid zero-residual data
jitter_y = jitter(y,amount=0.2)
testdat=data.frame(x,jitter_y)

#try the regression with similar starting values to the the real parameters
linexp=nls(jitter_y~a+b*r^(x-m)+c*x, data=testdat, start=list(a=-3, b=5, c=0.5, r=0.7, m=1), trace=T)

谢谢!

2个回答

我最近被这个咬了。我的意图是一样的,做一些人工模型并测试它。主要原因是@whuber 和@marco 给出的原因。没有识别出这种模型。要看到这一点,请记住 NLS 最小化了函数:

i=1n(yiabrximcxi)2

说它被一组参数最小化(a,b,m,r,c). 不难看出,这组参数(a,brm,0,r,c)将给出要最小化的函数的相同值。因此模型没有被识别,即没有唯一的解决方案。

也不难看出为什么梯度是奇异的。表示

f(a,b,r,m,c,x)=a+brxm+cx

然后

fb=rxm

fm=blnrrxm

我们得到了所有人x

blnrfb+fm=0.

因此矩阵

(f(x1)f(xn))

不会是满秩的,这就是为什么nls会给出奇异梯度信息的原因。

我花了一个多星期在其他地方的代码中寻找错误,直到我注意到主要错误在模型中:)

上面的答案当然是正确的。对于它的价值,除了给出的解释之外,如果您在人工数据集上尝试此操作,请参阅位于以下位置的 nls 帮助页面:http ://stat.ethz.ch/R-manual/R-patched/库/stats/html/nls.html

R 的 nls 将无法处理它。帮助页面特别指出:

警告

不要在人工“零残差”数据上使用 nls。

nls 函数使用相对偏移收敛标准,将当前参数估计的数值不精确度与残差平方和进行比较。这对表单的数据表现良好

y = f(x, θ) + eps

(var(eps)> 0)。它未能表明表格数据的收敛

y = f(x, θ)

因为该标准相当于比较舍入误差的两个分量。如果您想在人工数据上测试 nls,请添加噪声分量,如下例所示。

所以,没有噪音==对 R 的 nls 没有好处。