从lmer对象中提取处理方法并计算误差条

从lmer对象中提取处理方法并计算误差条,r,ggplot2,lme4,mixed-models,lmer,R,Ggplot2,Lme4,Mixed Models,Lmer,[我正在详细介绍我的实验背景-我清楚lmers的方法,只是不清楚如何提取我需要的一些值/手工计算,因此我将其发布在SO而不是CV上。我希望这是发布的正确位置!] 这个 我的实验有一个分割图设计,水平为:块/图/子图 有6个街区。每个块中有2个图,每个图中有两个子图。处理1有两个级别A和B,并应用于地块级别:在每个区块中,有一个地块接收处理1级别A和一个地块接收处理1级别B 处理2应用于子地块级别,也有两个级别C和D:每个地块有一个接受处理的子地块,两个级别A和一个接受处理2级别B 实验进行了3年

[我正在详细介绍我的实验背景-我清楚lmers的方法,只是不清楚如何提取我需要的一些值/手工计算,因此我将其发布在SO而不是CV上。我希望这是发布的正确位置!]

这个

我的实验有一个分割图设计,水平为:块/图/子图

有6个街区。每个块中有2个图,每个图中有两个子图。处理1有两个级别A和B,并应用于地块级别:在每个区块中,有一个地块接收处理1级别A和一个地块接收处理1级别B

处理2应用于子地块级别,也有两个级别C和D:每个地块有一个接受处理的子地块,两个级别A和一个接受处理2级别B

实验进行了3年。我感兴趣的是两种治疗方法的每种组合如何影响我的因变量DV

因此,我有4种治疗组合:

TMT1A:TMT2C

TMT1B:TMT2C

TMT1A:TMT2D

TMT1b:TMT2D
我用lmer为我的模型解释分割区设计。我在运行一个跨年模型,但也在每年轮流运行一个模型,因为实验中的复制不允许在跨年模型中测试年效应-模型最终被过度参数化

每年的LMER如下所示:

m2011<- lmer (DV2011~ TMT1*TMT2 + (1|Block/TMT1))
m2012<- lmer (DV2012~ TMT1*TMT2 + (1|Block/TMT1))
m2013<- lmer (DV2013~ TMT1*TMT2 + (1|Block/TMT1))
通过这种方式提取4个水平的治疗方法。然而,我不确定这种方法是否适用于裂区设计,因为这种新的4层因子忽略了构成它的层的嵌套性质,尽管随机效应不会忽略它

此外,如果我真的需要手工计算治疗方法,有人知道如何计算我实验中的筑巢水平吗

我还想计算这些处理方法的误差条


如果有人对此有任何见解,我们将不胜感激

我认为您要求的是某种形式的predict,lme4中的类mer没有默认方法,至少在CRAN上没有。但是,您可以使用ez::ezPredict

这将生成999个处理方法之间成对差异的引导重复,您可以使用分位数或任何您希望的引导置信区间:

apply(t_sim, 1, function(.) quantile(., c(0.975, 0.025)))

我认为您要求的是某种形式的predict,lme4中的类mer没有默认方法,至少在CRAN上没有。但是,您可以使用ez::ezPredict

这将生成999个处理方法之间成对差异的引导重复,您可以使用分位数或任何您希望的引导置信区间:

apply(t_sim, 1, function(.) quantile(., c(0.975, 0.025)))

在PackageLanguager中使用函数的替代方法。我称你的数据集为df


在PackageLanguager中使用函数的替代方法。我称你的数据集为df

对于lme4,我认为bootMer可能是最好的方法,因为它考虑了模型中的各种不确定性。然而,对于某些类型的问题,bootMer无法工作,因为每个模型可能需要多长时间才能适应。对于这些较大的问题,有一个名为merTools的R包,它提供了一种predictInterval方法,使用arm::sim来解释固定和随机效应中的不确定性以及模型的残余误差。在模型需要很长时间才能拟合的情况下,它非常容易使用,并且提供预测的速度更快。对于随机效应之间关系的方差定义得相当好的问题,它对bootMer产生的预测区间有很好的覆盖率

要使用它,您只需执行以下操作:

library(merTools)
preds <- predictInterval(m2011, newdata = myData, level = 0.95, n.sims = 1000)
还有其他几个用户可配置选项,但结果是一个预测对象,类似于从lm-a三列data.frame请求预测间隔时生成的预测对象,其中包含列fit、lwr和upr

对于lme4,我认为bootMer可能是最好的方法,因为它可以解释模型中的各种不确定性。然而,对于某些类型的问题,bootMer无法工作,因为每个模型可能需要多长时间才能适应。对于这些较大的问题,有一个名为merTools的R包,它提供了一种predictInterval方法,使用arm::sim来解释固定和随机效应中的不确定性以及模型的残余误差。在模型需要很长时间才能拟合的情况下,它非常容易使用,并且提供预测的速度更快。对于随机效应之间关系的方差定义得相当好的问题,它对bootMer产生的预测区间有很好的覆盖率

要使用它,您只需执行以下操作:

library(merTools)
preds <- predictInterval(m2011, newdata = myData, level = 0.95, n.sims = 1000)
还有其他几个用户可配置选项,但结果是一个预测对象,类似于从lm-a三列data.frame请求预测间隔时生成的预测对象,其中包含列fit、lwr和upr


