You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在含协变量的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:50:08