使用glmmTMB遇秩亏条件模型列丢弃警告,变量设置无异常
你遇到的dropping columns from rank-deficient conditional model警告和交互项NA,核心原因是自变量之间存在完全多重共线性——你设置的ChosSGFam/ChosSGInfect和RejSGFam/RejSGInfect是完全反向的:已选组的属性确定后,被拒组的属性就100%确定,没有任何额外信息。这种完美的依赖关系会让模型无法估计这些变量(以及它们的交互项)的系数,只能自动丢弃冗余列。
举个直观例子:如果ChosSGFam=熟悉,那么RejSGFam必然是陌生,这两个变量的相关系数为-1,属于完全共线性,模型根本无法区分它们各自的效应。再加上你用了五因素全交互(FFInfect * ChosSGFam * ChosSGInfect * RejSGFam * RejSGInfect),这种冗余会被放大,直接导致部分交互项系数无法计算(显示NA)。
1. 移除冗余变量
既然被拒组的属性是已选组的完全补集,不需要同时纳入模型。只保留已选组的两个变量+焦点鱼感染状态即可,因为被拒组的信息已经隐含在“选择了A而非B”的实验设计里。修改后的代码:
mod.1 <- glmmTMB(Visits ~ FFInfect * ChosSGFam * ChosSGInfect + (1|FFNumb), family = Gamma(link = "log"), data = For_R_CSV)
2. 逐步构建交互项(新手友好)
不要一开始就拟合五因素全交互,这种模型不仅容易出现共线性,结果也很难解释。建议从低阶交互开始:
- 先拟合主效应模型:
Visits ~ FFInfect + ChosSGFam + ChosSGInfect + (1|FFNumb) - 再逐步加入二阶交互(比如
FFInfect:ChosSGFam),观察模型拟合情况和系数稳定性后,再考虑高阶交互。
3. 重新编码变量(可选)
如果你想保留“选择偏好”的逻辑,可以把已选组的属性合并成一个单一变量,既保留所有信息,又避免冗余。示例编码:
For_R_CSV$ChoiceType <- paste("Chose_", For_R_CSV$ChosSGFam, "_", For_R_CSV$ChosSGInfect, sep = "")
然后用这个变量构建模型:
mod.1 <- glmmTMB(Visits ~ FFInfect * ChoiceType + (1|FFNumb), family = Gamma(link = "log"), data = For_R_CSV)
作为R新手,遇到这类问题时,可以先用cor()函数(分类变量可配合caret::findCorrelation())检查自变量间的相关性,快速定位共线性问题。另外,glmmTMB的rank-deficient警告通常源于变量冗余或部分分组无观测,优先排查变量间的依赖关系准没错。
内容的提问来源于stack exchange,提问作者Hannah Bauman

