【问题标题】:nls troubles: Missing value or an infinity produced when evaluating the modelnls 问题:评估模型时产生的缺失值或无穷大
【发布时间】:2022-03-08 17:31:54
【问题描述】:

我是一名 R 新手,试图将植物光合光响应曲线(饱和、曲线)拟合到专家接受的特定模型。目标是获得 Am、Rd 和 LCP 的估计系数值。这是我不断收到的错误:

numericDeriv(form[[3L]], names(ind), env) 中的错误: 评估模型时产生的缺失值或无穷大

我已经多次切换起始值,但仍然没有运气。帮助?提前谢谢你。下面是示例数据集。

photolrc= c(3.089753, 6.336478, 7.737142, 8.004812, 8.031599)
PARlrc= c(48.69624, 200.08539, 499.29840, 749.59222, 1250.09363)
curvelrc<-data.frame(PARlrc,photolrc)
curve.nlslrc = nls(photolrc ~ Am*(1-((1-(Rd/Am))^(1-(PARlrc/LCP)))),start=list(Am=(max(photolrc)-min(photolrc)),Rd=-min(photolrc),LCP= (max(photolrc)-1)))
coef(curve.nlslrc)

【问题讨论】:

  • nls 假设所有系数都可以取任何值。现在,如果LCP 等于零,您就会遇到问题。如果您对这些参数的可能值有限制,您应该考虑重新参数化您的模型。
  • 如果我的自变量取非常大的值,我也会遇到类似的错误。

标签: r nls


【解决方案1】:

minpack.lm 来救援:

library(minpack.lm)
curve.nlslrc = nlsLM(photolrc ~ Am*(1-((1-(Rd/Am))^(1-(PARlrc/LCP)))),
                   start=list(Am=(max(photolrc)-min(photolrc)),
                              Rd=-min(photolrc),
                              LCP= (max(photolrc)-1)),
                   data = curvelrc)
coef(curve.nlslrc)
  #      Am         Rd        LCP 
  #8.011311   1.087484 -20.752957

plot(photolrc ~ PARlrc, data = curvelrc)
lines(0:1300, 
      predict(curve.nlslrc, 
              newdata = data.frame(PARlrc = 0:1300)))

如果您将start = list(Am = 8, Rd = 1, LCP = -20) 传递给nls,您也会成功匹配。

考虑到这背后的科学,我不知道参数值是否是合理的估计。 LCP可以是负数吗?

【讨论】:

  • 谢谢@Roland!不幸的是,你是对的。 LCP 在数学上应该是 x 截距,但从生物学上讲,不能为负。 minpack 有什么方法可以帮助我强制此参数为正值?
  • 您可以使用nls 指定下限,但我认为您不会有任何运气。您的数据根本不支持与 x 轴的正交点。也许如果您的数据点具有较低的 photolrc 值...
  • 在 R 中尝试了许多 nls 例程(nls、nlmrt 并且还使用了 optim),到目前为止,我使用 minpack.lm 取得了最大的成功。
  • 但使用时要注意假收敛!
【解决方案2】:

问题是:

  • 我们需要更好的初始值
  • 根据发布者的评论,我们需要将 LCP 约束为正值。

为此,我们可以使用 nls2 来获得更好的起始值,然后使用带有端口算法的 nls 来强制 LCP 的下限。请注意,LCP 达到了约束边界。

library(nls2)

# get starting value fit
st <- data.frame(Am = c(1, 10), Rd = c(-10, 10), LCP = c(0.5, 10))
fo <- photolrc ~ Am*(1-((1-(Rd/Am))^(1-(PARlrc/LCP))))
fm2 <- nls2(fo, start = st, alg = "brute")

# nls fit
fm <- nls(fo, start = coef(fm2), lower = c(-Inf, -Inf, 0.1), algorithm = "port")

给予:

> fm
Nonlinear regression model
  model: photolrc ~ Am * (1 - ((1 - (Rd/Am))^(1 - (PARlrc/LCP))))
   data: parent.frame()
       Am        Rd       LCP 
 7.919374 -0.007101  0.100000 
 residual sum-of-squares: 0.1858

Algorithm "port", convergence message: relative convergence (4)

【讨论】:

    【解决方案3】:

    尝试删除任何为零的行观测值,尤其是在预测变量中,并尝试使用 nls 函数。它对我有用。

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多