NLS问题:在评估模型时产生了缺失值或无穷大的值。

14

我是一个R语言新手,试图将植物光合作用响应曲线(饱和,曲线)拟合到专家接受的特定模型中。目标是获取Am、Rd和LCP的估计系数值。这里是我一直得到的错误信息:

Error in numericDeriv(form[[3L]], names(ind), env) : Missing value or an infinity produced when evaluating the model

我已经多次更改了起始值,但仍然没有成功。可以帮忙吗?非常感谢。以下是示例数据集。

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)

1
nls 假设所有系数都可以取任何值。如果 LCP 等于零,那么现在你有一个问题。如果您对这些参数的可能值有限制,您应该考虑重新参数化您的模型。 - MrFlick
如果我的自变量取非常大的值,我会得到类似的错误。 - jsta
3个回答

21

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来强制这个参数成为正值? - Plantapus
你可以使用nls指定下限,但我认为这样做不会有什么好结果。你的数据根本不支持与x轴的正交点。也许如果你有更低的photolrc值的数据点... - Roland
2
在R中尝试了许多nls例程(nls、nlmrt以及使用optim),但是我使用minpack.lm取得了迄今为止最好的成功。 - Jon Swanson
2
但是要注意使用时的虚假收敛! - Roland

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)

-1

尝试删除任何具有零值的行观测,特别是在预测变量中,并尝试使用nls函数。这对我很有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接