nls 问题:评估模型时产生的缺失值或无穷大
nls troubles: Missing value or an infinity produced when evaluating the model
我是一名 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)
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可以为负吗?
尝试删除任何带零的行观察值,尤其是在预测变量中并尝试使用 nls 函数。它对我有用。
问题是:
- 我们需要更好的初始值
- 根据发布者的评论,我们需要将 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)
我是一名 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)
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可以为负吗?
尝试删除任何带零的行观察值,尤其是在预测变量中并尝试使用 nls 函数。它对我有用。
问题是:
- 我们需要更好的初始值
- 根据发布者的评论,我们需要将 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)