将nls拟合到分组数据R
我试图将一个非线性模型与整个季节在几个地块上收集的一系列测量值相匹配。下面是来自较大数据集的子样本。 数据: dput(nee.示例) 结构(列表)朱利安=c(159L,159L,159L,159L,159L, 159L,159L,159L,159L,159L,159L,159L,159L,169L,169L,169L, 169L,169L,169L,169L,169L,169L,169L,169L,169L,169L,169L, 169L),blk=结构(c(1L,1L,1L,1L,1L,1L,1L,1L, 1L,1L,1L,1L,1L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L, 2升,2升,2升,2升),.Label=c(“e”,“w”),class=“factor”),type=structure(c(1L, 1L、1L、1L、1L、1L、1L、1L、1L、1L、1L、1L、1L、1L、2L、2L、2L、, 2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L,2L),标签=c(“b”, “g”,class=“factor”),曲线图=c(1L,1L,1L,2L,2L, 2L、2L、3L、3L、3L、3L、1L、1L、1L、1L、2L、2L、2L、2L、2L、2L、2L、2L、, 3L,3L,3L,3L,3L,3L),trt=结构(c(1L,1L,1L,1L, 1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L, 1L、1L、1L、1L、1L、1L、1L、1L),.Label=“a”,class=“factor”), 布料=c(25L,50L,75L,100L,0L,25L,50L,75L,100L,0L, 25L,50L,75L,100L,0L,25L,50L,100L,0L,25L,50L,75L, 100L,0L,25L,50L,75L,75L,100L),绘图ID=c(1L,1L,1L, 1L、2L、2L、2L、2L、2L、3L、3L、3L、3L、13L、13L、13L、, 13L、14L、14L、14L、14L、14L、15L、15L、15L、15L、15L、15L、15L、15L ),通量=c(0.76,0.6,0.67,0.7,1.72,1.63,-7.8,0.89, 0.51, 0.76, 0.48, 0.62, 0.18, 0.21, 3.87, 2.44, 1.26, -1.39, 2.18, 1.9, 0.81, -0.04, -0.83, 1.99, 1.55, 0.57, -0.02, -0.16, -ChT=c(18.6,19.1,19.6,19.1,16.5,17.3,18.3, 19, 18.6, 17.2, 18.4, 19, 19.2, 20.6, 22, 21.9, 22.4, 23.8, 20.7, 21.5, 22.5, 23.3, 23.8, 20.1, 20.8, 21.2, 21.8, 21.8, 21.4),PAR=C(129.9,210.2,305.4,796.6,1.3,62.7,149.9, 171.2, 453.3, 1.3, 129.7, 409.3, 610, 1148.6, 1.3, 115.2, 237, 814.6, 1.3, 105.4, 293.4, 472.1, 955.9, 1.3, 100.5, 290467413.6934.2),名称=c(“朱利安”、“布莱克”、“类型”, “plot”、“trt”、“cloth”、“plotID”、“flux”、“ChT”、“par”),class=“data.frame”,row.names=c(NA, -(29L)) 我需要在每个日期将以下模型(rec.hyp,如下)拟合到每个绘图,并检索每个julian plotID组合的参数估计值。经过一番探索后,由于分组方面的原因,听起来nlsList将是一个理想的函数:将nls拟合到分组数据R,r,nls,R,Nls,我试图将一个非线性模型与整个季节在几个地块上收集的一系列测量值相匹配。下面是来自较大数据集的子样本。 数据: dput(nee.示例) 结构(列表)朱利安=c(159L,159L,159L,159L,159L, 159L,159L,159L,159L,159L,159L,159L,159L,169L,169L,169L, 169L,169L,169L,169L,169L,169L,169L,169L,169L,169L,169L, 169L),blk=结构(c(1L,1L,1L,1L,1L,1L
library(nlme)
rec.hyp <- nlsList(flux ~ Re - ((Amax*par)/(k+par)) | julian/plotID,
data=nee.example,
start=c(Re=3, k=300, Amax=5),
na.action=na.omit)
coef(rec.hyp)
我尝试调整nls.control中的控件以增加最大值和tol,但显示了相同的错误消息。我改变了初始的起始值,但没有用
需要注意的是,我需要使用最小二乘法拟合模型,以便与之前的工作保持一致
问题:
提前感谢。回答问题1:您的分组结构是正确的。您可以通过对数据子集运行
nls
来验证它:
rec.hyp.test <- nls(flux ~ Re - ((Amax*par)/(k+par)),
data=subset(nee.example,julian==159 & plotID==3),
start=c(Re=3, k=300, Amax=5),
na.action=na.omit)
coef(rec.hyp.test)
# Re k Amax
# 0.7208943 792.4412287 0.8972519
coef(rec.hyp)[3,]
# Re k Amax
# 159/3 0.7208943 792.4412 0.8972519
发现它不是单调的,我甚至可以说它根本没有任何趋势!我猜,即使你强迫nls为这种情况找到一些解决方案,也很可能是一个虚假的解决方案,所以你可能只想让它不适合(即NA)
我还建议对输入数据和拟合模型质量进行目视检查。使用
R
和reformae2
和ggplot2
等软件包,您可以轻松绘制数百个图形,甚至快速查看它们也可以帮助您避免麻烦 谢谢你的回复,非常有帮助。是否可以强制nls
完成其他组的模型拟合,即使其他组中存在错误(例如,您在上面绘制的组)?让模型适应“好”的关系,然后回到“坏”的关系进行质量控制,这将是一件好事。否则,我将按照您的建议进行重塑
或ggplot2
以识别异常值,然后重新运行nlsList
模型。1。查看coef(rec.hyp)
输出--nlsList
自动完成分析并返回导致错误的组的NA
。2.我认为目视检查将是一个好主意,无论您的数据在拟合方面是“好”还是“坏”。3.我还建议您看看shinny
软件包,它可以用来为您的质量控制程序构建一个漂亮而闪亮的GUI
rec.hyp.test <- nls(flux ~ Re - ((Amax*par)/(k+par)),
data=subset(nee.example,julian==159 & plotID==3),
start=c(Re=3, k=300, Amax=5),
na.action=na.omit)
coef(rec.hyp.test)
# Re k Amax
# 0.7208943 792.4412287 0.8972519
coef(rec.hyp)[3,]
# Re k Amax
# 159/3 0.7208943 792.4412 0.8972519
plot(flux~par,subset(nee.example,julian==159 & plotID==1))