R语言HLM分析中lmer模型秩亏警告的解决方法求助
问题原因与解决方法
警告原因
你遇到的fixed-effect model matrix is rank deficient警告,核心是固定效应模型矩阵里存在线性相关的冗余变量。即便主效应间无线性依赖,两水平因子的交互项也可能触发这个问题:
- 两水平因子默认用「处理编码(treatment coding)」,这种编码下,交互项的虚拟变量可能和主效应、其他交互项的虚拟变量产生线性依赖;
- 如果数据中某些因子的交互组合完全没有观测值(比如
ac_fc=1且ed_fc=1的样本数为0),对应的虚拟变量会和其他变量完全共线; bu_ed_fc、nat_ed_fc这类额外自变量,可能和四个核心因子存在未被发现的线性关联。
解决方法
1. 更换因子编码为效应编码
处理编码是冗余的常见诱因,改用**效应编码(sum coding)**能消除截距项与主效应的共线,同时减少交互项的冗余:
# 给四个两水平因子设置效应编码 contrasts(df_finaldata$ac_fc) <- contr.sum(2) contrasts(df_finaldata$npdc_fc) <- contr.sum(2) contrasts(df_finaldata$ed_fc) <- contr.sum(2) contrasts(df_finaldata$iks_fc) <- contr.sum(2) # 重新运行模型 version_3_test <- lmer(ranking ~ 1 + ac_fc + npdc_fc + ed_fc + iks_fc + ac_fc:ed_fc + ac_fc:iks_fc + npdc_fc:ed_fc + npdc_fc:iks_fc + bu_ed_fc + nat_ed_fc + eng_ed_fc + it_ind_fc + ph_ind_fc + eng_ind_fc + work + age + (1 + ac_fc + npdc_fc + ed_fc + iks_fc| id_ind), data = df_finaldata, REML = FALSE) summary(version_3_test)
2. 检查交互组合的样本分布
用交叉表确认四个因子的交互组合是否存在空单元格:
# 逐一检查所有交互对的样本分布 table(df_finaldata$ac_fc, df_finaldata$ed_fc) table(df_finaldata$ac_fc, df_finaldata$iks_fc) table(df_finaldata$npdc_fc, df_finaldata$ed_fc) table(df_finaldata$npdc_fc, df_finaldata$iks_fc)
如果某组组合没有观测值,要么补充数据,要么结合研究理论移除该交互项。
3. 逐步添加交互项定位问题
先跑仅含主效应的模型,确认无警告后,逐个添加交互项,找到触发警告的具体交互对:
# 主效应基准模型 base_model <- lmer(ranking ~ 1 + ac_fc + npdc_fc + ed_fc + iks_fc + bu_ed_fc + nat_ed_fc + eng_ed_fc + it_ind_fc + ph_ind_fc + eng_ind_fc + work + age + (1 + ac_fc + npdc_fc + ed_fc + iks_fc| id_ind), data = df_finaldata, REML = FALSE) summary(base_model) # 逐个添加交互项,每一步检查警告 model1 <- update(base_model, . ~ . + ac_fc:ed_fc) model2 <- update(model1, . ~ . + ac_fc:iks_fc) # 以此类推完成所有交互项的添加
4. 排查其他自变量与核心因子的关联
检查bu_ed_fc、nat_ed_fc等变量是否和核心因子存在强关联:
# 分类变量用卡方检验排查关联 chisq.test(df_finaldata$bu_ed_fc, df_finaldata$ed_fc) chisq.test(df_finaldata$nat_ed_fc, df_finaldata$ed_fc)
如果存在强关联,考虑移除其中一个变量,或者重新定义变量避免冗余。
内容的提问来源于stack exchange,提问作者esk
相关产品推荐
相关产品推荐

