这是在 R 中使用 lme4 分析混合效应模型的可接受方法吗?

机器算法验证 r 混合模式 lme4-nlme
2022-01-22 10:06:57

我有一个不平衡的重复测量数据集要分析,并且我读到大多数统计软件包使用 ANOVA(即 III 型平方和)处理此问题的方式是错误的。因此,我想使用混合效应模型来分析这些数据。我在 中阅读了很多关于混合模型的内容R,但我对R混合效果模型仍然很陌生,并且对我做正确的事情不是很有信心。请注意,我还不能完全摆脱“传统”方法,仍然需要值和事后检验。p

我想知道以下方法是否有意义,或者我是否做错了什么。这是我的代码:

# load packages
library(lme4)
library(languageR)
library(LMERConvenienceFunctions)
library(coda)
library(pbkrtest)

# import data
my.data <- read.csv("data.csv")

# create separate data frames for each DV & remove NAs
region.data <- na.omit(data.frame(time=my.data$time, subject=my.data$subject, dv=my.data$dv1))

# output summary of data
data.summary <- summary(region.data)

# fit model
# "time" is a factor with three levels ("t1", "t2", "t3")
region.lmer <- lmer(dv ~ time + (1|subject), data=region.data)

# check model assumptions
mcp.fnc(region.lmer)

# remove outliers (over 2.5 standard deviations)
rm.outliers <- romr.fnc(region.lmer, region.data, trim=2.5)
region.data <- rm.outliers$data
region.lmer <- update(region.lmer)

# re-check model assumptions
mcp.fnc(region.lmer)

# compare model to null model
region.lmer.null <- lmer(dv ~ 1 + (1|subject), data=region.data)
region.krtest <- KRmodcomp(region.lmer, region.lmer.null)

# output lmer summary
region.lmer.summary <- summary(region.lmer)

# run post hoc tests
t1.pvals <- pvals.fnc(region.lmer, ndigits=10, withMCMC=TRUE)

region.lmer <- lmer(dv ~ relevel(time,ref="t2") + (1|subject), data=region.data)
t2.pvals <- pvals.fnc(region.lmer, ndigits=10, withMCMC=TRUE)

region.lmer <- lmer(dv ~ relevel(time,ref="t3") + (1|subject), data=region.data)
t3.pvals <- pvals.fnc(region.lmer, ndigits=10, withMCMC=TRUE)

# Get mcmc mean and 50/95% HPD confidence intervals for graphs
# repeated three times and stored in a matrix (not shown here for brevity)
as.numeric(t1.pvals$fixed$MCMCmean)
as.numeric(t1.pvals$fixed$HPD95lower)
as.numeric(t1.pvals$fixed$HPD95upper)
HPDinterval(as.mcmc(t1.pvals$mcmc),prob=0.5)
    HPDinterval(as.mcmc(t1.pvals$mcmc),prob=0.5)

我有一些具体问题:

  1. 这是分析混合效应模型的有效方法吗?如果没有,我应该怎么做。
  2. mcp.fnc 输出的批评图是否足以验证模型假设,还是我应该采取额外的步骤。
  3. 我认为要使混合模型有效,数据需要尊重正态性和同方差性的假设。如何通过查看 mcp.fnc 生成的批评图来判断什么是“大致正常”,什么不是?我只是需要对此有所了解,还是他们规定的做事方式?就这些假设而言,混合模型的稳健性如何?
  4. 我需要针对样本中受试者的约 20 个特征(生物标志物)评估三个时间点之间的差异。只要我报告所有已进行的测试(重要或不重要),是否为每个可接受的模型拟合和测试单独的模型,或者我是否需要任何形式的校正以进行多重比较。

为了在实验方面更准确一点,这里有一些更多细节。我们纵向跟踪了一些参与者,因为他们接受了治疗。我们在治疗开始之前和之后的两个时间点测量了许多生物标志物。我想看看这三个时间点之间这些生物标志物是否存在差异。

