R中含全量虚拟变量无常数项线性回归的正确R²计算方法
R中含隐式截距的无截距回归校正R²计算方法
R默认对无截距模型计算R²时,总平方和采用未中心化的
sum(y^2)而非常规的中心化总平方和sum((y - mean(y))^2)。你的模型包含一组加和为1的全量虚拟变量,本质存在隐式截距,默认计算逻辑不适用,因此会出现R²虚高的问题,和Stata未加hasconst选项的输出逻辑一致。
方法1:手动计算(和Stata hasconst结果完全匹配)
Stata的hasconst选项本质是把隐式截距等效为显式截距,采用中心化总平方和计算R²,具体计算步骤如下:
- 提取模型残差平方和SSE:直接调用拟合后模型的
deviance()属性即可 - 计算结果变量y的中心化总平方和SST:用y减去均值后平方求和
- 代入公式计算校正R²
对应代码示例:
# 拟合你原设定的无截距模型 mod <- lm(y ~ Tr1 + Tr2 + Tr3 + Tr4 + var1 + var2 + 0, data = df) # 计算校正R² sse <- deviance(mod) sst <- sum((df$y - mean(df$y))^2) r2_hasconst <- 1 - sse / sst # 如果需要计算调整R²,再补充自由度调整: n <- nrow(df) k <- length(coef(mod)) # 所有自变量的系数个数,包含4个虚拟变量、var1、var2 adjusted_r2_hasconst <- 1 - (sse/(n - k)) / (sst/(n - 1))
方法2:调整模型设定直接输出正确R²
你也可以修改模型设定避免额外计算:删掉任意1个虚拟变量、保留常数项,新模型和原模型的参数估计完全等价:
- 新模型的截距就是原模型中被删掉的那个虚拟变量的系数
- 剩余3个虚拟变量的系数就是原模型中对应变量和被删变量的系数差值
var1、var2的系数和原模型完全一致- 模型默认输出的R²就是和Stata
hasconst完全一致的正确结果
对应代码示例:
# 删掉Tr1保留常数项,拟合等价模型 mod_equivalent <- lm(y ~ Tr2 + Tr3 + Tr4 + var1 + var2, data = df) # 直接提取默认输出的R²即可 r2_correct <- summary(mod_equivalent)$r.squared
内容的提问来源于stack exchange,提问作者spalan
相关产品推荐
相关产品推荐

