我在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-x 0)/beta)中的误差,
1条答案
按热度按时间ar7v8xwq1#
有几个问题:
**1)**参数不可识别,这就像要求
a
和b
求解a+b=1
一样,必须修复其中一个。我们可以把RHS写为
字符串
exp(-x 0)/beta实际上是一个参数,而不是两个。我们可以通过将
beta
或x0
固定为任意值来解决这个问题。我们使用了nls 2“plinear-random”算法,该算法允许我们省略线性输入的起始值,这里是alpha
,我们将beta
设置为-1,以使参数可识别。基于算法,我们将RHS指定为矩阵,其列是非线性部分,而线性参数是乘以列的系数,nls 2的“plinear-random”算法在start
描述的矩形内随机计算RHS,并给出最佳值。然后我们可以将其用作nls
的起始值。**2)**初始值不正确。使用如下所示的nls 2来解决这个问题。
**3)**模型没有很好地描述数据。一些图应该可以说服其中一个。
这里是代码;然而,如(3)中所提到的,尽管我们可以得到没有误差的结果,但我们不会得到将该模型拟合到该数据的好结果。
型
公式不同
@Ben Bolker在评论中表示,也许你指的是公式。
如果是这种情况,则如果在所示的等效的更线性的参数化中重新表达,则将更容易拟合。
型
这样的话,我们就可以得到一个更合理的选择。
型
(图后续)x1c 0d1x
有了这个新模型@罗兰建议在评论中使用自启动模型SSlogis,它给出了相同的残差平方和,但系数略有不同。
型
还要注意的是,drc package有许多固定的增长曲线,它可以拟合而不需要初始值。例如,这使用了来自该软件包的5参数multi2模型。
更新
许多更新,包括修复一些错误和跟进问题下面的评论。