含交互项的GLM变量相对重要性与方差分解问题
含交互项广义线性模型(GLM)的变量相对重要性评估解答
1. GLM场景下R²的正确划分方法
你当前采用的「全模型R²减去移除目标项后模型R²」的计算逻辑属于边际方差分解,核心缺陷是对变量输入顺序高度敏感,且带交互项的场景下会出现贡献重复计算问题,不适用于相对重要性评估。
针对GLM(包括你需要用到的广义泊松GLM)的R²划分,目前行业通用的无偏方案是平均顺序贡献法(lmg法,也叫R²分割法):该方法会计算所有变量/项输入顺序下,每个项的平均方差贡献,自动解决主效应与交互项的共享变异分配问题,最终所有项的贡献总和会严格等于全模型R²。
你当前选择rsq包的type="v"类伪R²是合理的,这类方差解释型伪R²适配非高斯GLM的方差分解需求,无需更换指标。
实际计算无需手动做差,直接使用R的relaimpo包的calc.relimp()函数,指定type="lmg"即可自动完成带交互项的贡献划分,示例代码如下:
install.packages("relaimpo") library(relaimpo) # 基于你拟合的交互项GLM计算相对重要性 rel_imp_res <- calc.relimp(model, type = "lmg", rela = FALSE) # 输出各主效应、交互项的绝对R²贡献 rel_imp_res$lmg # 验证贡献总和与全模型R²一致 sum(rel_imp_res$lmg)
针对广义泊松GLM的适配,可以使用dominanceanalysis包,该包原生支持更多非高斯GLM子类的相对重要性计算,无需手动适配伪R²。
2. 分项R²总和与全模型R²存在差距的原因
你当前观测到的差距与共线性无关:你标准化后的VIF低于3,属于完全可接受的共线性水平,不会带来显著的估计偏差。差距来源主要有两点:
- 计算逻辑错误:你计算主效应贡献时同时移除了对应交互项,导致交互项的变异被分别计入了两个主效应的贡献,又单独计算了一次交互项贡献,出现了重复计数,最终总和自然与全模型R²存在偏差。
- 调整R²的惩罚机制:你使用了调整R²做差值计算,调整R²会根据模型自由度做惩罚,移除项后的模型自由度更高,调整R²的差值本身就不是对应项的真实边际贡献,引入了额外偏差。
此外即便你修正了计算逻辑,手动做差的边际R²只有在所有预测变量完全不相关时总和才会等于全模型R²,只要变量间存在哪怕极低的相关(你的测试数据中am与disp本身就存在负相关),就会产生共享变异无法分配的问题,这也是推荐使用平均顺序贡献法的核心原因。
内容的提问来源于stack exchange,提问作者M. Riera
相关产品推荐
相关产品推荐

