如何在含协变量的lm模型中计算目标变量的解释方差?
线性回归中获取单个变量的单独方差贡献(偏R²)
问题说明
你在R中拟合了回归模型 lm(x ~ y + a + b + c),通过summary()只能拿到整体模型的R²,想知道变量y在控制其他协变量后单独解释的方差比例,之前尝试用sapply(model, function(x) summary(x)$r.squared)报错:Error in summary(x)$r.squared : $ operator is invalid for atomic vectors。
R²差值法的有效性
计算含y的完整模型和不含y的模型(lm(x ~ a + b + c))的R²差值,是完全有效的方法。这个差值就是y在排除a、b、c的影响后,单独为模型贡献的方差比例,也就是统计学里的偏R²。
实现方法
1. 手动计算(无需额外包)
# 拟合两个模型 full_model <- lm(x ~ y + a + b + c) no_y_model <- lm(x ~ a + b + c) # 提取各自的R²并计算差值 y_unique_r2 <- summary(full_model)$r.squared - summary(no_y_model)$r.squared y_unique_r2
2. 用工具包简化计算
用olsrr包直接算偏R²
这个包专门做线性回归诊断,能直接输出每个变量的偏R²:
# 安装加载包 install.packages("olsrr") library(olsrr) # 拟合模型后计算偏R² full_model <- lm(x ~ y + a + b + c) partial_r2_results <- ols_partial_r2(full_model) # 提取y的偏R² y_partial_r2 <- partial_r2_results[partial_r2_results$Variable == "y", "Partial R2"] y_partial_r2
用car包通过方差分析计算
car包的Anova()函数可以计算型II方差分析,通过平方和比例得到偏R²:
install.packages("car") library(car) full_model <- lm(x ~ y + a + b + c) anova_out <- Anova(full_model, type = "II") # 偏R² = y的平方和 / 总平方和 y_unique_r2 <- anova_out$`Sum Sq`["y"] / sum(anova_out$`Sum Sq`) y_unique_r2
关于你之前的错误
你用sapply报错是因为model是单个lm对象,不是模型列表。sapply是用来遍历列表/向量的,单个模型直接用summary(model)$r.squared就能拿到R²,不需要用sapply。
内容的提问来源于stack exchange,提问作者Elegance
相关产品推荐
相关产品推荐

