【问题标题】:wrapnls: Error: singular gradient matrix at initial parameter estimateswrapnls:错误:初始参数估计处的奇异梯度矩阵
【发布时间】:2015-04-01 20:39:21
【问题描述】:

我创建了一个循环,以将非线性模型拟合到参与者的六个数据点(每个参与者有 6 个数据点)。第一个模型是单参数模型。这是该模型的代码,效果很好。时间变量已定义。参与者变量是 id 变量。数据为长格式(每个参与者的每个数据点一行)。

这里是带有 1 个参数的循环代码:

1_p_model <- dlply(discounting_long, .(Participant), function(discounting_long) {wrapnls(indiff ~ 1/(1+k*time), data = discounting_long, start = c(k=0))})

但是,当我尝试拟合两个参数模型时,我在仍然使用 wrapnls 函数时收到此错误“错误:初始参数估计时的奇异梯度矩阵”。我意识到模型可能过度参数化,这就是为什么我尝试使用 wrapnls 而不仅仅是 nls(或 nlsList)。我所在领域的一些人坚持认为这两种模型都适合。我认为 wrapnls 模型避免了残差为 0 或接近 0 的问题。这是我的代码不起作用。起始值和限制是该模型的现场标准。

2_p_model <- dlply(discounting_long, .(Participant), function(discounting_long) {nlxb(indiff ~ 1/(1+k*time^s), data = discounting_long, lower = c (s = 0), start = c(k=0, s=.99), upper = c(s=1))})

我意识到我可以使用 nlxb(它确实为我提供了每个参与者的正确参数值),但该函数并没有给出每个数据点的预测值或残差(至少我认为没有),我想要计算 AIC 值。

我也愿意接受其他解决方案,让参与者在数据中循环运行。

【问题讨论】:

    标签: r nls


    【解决方案1】:

    你在最后提到'nlxb 不会给你残差',但确实如此。如果您调用nlxb 的结果称为fit,则残差在fit$resid 中。因此,您只需将它们添加到原始数据中即可获得拟合值。老实说,我不知道为什么 nlxb 没有与 predict() 函数一起使用,但至少有一种方法可以获得预测值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2023-01-27
      相关资源
      最近更新 更多