Skip to content

R - 线性回归

线性回归是一种基础统计方法,用于建模因变量(响应变量)与一个或多个自变量(预测变量)之间的关系。它旨在找到穿过数据点的最佳拟合直线。

简单线性回归的通用方程是:y = β₀ + β₁x + ε,其中 y 是响应变量,x 是预测变量,β₀ 是截距,β₁ 是斜率,ε 是误差项。R 的核心函数 lm() 是进行此操作的标准方法,但我们将使用 tidyverse 和 broom 包来增强我们的工作流程,以实现现代方法。

一个典型的回归分析项目遵循以下步骤:

  • 1. 数据准备:收集数据并将其组织成数据框。
  • 2. 探索性分析:可视化变量之间的关系(例如,使用散点图)。
  • 3. 模型拟合:使用 lm() 函数创建回归模型。
  • 4. 模型解释:分析模型的摘要以理解系数和模型拟合度。
  • 5. 模型诊断:检查模型的假设以确保其有效性。
  • 6. 预测:使用训练好的模型预测新数据的结果。

让我们建模一个人的身高(预测变量)和体重(响应变量)之间的关系。

# 加载必要的现代包
# install.packages(c("tidyverse", "broom"))
library(tidyverse)
library(broom)
# 步骤 1:将数据准备成 tibble(一种现代数据框)
height_weight_data <- tibble(
height_cm = c(151, 174, 138, 186, 128, 136, 179, 163, 152, 131),
weight_kg = c(63, 81, 56, 91, 47, 57, 76, 72, 62, 48)
)
# 步骤 2:使用 ggplot2 通过散点图探索数据
ggplot(height_weight_data, aes(x = height_cm, y = weight_kg)) +
geom_point() +
labs(
title = "Relationship between Height and Weight",
x = "Height (cm)",
y = "Weight (kg)"
) +
theme_minimal()

散点图应该显示出正向线性趋势,表明随着身高增加,体重也倾向于增加。

我们使用 lm() 拟合模型。公式 weight_kg ~ height_cm 可读作“将体重建模为身高的函数”。

# 步骤 3:拟合线性模型
model <- lm(weight_kg ~ height_cm, data = height_weight_data)
# 步骤 4:使用 summary() 解释模型
summary(model)

summary() 的输出信息丰富:

Call:
lm(formula = weight_kg ~ height_cm, data = height_weight_data)
Residuals:
Min 1Q Median 3Q Max
-3.9775 -1.8944 -0.0412 1.6629 6.3002
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -38.45509 8.04901 -4.778 0.00139 **
height_cm 0.67461 0.05191 12.997 1.16e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 3.253 on 8 degrees of freedom
Multiple R-squared: 0.9548, Adjusted R-squared: 0.9491
F-statistic: 168.9 on 1 and 8 DF, p-value: 1.164e-06

摘要的关键点:

  • 系数:截距(-38.45)和 height_cm(0.67)给出了我们的回归方程:weight_kg = -38.45 + 0.67 * height_cm。
  • P 值 (Pr(>|t|)): height_cm 的 p 值非常小(1.16e-06),表明它是体重的一个统计学上显著的预测变量。
  • 多重 R 平方:0.9548 意味着在我们的模型中,大约 95.5% 的体重变异可以由身高解释,这是一个非常好的拟合。

broom 包可以将模型输出整理成数据框,这非常适合报告和进一步分析。

# 获取模型系数的整洁 tibble
tidy(model)
# 获取模型级别统计量的 tibble
glance(model)

ggplot2 可以轻松地将回归线叠加到散点图上。

ggplot(height_weight_data, aes(x = height_cm, y = weight_kg)) +
geom_point(color = "blue", size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "red") + # 添加回归线
labs(
title = "Height & Weight Regression",
x = "Height in cm",
y = "Weight in Kg"
) +
theme_bw()

使用 predict() 函数估计具有新身高的人的体重。最佳实践是提供与预测变量具有相同列名的新数据框。

# 为新的观测值创建一个数据框
new_height <- tibble(height_cm = 170)
# 预测体重
predicted_weight <- predict(model, newdata = new_height)
print(predicted_weight)

这将输出身高 170 厘米的人的预测体重。

1
76.22869
  • 模型诊断:一个关键步骤是检查线性回归的假设(线性、独立性、残差正态性及等方差性)。您可以通过绘制模型对象来完成此操作:par(mfrow = c(2, 2)); plot(model)。broom 包中的 augment() 函数也非常适合创建用于诊断图的数据框。
  • 多元回归:您可以使用公式中的 + 号向模型中添加更多预测变量,例如 lm(y ~ x1 + x2, data = df)。
  • 团队协作:使用像 Git 这样的版本控制工具来跟踪 R 脚本的更改。使用像 renv 这样的工具来管理项目特定的包依赖关系,确保您的分析可以被他人重现。