对多个因变量使用 lmer

Using lmer for multiple dependent variables

这是我的数据集的示例:

df <- data.frame(
id  = c(13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 
       34, 35, 36, 37, 38, 39, 40, 62, 63, 64, 65, 13, 14, 15, 16, 17, 18, 
       19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 
       40, 62, 63, 64, 65, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 
       29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 62, 63, 64, 65), 
collection_point = c(rep(c("Baseline", "Immediate", "3M"), each=28)), 
intervention = c(rep(c("B", "A", "C", "B", "C", "A", "A", "B", "A", "C", "B", "C", 
              "A", "A", "B", "A", "C", "B", "C", "A", "A"), each = 4)), 
scale_A = c(6.5, 7.0, 6.25, 6.0, NA, 7.5, 7.5, 
        8.0, 7.5, 6.75, 7.5, 6.75, 6.75, 6.5, 
        5.75, 6.75, 7.75, 7.5, 7.75, 7.25, 7.75, 
        7.25, 7.25, 5.75, 6.75, NA, 6.75, 7.5, 
        6.75, 7.0, 6.5, 7.0, 7.5, 7.5, 7.5, 
        7.75, 7.25, 7.25, 7.25, 7.5, 6.5, 6.25, 
        6.25, 7.25, 7.5, 6.75, 7.25, 7.25, 7.5, 
        7.25, 7.5, 7.25, NA, 7.0, 7.5, 7.5, 
        6.75, 7.25, 6.5, 7.0, 7.5, 7.5, 7.5, 
        7.75, 7.5, 7.5, 7.5, 7.5, 6.5, 5.75, 
        6.25, 6.75, 7.5, 7.25, 7.25, 7.5, 7.75, 
        7.75, 7.75, 7.5, NA, NA, NA, NA))
scale_B = c(5.0, 6.5, 6.25, 7.0, NA, 5.5, 6.5, 
        6.0, 7.5, 5.75, 6.5, 5.75, 7.75, 6.5, 
        6.75, 7.75, 7.75, 7.5, 7.75, 5.25, 7.75, 
        6.25, 6.25, 6.75, 5.75, NA, 6.75, 6.5, 
        7.75, 6.0, 7.5, 6.0, 7.5, 7.5, 6.5, 
        6.75, 6.25, 6.25, 6.25, 6.5, 6.5, 7.25, 
        7.25, 6.25, 6.5, 7.75, 6.25, 7.25, 6.5, 
        6.25, 6.5, 6.25, NA, 7.0, 6.5, 7.5, 
        7.75, 6.25, 7.5, 6.0, 7.5, 6.5, 6.5, 
        6.75, 6.5, 6.5, 6.5, 7.5, 7.5, 6.75, 
        7.25, 7.75, 6.5, 6.25, 7.25, 6.5, 6.75, 
        6.75, 6.75, 6.5, 5.5, NA, NA, 6.5))
scale_C = c(5.5, 5.0, 7.25, 7.0, 8.0, 5.5, 5.5, 
        8.0, 5.5, 7.75, 5.5, 7.75, 7.75, 7.5, 
        7.75, 7.75, 5.75, 5.5, 5.75, 5.25, 5.75, 
        5.25, 6.25, 7.75, 7.75, NA, 7.75, 5.5, 
        6.75, 6.0, 7.5, 5.0, 5.5, 5.5, 7.5, 
        5.75, 6.25, 5.25, 5.25, 5.5, 7.5, 7.25, 
        7.25, 6.25, 5.5, 7.75, 5.25, 5.25, 7.5, 
        5.25, 6.5, 5.25, 5.0, 5.0, 5.5, 5.5, 
        7.75, 6.25, 7.5, 5.0, 5.5, 5.5, 7.5, 
        5.75, 6.5, 5.5, 5.5, 5.5, 7.5, 7.75, 
        7.25, 7.75, 5.5, 5.25, 5.25, 5.5, 6.75, 
        5.75, 5.75, 5.5, 6.75, NA, 5.75, NA))

其中,

id = 参与者

collection_point = 从参与者那里收集数据的次数(重复测量)

intervention = 每个参与者被随机分配到的组(固定效应)

scale_A = 每个参与者在每个数据收集点完成的问卷分数(结果)

参与者被随机分配到三种干预措施中的一种,并在三个不同的时间点完成相同的量表(量表 A-C)以确定随时间推移的任何改进。

我用过密码

    mixed.lmer.A1<-lmer(scale_A~intervention+(collection_point|id), control =
 lmerControl(check.nobs.vs.nRE = "ignore"), data = df)

但我想 运行 MANOVA 因为所有量表都衡量一个连贯主题的不同方面。但是,我不能运行

    mixed.lmer.comb<-lmer(cbind(scale_A, scale_B, scale_C)~intervention+
(collection_point|id), control = lmerControl(check.nobs.vs.nRE = "ignore"), 
data = df)

和我最初想的一样。如果我 运行 使用 lm 它确实有效,但这不会非常有意义,因为我需要将 collection_point 作为重复测量来考虑。

有没有办法可以使用 lmer 运行 多个因变量?

您可以通过将数据转换为长格式来做到这一点:有很多方法可以做到这一点,例如reshape 在基数 R 或 reshape2::melt 中,但我发现 tidyr::pivot_longer 最简单:

df_long <- tidyr::pivot_longer(df, cols = starts_with("scale_"),
                               names_to = "scales",
                               values_to = "value")

固定效果是0 + scales + scales:intervention:我们不需要整体截距,我们想要特定尺度的截距,加上每个尺度的干预效果。

随机效应是 collection_point|scales/id:这允许收集点的效应在不同尺度和 id 范围内变化(与原始模型一样)。

mm <- lmer(value ~ 0 + scales + scales:intervention + (collection_point|scales/id),
           data = df_long,
           control = lmerControl(check.nobs.vs.nRE = "ignore"))

这个模型在技术上是正确的,但给出了一个奇异的拟合(这并不奇怪,因为我们试图估计仅在三个量表水平上的方差);有关处理此问题的建议,请参阅 ?isSingularGLMM FAQ

这不是我们可以设置的唯一模型;最大模型将包含更多项。

一些进一步的评论:

  • 一个原则是,由于多元数据的元素通常有不同的单位,我们应该在模型中有任何适用于跨尺度的项(例如总截距,或干预的总体效果);这个可能不适用于你的具体情况,我不知道
  • 有一个随机效应变化的项(collection_point 在这种情况下)没有相应的固定效应是不寻常的(而且通常是错误的,尽管并非总是如此)——这样做你假设收集点的 平均 (人口水平)效应恰好为零,这是令人惊讶的,除非 (1) 实验设计有一些特殊之处(例如,观察以某种方式在收集中随机化点),(2)您已经以某种方式预处理了数据(例如,明确地将数据转换为在收集点之间具有零方差),(3)正在建立一个空模型进行比较。
  • 我有点担心你需要覆盖检查你估计的随机效应比观测值少;我没有对此进行详细研究,但这通常意味着您的模型在某种程度上过度拟合。 (也许是因为我们正在查看数据的子集,而这并没有出现在完整的数据集中?)

更多here.