在 R 中使用 nls 时出现以下错误。我想将 sigmoid 函数拟合到我的数据中。 Y为0.01至1且x为0.1至-3。我使用的代码如下:
dummy_df <- data.frame(
x = seq(0.1, -3, length.out = 50),
y = seq(0.01, 1, length.out = 50)
)
fit <- nls(y ~ alpha / (1 + exp(x - xO) / beta),data = dummy_df,
start = list(alpha = 1.0009, beta = -10, xO = 0),
control = nls.control(minFactor = 0.00001, maxiter = 10))
这会导致以下错误: nls(y ~ alpha/(1 + exp(x - xO)/beta) 中的错误,: 奇异梯度
有几个问题:
1) 参数无法识别。这就像要求解决
a+b=1
和 a
一样。您必须修复其中之一。我们可以将 RHS 写为
b
并且 exp(-x0)/beta 实际上是一个参数,而不是两个。我们可以通过将
alpha / (1 + exp(x - xO) / beta)
= alpha / (1 + exp(x) * exp(-x0) / beta)
或
beta
固定为任意值来解决此问题。请注意,我们使用了nls2“p线性随机”算法,它允许我们摆脱线性输入的参数,这里x0
,并且我们将alpha
设置为-1以使参数可识别。 nls2 的 p线性随机算法使用 beta
描述的矩形内的随机值并给出最佳值。然后我们可以使用它作为 start
的起始值。2)起始值不好。使用如下所示的 nls2 来解决这个问题。
3)该模型不能很好地描述数据。一些情节应该可以说服其中之一。 这是代码;然而,正如(3)中提到的,尽管我们可以得到没有错误的结果,但将这个模型拟合到这些数据上我们不会得到好的结果。
nls