为何emmeans会生成模型中不存在的Group2与Group3交互项?
问题
我有一个包含3个组间被试组和1个因变量(DV)的数据集,对Group2和Group3进行虚拟编码,以Group1为参照组。使用lme4的glm函数拟合模型DV ~ Group2 + Group3,由于Group2与Group3互斥,二者本不应存在交互项。但使用emmeans包提取估计边际均值时,却出现了二者的交互项均值(即同时属于两组的情况)。请问该如何处理?为何emmeans会包含模型中不存在的交互项?
可复现代码:
## 加载包 require(lme4) library(emmeans) ## 创建数据集:两个组间变量为虚拟编码,DV为因变量 Group2 <- c(0, 0, 0,0, 0, 0,1, 1, 1, 1, 1, 1,0, 0, 0,0, 0, 0) Group3 <- c(0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0,1, 1, 1,1, 1, 1) DV <- c(1, 2, 3, 2, 1, 3, 5, 6, 7, 1, 2, 3, 2, 1, 3, 5, 6, 7) df <- data.frame(Group2, Group3, DV) print(df) ## 将虚拟编码的0/1转换为因子 df$Group2<-as.factor(df$Group2) df$Group3<-as.factor(df$Group3) ## 拟合模型 Model01 <- glm(DV ~ Group2+Group3, data=df) Model01 ## 提取估计边际均值 Model01em <- emmeans(Model01, ~ Group2 + Group3, nesting = NULL) Model01em
解答
原因分析
emmeans生成虚拟交叉组合的核心原因是:它仅依据因子的水平定义生成所有可能的交叉组合,不会自动识别数据中实际不存在的组合。
- 你的Group2和Group3被转换为因子后,各自都有
0和1两个水平,emmeans会默认生成这两个因子所有水平的交叉组合(共4种),哪怕数据里没有Group2=1且Group3=1的样本。 - 额外设置
nesting = NULL会强制emmeans忽略变量间可能的嵌套或互斥关系,进一步确保生成所有交叉组合。
解决方法
方法1:合并为单一分组因子(推荐)
把三个被试组编码成一个单一的因子变量,这是更规范的组间分析方式,emmeans会直接针对实际存在的三组计算边际均值,不会生成虚拟组合:
# 创建单一分组因子,对应Group1、Group2、Group3 df$Group <- factor( ifelse(df$Group2 == 1, "Group2", ifelse(df$Group3 == 1, "Group3", "Group1")), levels = c("Group1", "Group2", "Group3") ) # 重新拟合模型 Model02 <- glm(DV ~ Group, data=df) # 提取实际三组的边际均值 emmeans(Model02, ~ Group)
方法2:过滤虚拟组合(适配现有虚拟变量模型)
如果必须保留原虚拟变量模型,可以在提取边际均值后过滤掉不存在的组合:
# 提取后过滤掉Group2和Group3同时为1的情况 Model01em <- emmeans(Model01, ~ Group2 + Group3) %>% filter(!(Group2 == 1 & Group3 == 1)) Model01em
或者在调用emmeans时,用at参数直接指定仅计算实际存在的组合:
# 先构造实际存在的组合列表,再传入emmeans valid_combinations <- expand.grid( Group2 = c("0", "1"), Group3 = c("0", "1") ) %>% filter(!(Group2 == "1" & Group3 == "1")) Model01em <- emmeans(Model01, ~ Group2 + Group3, at = valid_combinations)
内容的提问来源于stack exchange,提问作者KG202
相关产品推荐
相关产品推荐

