R语言线性回归:虚拟编码方式不同引发结果差异的问题
线性回归中分类变量编码方式对连续预测变量系数的影响问题
问题背景
我正在开展包含一个连续预测变量(ContX)和一个二分类预测变量的线性回归分析。将分类变量同时以命名因子("Control"和"BD")、虚拟编码因子("0"和"1")的形式纳入模型后,发现仅连续预测变量ContX的效应结果存在差异,但分类变量与交互项的结果完全一致。
我的CSV数据包含两列分组信息:"Group"列记录样本分组(Control、BD),GrpNum列是对应的虚拟编码(0=Control)。即使改用反向虚拟编码(1=Control,0=BD),问题依然存在,但通过is.ordered()检查确认所有因子均为无序因子。
我理解分组顺序会改变截距,但这不是核心问题——我关心的是不同编码下ContX的系数值和显著性出现了明显差异。
示例输出对比
模型1:使用GrpNum(0=Control)
> lmtest1 <- lm(Outcome ~ GrpNum * ContX, data = data) > summary(lmtest1) Call: lm(formula = Outcome ~ GrpNum * ContX, data = data) Residuals: Min 1Q Median 3Q Max -9.1330 -3.7301 0.0448 4.1718 11.1743 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -13.7037 4.2195 -3.248 0.00202 ** GrpNum 14.0967 5.1699 2.727 0.00865 ** ContX 0.4670 0.1364 3.423 0.00120 ** GrpNum:ContX -0.4179 0.1639 -2.550 0.01372 * --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 5.111 on 53 degrees of freedom (9 observations deleted due to missingness) Multiple R-squared: 0.2008, Adjusted R-squared: 0.1556 F-statistic: 4.44 on 3 and 53 DF, p-value: 0.007413
此处ContX的系数为0.4670,具有统计学显著性。
模型2:使用GrpNum2(反向编码,1=Control)
> lmtest2 <- lm(Outcome ~ GrpNum2 * ContX, data = data) > summary(lmtest2) Call: lm(formula = Outcome ~ GrpNum2 * ContX, data = data) Residuals: Min 1Q Median 3Q Max -9.1330 -3.7301 0.0448 4.1718 11.1743 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.39294 2.98729 0.132 0.89585 GrpNum2 -14.09666 5.16990 -2.727 0.00865 ** ContX 0.04908 0.09087 0.540 0.59137 GrpNum2:ContX 0.41791 0.16392 2.550 0.01372 * --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 5.111 on 53 degrees of freedom (9 observations deleted due to missingness) Multiple R-squared: 0.2008, Adjusted R-squared: 0.1556 F-statistic: 4.44 on 3 and 53 DF, p-value: 0.007413
此处ContX的系数为0.0490,无统计学显著性。
因子类型验证
> is.ordered(data$GrpNum) [1] FALSE > is.ordered(data$GrpNum2) [1] FALSE > is.ordered(data$Group) [1] FALSE
所有因子均为无序因子。
复现代码
GrpNum1 <- as.factor(rep(c(1,0), 20)) GrpNum2 <- as.factor(rep(c(0,1), 20)) Outcome <- rnorm(40, 0, 1) ContX <- rnorm(40, 10, 5) data <- data.frame(GrpNum1, GrpNum2, Outcome, ContX) lmtest1 <- lm(Outcome ~ GrpNum1 * ContX, data = data) lmtest2 <- lm(Outcome ~ GrpNum2 * ContX, data = data) summary(lmtest1) summary(lmtest2)
内容的提问来源于stack exchange,提问作者okaywell
相关产品推荐
相关产品推荐

