对多个因变量使用 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"))
这个模型在技术上是正确的,但给出了一个奇异的拟合(这并不奇怪,因为我们试图估计仅在三个量表水平上的方差);有关处理此问题的建议,请参阅 ?isSingular
或 GLMM FAQ。
这不是我们可以设置的唯一模型;最大模型将包含更多项。
一些进一步的评论:
- 一个原则是,由于多元数据的元素通常有不同的单位,我们应该不在模型中有任何适用于跨尺度的项(例如总截距,或干预的总体效果);这个可能不适用于你的具体情况,我不知道
- 有一个随机效应变化的项(
collection_point
在这种情况下)没有相应的固定效应是不寻常的(而且通常是错误的,尽管并非总是如此)——这样做你假设收集点的 平均 (人口水平)效应恰好为零,这是令人惊讶的,除非 (1) 实验设计有一些特殊之处(例如,观察以某种方式在收集中随机化点),(2)您已经以某种方式预处理了数据(例如,明确地将数据转换为在收集点之间具有零方差),(3)正在建立一个空模型进行比较。
- 我有点担心你需要覆盖检查你估计的随机效应比观测值少;我没有对此进行详细研究,但这通常意味着您的模型在某种程度上过度拟合。 (也许是因为我们正在查看数据的子集,而这并没有出现在完整的数据集中?)
更多here.
这是我的数据集的示例:
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"))
这个模型在技术上是正确的,但给出了一个奇异的拟合(这并不奇怪,因为我们试图估计仅在三个量表水平上的方差);有关处理此问题的建议,请参阅 ?isSingular
或 GLMM FAQ。
这不是我们可以设置的唯一模型;最大模型将包含更多项。
一些进一步的评论:
- 一个原则是,由于多元数据的元素通常有不同的单位,我们应该不在模型中有任何适用于跨尺度的项(例如总截距,或干预的总体效果);这个可能不适用于你的具体情况,我不知道
- 有一个随机效应变化的项(
collection_point
在这种情况下)没有相应的固定效应是不寻常的(而且通常是错误的,尽管并非总是如此)——这样做你假设收集点的 平均 (人口水平)效应恰好为零,这是令人惊讶的,除非 (1) 实验设计有一些特殊之处(例如,观察以某种方式在收集中随机化点),(2)您已经以某种方式预处理了数据(例如,明确地将数据转换为在收集点之间具有零方差),(3)正在建立一个空模型进行比较。 - 我有点担心你需要覆盖检查你估计的随机效应比观测值少;我没有对此进行详细研究,但这通常意味着您的模型在某种程度上过度拟合。 (也许是因为我们正在查看数据的子集,而这并没有出现在完整的数据集中?)
更多here.