我在这里所做的大部分工作都基于本教程,但根据我的需要和阅读的内容进行了一些更改。我所做的更改是:

  1. 重新调整“时间”因子以获得 t1-t2、t2-t3 和 t1-t3 与 pvals.fnc 的比较(来自 languageR 包)
  2. 使用基于 Kenward-Roger 方法的近似 F 检验(使用 pbkrtest 包)而不是似然比检验将我的混合模型与空模型进行比较(因为我读到,Kenward-Roger 现在更受重视)
  3. 使用 LMERConvenienceFunctions 包检查假设并删除异常值(因为我读到混合模型对异常值非常敏感)
1个回答

您的问题有点“大”,所以我将从一些一般性评论和提示开始。

一些背景阅读和有用的包

您可能应该看一些关于使用混合模型的教程介绍,我建议您从 Baayen 等人 (2008) 开始——Baayen 是languageR. Barr 等人 (2013) 讨论了随机效应结构的一些问题,Ben Bolker 是lme4. Baayen 等人特别适合您的问题,因为他们花了很多时间讨论引导/排列测试的使用(背后的东西mcp.fnc)。

文学

Florian Jaeger 在他实验室的博客上也有很多关于混合模型实用方面的资料

还有许多有用的 R 包用于可视化和测试混合模型,例如lmerTesteffects. effects软件包特别好,因为它可以让您绘制在幕后进行的线性回归和置信区间。

拟合优度和模型比较

p值是比较混合模型的一种非常糟糕的方法(通常不是什么好方法)。Doug Bates(lme4 的原作者)认为没有必要包含它们是原因的。如果你真的想这样做(我求你不要这样做),前面提到的lmerTest提供了一些额外的工具来计算和处理它们。

比较模型的更好方法是对数似然或各种信息论标准,如 AIC 和 BIC。对于 AIC 和 BIC,一般规则是“越小越好”,但你必须小心,因为它们都会惩罚更多的模型自由度,并且没有“绝对”的好坏值。要获得 AIC 和对数似然模型的一个很好的总结,您可以使用该anova()函数,该函数已被重载以接受mer对象。请注意,给定的仅对嵌套模型之间的比较有效尽管如此,即使对于其他比较,输出也非常好,因为它是如此的表格。对于嵌套模型,你有一个很好的测试并且不需要χ2χ2p-values 直接比较两个模型。不利的一面是,目前尚不清楚您的合身程度。

要查看单个效果(即您在传统 ANOVA 中看到的东西),您应该查看模型中固定效果的值(如果我没记错的话,这是其中的一部分)。通常,任何都被认为是好的(Baayen 等人的更多细节)。您还可以使用辅助函数直接访问固定效果tsummary()|t|>2fixef()

你还应该确保你的固定效应没有太强相关——多重共线性违反了模型假设。Florian Jaeger 对此写了一些文章,以及一些可能的解决方案。

多重比较

我会更直接地解决你的问题#4。答案与传统 ANOVA 的良好实践基本相同,不幸的是,对于大多数研究人员来说,这似乎是一个存在很大不确定性的地方。(这与传统的 ANOVA 相同,因为线性混合效应模型和 ANOVA 都是基于一般线性模型,只是混合模型对随机效应有一个额外的术语。)如果您假设时间窗使差异并想比较时间的影响,您应该在模型中包含时间。顺便说一句,这也将为您提供一种方便的方式来判断时间是否有所不同:时间是否存在主要(固定)效应?走这条路的缺点是你的模型会变得复杂得多,而且单一的“超级” 与没有时间作为参数的三个较小模型相比,以时间为参数的模型可能需要更长的时间来计算。事实上,混合模型的经典教程示例是sleepstudy它使用时间作为参数。

我不能完全确定不同的特征是预测变量还是因变量。如果它们是预测变量,您可以将它们全部放入一个模型中,看看哪个模型的值最大,但是这个模型将非常复杂,即使您不允许交互,并且需要很长时间计算。更快且可能更简单的方法是为每个预测器计算不同的模型。我建议使用循环在尽可能多的内核上并行化它 -尚未并行执行其矩阵运算,因此您可以在每个内核上并行计算不同的模型。(见这里的简短介绍tforeachlme4) 然后,您可以比较每个模型的 AIC 和 BIC,以找出哪个预测器最好。(在这种情况下它们没有嵌套,所以你'统计。)χ2

如果您的特征是因变量,那么无论如何您都必须计算不同的模型,然后您可以使用 AIC 和 BIC 来比较结果。