可能会发现package languageR中的plotLMER.fnc很有用。在帮助页面上有一个例子“绘制两个因素之间的相互作用”。谢谢Henrik。这对我的高斯模型很有用。您知道如何提取mcmc模拟提供的HPD值吗?我想在ggplot中绘制处理方法和错误值,因为它看起来更好:。不幸的是,我也有一些带有二项式误差分布的模型。你知道有什么工具可以为有二项式误差的模型创建误差条吗?plotLMER.fnc不能,因为它使用mcmc sim来估计这些……我想我的答案很想发表评论,所以我将其作为回复发布。Hi Henrik-谢谢-我期待着阅读它!您可能会发现package languageR中的plotLMER.fnc非常有用。在帮助页面上有一个例子“绘制两个因素之间的相互作用”。谢谢Henrik。这对我的高斯模型很有用。您知道如何提取mcmc模拟提供的HPD值吗?我想在ggplot中绘制处理方法和错误值,因为它看起来更好:。不幸的是,我也有一些带有二项式误差分布的模型。你知道有什么工具可以为有二项式误差的模型创建误差条吗?plotLMER.fnc不能,因为它使用mcmc sim来估计这些……我想我的答案很想发表评论,所以我将其作为回复发布。Hi Henrik-谢谢-我期待着阅读它!谢谢你,内特。通过阅读该链接,他们似乎无法拟合考虑随机效应不确定性的误差条。使用plotLMER.fnc,我可以通过mcmc模拟高斯模型得到误差估计,但我有一些二项式模型,这不适用于。。。这是一个耻辱,因为我想测试4个tmt之间的区别,我不知道如何。我的模型只告诉我每种治疗的主要效果以及它们之间的相互作用。他们不测试4种治疗水平是否存在sig差异。有没有办法在LME4中设置对比度,允许这样做?@莎拉,你可以考虑参数引导。lme4的开发版本中有一个用于此过程的功能,或者您可以使用simulate and refit自行完成此操作。我在上面的答案中增加了后者的一个例子。谢谢内特。通过阅读该链接,他们似乎无法拟合考虑随机效应不确定性的误差条。使用plotLMER.fnc,我可以通过mcmc模拟高斯模型得到误差估计,但我有一些二项式模型,这不适用于。。。这是一个耻辱,因为我想测试4个tmt之间的区别,我不知道如何。我的模型只告诉我每种治疗的主要效果以及它们之间的相互作用。他们不测试4种治疗水平是否存在sig差异。有没有办法在LME4中设置对比度,允许这样做?@莎拉,你可以考虑参数引导。lme4的开发版本中有一个用于此过程的功能,或者您可以使用simulate and refit自行完成此操作。我在上面的回答中添加了后者的一个例子。谢谢你,亨里克-这太棒了!你知道这个HPD值的mcmc模拟是否考虑了随机效应方差以及固定效应?此外,是否有一种方法可以与非高斯误差分布结合使用?关于mcmc的详细信息,我认为最好参考R中相关函数的帮助文本。您还可以阅读languageR和lme4 Bates作者在中关于mcmcsamp和pvals.fnc的更多信息。关于glmer估算的CI,我曾经在arm软件包中使用过sim卡。不过,我从未将其用于不同因子组合的预测值。我试着在r-sig-mixed-models上快速搜索,找到了。languageR方法应该是这里的黄金标准。。。考虑到随机效应参数的不确定性。谢谢你亨里克-这太棒了!你知道这个HPD值的mcmc模拟是否考虑了随机效应方差以及固定效应?此外,是否有一种方法可以与非高斯误差分布结合使用?关于mcmc的详细信息,我认为最好参考R中相关函数的帮助文本。您还可以阅读languageR和lme4 Bates作者在中关于mcmcsamp和pvals.fnc的更多信息。关于glmer估算的CI,我曾经在arm软件包中使用过sim卡。不过,我从未将其用于不同因子组合的预测值。我试着在r-sig-mixed-models上快速搜索,找到了。languageR方法应该是这里的黄金标准。。。考虑随机效应参数的不确定性。
apply(t_sim, 1, function(.) quantile(., c(0.975, 0.025)))
library(lme4)
library(languageR)
library(ggplot2)

# fit model
# n.b. I don't claim that this is a sensible model
# It is just used to demonstrate the plot
mod <- lmer(DV ~ TMT1 * TMT2 + (1|Block), data = df)

# create MCMC matrix
mcmc <- pvals.fnc(mod, nsim = 1000, withMCMC = TRUE)
# pval.fnc also calculates MCMC-based p-values and HPD confidence intervals,
# and plot the posterior distributions of the parameters

# plot using plotLMER.fnc 
# in addition, set withList = TRUE to create a list of data frames with plot data
# which can be used for a (possibly prettier) plot in ggplot
ll <- plotLMER.fnc(mod, withList = TRUE, pred = "TMT1", 
               intr = list(
                 "TMT2",
                 c("C", "D"),
                 "end",
                 list(c("red",  "blue"), rep(1, 2))),
               addlines = TRUE,
               mcmcMat = mcmc$mcmc)

 # here follows additional steps to plot using ggplot 

 # convert list to data frame
 df <- do.call(rbind, ll$TMT1)

 # rename 
 names(df)[names(df) == "Levels"] <- "TMT1"

 # add TMT2
 df$TMT2 <- rep(c("C", "D"), each = 2)

# plot using ggplot
dodge <- position_dodge(width = 0.1)
ggplot(data = df, aes(x = TMT1, y = Y, col = TMT2, group = TMT2)) +
   geom_point(position = dodge, size = 3) +
   geom_errorbar(aes(ymax = upper, ymin = lower, width = 0.1), position = dodge) +
   geom_line(position = dodge) +
   ylab("DV") +
   theme_classic()
library(merTools)
preds <- predictInterval(m2011, newdata = myData, level = 0.95, n.sims = 1000)