我正在拟合一些线条,我觉得我正在告诉R究竟如何适应它们,但我觉得有一些东西(一些因素或效果)我不知道这会阻止一个良好的契合。
我的实验单位是“情节”,如在田野情节中,我很抱歉令人困惑。
可以找到数据:https://www.dropbox.com/s/a0tplyvs8lxu1d0/rootmeansv2.csv。 与
df$plot.f<-as.factor(df$plot)
dfG<-groupedData(mass ~ year|plot.f, data=df)
dfG30<-dfG[dfG$depth == 30,]
简单地说,随着时间的推移,我有了质量,我将其与模型适合每个实验单元:
fit <- lme(mass ~ year , random = ~ 1 | plot, data = df)
和plot (augPred(fit))
我得到了每个实验单位的适合度(“情节”):
我需要做些什么来让实验单位之间的坡度变化更大?从统计角度来看,我对此并不感兴趣,但从预测的角度来看 - 所以模型中的任何东西都可以被操纵以使这些线移动。
答案 0 :(得分:14)
这个答案有点百科全书,因为关于你的问题有几点重要。 tl; dr 添加year*plot
作为随机效果是第一步,但拟合实际上有点问题,尽管它最初并不是这样:以{{1}为中心变量处理问题,但对数据进行日志转换可能是一个更好的想法。
更新:OP正在对year
进行分析。我不小心对整个数据集进行了分析,这可能会让事情变得更难 - 下面记录的异方差可能对数据的一部分没有那么糟糕 - 但是我会将它留给教学目的(并且出于懒惰)。
获取数据:
subset(df,Depth==30)
将逐年情节互动作为随机效果添加到模型中:
df <- read.csv("rootmeansv2.csv")
library(nlme)
gdf <- groupedData( mass ~ year | plot, data=df)
然而,如果我们看一下结果,我们会发现这根本没有用 - fit0 <- lme(mass ~ year , random = ~ year | plot, data = gdf)
项(斜率中的曲线间方差)很小。
year
这有时会发生(单一的拟合),但除此之外,## Variance StdDev Corr
## (Intercept) 9.522880e-12 3.085916e-06 (Intr)
## year 7.110616e-08 2.666574e-04 0.32
## Residual 3.885373e-01 6.233276e-01
摘要并未以任何其他方式表明可能存在错误。但是,如果我们试图获得置信区间,我们会发现可能存在问题:
lme
另一种仔细检查的方法是在 intervals(fit0)
## Error in intervals.lme(fit0) :
## cannot get confidence intervals on var-cov components: Non-positive definite approximate variance-covariance
中使用相同的模型。
lme4
我们得到了明显不同的答案,以及有关融合的警告(这是在开发版本1.1-7中,它没有遭受1.1-6广泛报道的误报警告)。看起来library(lme4)
VarCorr(fit1 <- lmer(mass ~ year +(year | plot), data = gdf))
## Groups Name Std.Dev. Corr
## plot (Intercept) 0.66159674
## year 0.00059471 -1.000
## Residual 0.62324403
## Warning messages:
## 1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge with max|grad| = 0.132739 (tol = 0.002, component 1)
## 2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge: degenerate Hessian with 1 negative eigenvalues
的拟合稍微好一些:
lme4
混合模型等复杂拟合的潜在数据问题之一是预测变量的居中和缩放较差。在这种情况下,因为c(logLik(fit1)-logLik(fit0))
## 0.1775161
是从2008年开始的连续预测变量,截距和斜率极高度相关(截距是第0年的预测值!)。在这种情况下,我们可以通过居中来解决问题 - 减去最小值(即开始年份为0而不是2008年)也是合理的。
year
我们得到更合理的答案(并没有警告),虽然我们仍然有完美的(现在正相关的)截距和斜率 - 这只是说模型略微过度拟合数据,但我们无能为力(我们可以通过拟合模型c. <- function(x) scale(x,center=TRUE,scale=FALSE)
VarCorr(fit2 <- update(fit1,.~ c.(year) +(c.(year) | plot)))
## Groups Name Std.Dev. Corr
## plot (Intercept) 0.53798
## c.(year) 0.10515 1.000
## Residual 0.59634
来强制相关为零,但这有其自身的问题。)
现在在~c.(year)+(c.(year)||plot))
中尝试:
lme
结果相似(虽然相关性仅为0.991而不是1.0):对数似然的差异实际上略大,但仍然很小。 (拟合仍然有些问题 - 我必须更改优化器,如VarCorr(fit3 <- update(fit0,
fixed.=~c.(year),
random=~c.(year)|plot,
control=lmeControl(opt="optim")))
## plot = pdLogChol(c.(year))
## Variance StdDev Corr
## (Intercept) 0.28899909 0.5375864 (Intr)
## c.(year) 0.01122497 0.1059479 0.991
## Residual 0.35559015 0.5963138
参数中所示,到达此处。)
事情现在看起来更好:
lmeControl
但是,残差与拟合图表显示您应该担心的问题:
plot(augPred(fit3))
漏斗形状显示您有异方差性问题。比例位置图更清楚地显示了它:
plot(fit3)
最明显的解决方法是对数据进行日志转换:
plot(fit3,sqrt(abs(resid(.)))~fitted(.),type=c("p","smooth"))
年内变化很小,但这次可能是因为它不需要。当我们拟合等效模型时,df$logmass <- log10(df$mass) ## log10() for interpretability
gdfL <- groupedData( logmass ~ year | plot, data=df)
VarCorr(fitL1 <- lme(logmass ~ c.(year) , random = ~ c.(year) | plot,
data = gdfL))
## plot = pdLogChol(c.(year))
## Variance StdDev Corr
## (Intercept) 0.1842905872 0.42929080 (Intr)
## c.(year) 0.0009702893 0.03114947 -0.607
## Residual 0.1052946948 0.32449144
没有警告,我们得到相同的结果;拟合是非奇异的(没有零差异或完美的相关性);和lmer
有效。
预测看起来很合理:
intervals(fitL1)
诊断图也是如此:
plot(augPred(fitL1))
虽然2008年似乎确实有点滑稽(由于plot(fitL1)
喜欢水平绘制箱形图,因此轴被翻转 - lme
告诉factor(year)
使用箱形图代替散点图。)
lme