如何调整线性模型对比编码实现所有因子水平与总均值比较
线性模型因子水平与总均值显著性检验的对比编码配置
现有默认编码方案的问题
当前调整线性模型对比编码的核心目标,是实现分类因子所有水平与总均值的显著性差异检验,两类常用默认编码均无法满足需求:
- 对照-处理对比(control-treatment contrasts):默认将因子第一个水平设为参考组,模型摘要仅输出其余水平和参考水平的比较结果,参考水平本身的检验结果不会展示,无法覆盖所有因子水平。
- 偏差编码(Deviation coding,即R内置
contr.sum对应的编码规则):为满足模型可识别性要求,会自动省略最后一个因子水平的对比项,该水平的检验结果不会出现在输出中;同时输出的系数会以x1/x2这类序号命名,无法直接对应原始因子的水平名称,使用体验很差。
默认偏差编码运行示例
测试代码如下:
set.seed(1) y <- rnorm(6, 0, 1) x <- factor(rep(LETTERS[1:3], each = 2)) fit <- lm(y ~ x, contrasts = list(x = contr.sum)) summary(fit)
运行结果:
Call: lm(formula = y ~ x, contrasts = list(x = contr.sum)) Residuals: 1 2 3 4 5 6 -0.405 0.405 -1.215 1.215 0.575 -0.575 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.02902 0.46809 -0.062 0.954 x1 -0.19239 0.66198 -0.291 0.790 x2 0.40885 0.66198 0.618 0.581 Residual standard error: 1.147 on 3 degrees of freedom Multiple R-squared: 0.1129, Adjusted R-squared: -0.4785 F-statistic: 0.1909 on 2 and 3 DF, p-value: 0.8355
可以看到结果里仅展示了两个因子系数,对应A、B水平与总均值的差异,C水平的结果被默认省略,且系数名没有直接关联水平名。
实现方案
不需要额外构造取值等于总均值的虚拟变量,仅需手动调整对比矩阵即可实现需求:
- 先用
contr.sum生成基础偏差编码矩阵,给矩阵列手动命名为对应因子的前k-1个水平名 - 给矩阵补全最后一个水平的对比行,按照偏差编码规则填充为全-1,再传入模型的
contrasts参数 - 模型拟合完成后,可通过系数间的线性关系推导被省略的最后一个水平的效应值、标准误与p值,本质是对模型参数做重新参数化,不会改变模型整体拟合结果与自由度,也不会引入共线性问题。
此前已有同类问题给出过可直接运行的实现代码,相关统计原理可参考专业统计问答社区的讨论内容。
内容的提问来源于stack exchange,提问作者Adam_G
相关产品推荐
相关产品推荐

