lmer:随机因素被视为分组因素?
lmer: Random factor is treated as grouping factor?
我正在尝试使用 lmer
在 R 中创建模型。我有 40 个受试者(在我的代码中为 VPN
),每个受试者在 5 分李克特量表上评估三种相关的句子类型(SH
、SM
、SP
)。
这是数据的样子(对于每个参数,有 40 个评估,为了更清楚起见,我只是在这里缩短了它):
VPN parameter evaluation.likert
1 1 SH1 2
2 2 SH1 4
3 3 SH1 5
4 4 SH1 3
...
5 1 SM1 4
6 2 SM1 2
7 3 SM1 2
8 4 SM1 5
...
9 1 SP1 1
10 2 SP1 1
11 3 SP1 3
12 4 SP1 5
...
IMO,我需要将受试者视为随机因素以解释重复测量,这就是我在 R 中使用此代码的原因:
model <- lmer(SH*SM*SP ~ VPN + (1|VPN), data=data)
现在我收到错误消息
number of levels of each grouping factor must be < number of observations (problems: VPN).
为什么 VPN
被视为分组因素,正确的代码是什么?
VPN
被视为分组变量,因为这是您指定的:在随机效应规范 (f|g)
中,变量 g
是分组变量(在您的情况下, f
==1
指定截距中的组间差异)。
@Roland 是正确的,您需要重塑数据。您的数据如下所示:
set.seed(101)
dd <- data.frame(VPN=1:40,
SH1 = sample(1:5, 40, replace = TRUE),
SP1 = sample(1:5, 40, replace = TRUE),
SM1 = sample(1:5, 40, replace = TRUE))
在 R 中重塑数据的方法有很多种,我会这样做:
dd_long <- tidyr::pivot_longer(dd,
cols = -VPN, ## VPN is the ID variable
names_to = "type",
values_to = "value")
- 如果您想将李克特值视为数字(可能是个坏主意),最简单的模型是
lme4::lmer(value ~ 0 + type + (1|VPN))
这适合每个句子类型的单独截距。
- 我看不出尝试评估句子类型之间的相互作用有何意义 (
SM*SH*SP
),因为根据我们可以看到的数据,每个个体的观察都是一个特定的个体观察一个特定的句子类型——不止一种句子类型永远不会适用于单个观察……?也许您没有向我们展示您数据的某些方面?
- 最大模型也允许个体对句子类型的反应存在差异,反应差异具有个体内部相关性:
lme4::lmer(value ~ 0 + type + (type|VPN),
data = data_long)
但是,对于 40 个受试者,您可能无法拟合 6 个协方差参数(3 种类型 → (3*(3+1)/2 个参数)。参见 Barr 等人 2013 年,Matuschek 等人 2017 年 ...
正如@Roland 所说,将这些数据作为 ordinal 数据处理可能更好,例如使用 累积 link 模型:
library(ordinal)
clmm(value ~ 0 + type + (type|VPN), data = data_long)
我正在尝试使用 lmer
在 R 中创建模型。我有 40 个受试者(在我的代码中为 VPN
),每个受试者在 5 分李克特量表上评估三种相关的句子类型(SH
、SM
、SP
)。
这是数据的样子(对于每个参数,有 40 个评估,为了更清楚起见,我只是在这里缩短了它):
VPN parameter evaluation.likert
1 1 SH1 2
2 2 SH1 4
3 3 SH1 5
4 4 SH1 3
...
5 1 SM1 4
6 2 SM1 2
7 3 SM1 2
8 4 SM1 5
...
9 1 SP1 1
10 2 SP1 1
11 3 SP1 3
12 4 SP1 5
...
IMO,我需要将受试者视为随机因素以解释重复测量,这就是我在 R 中使用此代码的原因:
model <- lmer(SH*SM*SP ~ VPN + (1|VPN), data=data)
现在我收到错误消息
number of levels of each grouping factor must be < number of observations (problems: VPN).
为什么 VPN
被视为分组因素,正确的代码是什么?
VPN
被视为分组变量,因为这是您指定的:在随机效应规范 (f|g)
中,变量 g
是分组变量(在您的情况下, f
==1
指定截距中的组间差异)。
@Roland 是正确的,您需要重塑数据。您的数据如下所示:
set.seed(101)
dd <- data.frame(VPN=1:40,
SH1 = sample(1:5, 40, replace = TRUE),
SP1 = sample(1:5, 40, replace = TRUE),
SM1 = sample(1:5, 40, replace = TRUE))
在 R 中重塑数据的方法有很多种,我会这样做:
dd_long <- tidyr::pivot_longer(dd,
cols = -VPN, ## VPN is the ID variable
names_to = "type",
values_to = "value")
- 如果您想将李克特值视为数字(可能是个坏主意),最简单的模型是
lme4::lmer(value ~ 0 + type + (1|VPN))
这适合每个句子类型的单独截距。
- 我看不出尝试评估句子类型之间的相互作用有何意义 (
SM*SH*SP
),因为根据我们可以看到的数据,每个个体的观察都是一个特定的个体观察一个特定的句子类型——不止一种句子类型永远不会适用于单个观察……?也许您没有向我们展示您数据的某些方面? - 最大模型也允许个体对句子类型的反应存在差异,反应差异具有个体内部相关性:
lme4::lmer(value ~ 0 + type + (type|VPN),
data = data_long)
但是,对于 40 个受试者,您可能无法拟合 6 个协方差参数(3 种类型 → (3*(3+1)/2 个参数)。参见 Barr 等人 2013 年,Matuschek 等人 2017 年 ...
正如@Roland 所说,将这些数据作为 ordinal 数据处理可能更好,例如使用 累积 link 模型:
library(ordinal)
clmm(value ~ 0 + type + (type|VPN), data = data_long)