跳至主要内容

简单线性回归:您需要知道的一切

学习简单线性回归。掌握模型方程,理解关键假设与诊断方法,并学会如何有效解读结果。
· 7分钟 阅读

使用 AI 探索

简单线性回归是统计学和机器学习中最基础的模型——当要探索两个变量之间的关系时,数据分析师首先会想到它。因此,如果您立志成为数据分析师或数据科学家,简单线性回归(以及回归分析整体)都值得深入掌握。

学习回归不仅因为它几乎在每个领域都是回答关键问题的宝贵技术,还因为它能为您打开深入理解许多其他主题的大门,比如假设检验、因果推断和预测。欢迎学习我们的R 回归入门课程和Python 中使用 statsmodels 的回归入门课程。

要点速览

  • 简单线性回归用一条直线建模 1 个自变量与 1 个连续因变量之间的关系:ŷ = b0 + b1x
  • 系数 b0(截距)和 b1(斜率)通过普通最小二乘法(OLS)估计,最小化残差平方和
  • 需要满足 4 个关键假设:线性关系、误差独立、同方差性、残差正态性
  • 在 Python 中,机器学习流程用 scikit-learn 的LinearRegression,若需 p 值和置信区间则用 statsmodels 的OLS
  • 在 R 中,lm()拟合模型,summary(model)返回完整回归表
  • 用 R²(解释方差比例)和 RMSE(原始量纲下的预测误差)评估拟合优度

什么是简单线性回归? 

简单线性回归是只有一个自变量(也称解释变量)和一个因变量(也称响应变量)的线性回归。在简单线性回归中,因变量是连续型的。 

普通最小二乘估计量 

进行简单线性回归最常见的方法是普通最小二乘(OLS)估计。由于 OLS 是最常用的方法,谈到简单线性回归时往往默认就是 OLS。

普通最小二乘通过最小化观测值(实际数据点)与回归线预测值之间差异的平方和来工作。这些差异称为残差,把它们平方可以确保正负残差被同等对待。 

简单线性回归的用途

简单线性回归有助于做出预测并理解关系,即一个自变量与一个因变量之间的联系。比如,您可能想知道树的高度(自变量)如何影响树叶数量(因变量)。通过收集数据并拟合简单线性回归模型,您可以基于树高预测叶子数量——这是“做预测”的部分。同时,这种方法也会揭示树高每增加一单位,叶子数量平均会变化多少,这就是用简单线性回归来理解变量关系。  

简单线性回归方程

我们先从几何或代数教材中常见的直线斜截式开始,然后再看简单线性回归方程。也就是说,从头开始。

slope-intercept equation

其中

  • m 是直线的斜率
  • b 是截距

在数据科学语境中,更常见的是下面这个方程: 

simple linear regression equation

其中

  • b0 是 y 轴截距 
  • b1 是斜率

使用 b0 和 b1 的记号帮助我们意识到此处是在对 y 做预测,因此记为 ŷ(读作 y-hat),因为我们并不指望回归线会穿过所有点。 

下图展示了左侧斜截式与右侧回归方程在概念上的差别。用线性代数的语言说,这是一个超定的线性方程组,意味着方程(大约三十个)多于未知数(两个),因此不指望能找到精确解。

slope-intercept form vs. simple linear regression斜截式 vs. 简单线性回归方程。图片作者自制

简单线性回归模型系数

如果仅使用斜截式,我们会先通过“升高/前进”(即两点间 y 的变化除以 x 的变化)计算斜率 m,再将某一点坐标代入方程解出 y 轴截距 b。最后一步给出直线与 y 轴的交点。

在回归中这行不通,因为没有一条线能穿过所有点,所以我们要寻找最优拟合线。斜率和截距都有闭式解。

斜率可以通过将相关系数 r 乘以 因变量 y 的标准差与自变量 x 的标准差之比来计算。这在直觉上合理,因为我们实质上是把相关系数转换回原变量的量纲。下式中,a 表示斜率,sy 和 sx 分别表示 y 与 x 的标准差。

simple linear regression slope equation

在计算出斜率后,可得到最优拟合线的截距。方法是用 x 的均值乘以斜率,再从 y 的均值中减去。在下式中,i 表示 y 截距,x 和 y 上的横线表示均值;我们常称它们为 x-bar 和 y-bar。

simple linear regression intercept equation

为求完整性,我们也可以用其他写法表示这些方程。请记住,标准差是方差的平方根,因此与其说 y 与 x 的标准差,我们也可以说它们的方差的平方根。方差本身是平方和的平均值。 

在上面的斜率方程中,a,我们也可以把 sy 和 sx 写成标准差的定义,并把相关系数 r 的长式写出来。进一步交叉相乘、化简并消去公因子后,可以得到下面这组斜率和截距的方程。这里的重点不是推导过程,而是强调两种写法本质相同,您可能会看到其中任意一种。 

simple linear regression slope and intercept equations

另一个有趣的结论是,简单线性回归线会经过中心点,即 x 的均值与 y 的均值。换言之,不管数据点如何分布,简单线性回归都会穿过自变量和因变量的均值点,这也赋予了它某种“平衡”特性。

求取简单线性回归系数的其他方法 

我们已经通过简洁方程求得了系数。这里进一步看看一些涉及线性代数和微积分的其他方法。尤其在编程环境中,通常采用更高级的技术,因为它们更快、更精确(利用平方来求方差可能降低数值精度)。

  • 线性代数:有一些线性代数技术可用于求解简单线性回归的系数。我们可以通过求解正规方程获得系数。正规方程有意思,但在大数据集上不太建议使用,因为涉及矩阵求逆,计算代价高。另一种线性代数方法是通过QR 分解求解,它不需要矩阵求逆,并且数值稳定性较好。
  • 微积分:可以对误差平方和(SSE)分别对斜率与截距求偏导,并令其为零来解出系数。这是一种方法。与微积分相关的另一种方法是梯度下降,这是一种迭代优化技术,用于最小化 SSE 并求出斜率和截距。梯度下降与微积分密切相关,因为它依赖梯度,即偏导数组成的向量。

简单线性回归模型的假设

现在来看简单线性回归的主要假设。如果这些假设被违反,我们可能需要考虑其他方法。尤其是前 3 条是假设很强,不能忽视。

  1. 线性关系:自变量与因变量之间必须是线性关系。如果是非线性关系,模型将难以刻画。
  2. 误差独立:残差应相互独立,不能存在模式或相关性。对于按时间排序的数据,这点尤需留意。
  3. 同方差性:在所有自变量取值范围内,残差应具有恒定方差。如果方差变化(异方差),则在某些 x 区间的预测会不够准确。
  4. 残差正态性:理想情况下残差应服从正态(高斯)分布。这对统计检验与置信度评估很重要,对纯预测则没那么关键。 

简单线性回归模型评估

假设我们建立了一个简单线性回归模型。如何判断拟合是否良好?可以查看诊断图和模型统计量。 

简单线性回归诊断图

诊断图帮助我们判断模型是否拟合良好、是否违反假设。若这些图中出现模式或偏离,就提示模型存在需要关注的问题或未被捕捉的信息。简单线性回归特有的一张诊断图是自变量值与残差的散点图,如下所示。其他图包括 Q-Q 图、尺度-位置图、观测序号 vs. Cook 距离等。 

simple linear regression diagnostic plotx 值 vs. 残差诊断图。图片作者自制

简单线性回归模型统计量

R-squared 与调整后的 R-squared量化自变量对因变量方差的解释程度。F 统计量检验模型整体显著性,系数的 p 值则反映单个预测变量的影响。 

如何解读简单线性回归模型

解读简单线性回归结果时,我们应准确描述自变量与因变量之间的关系。

如何解读斜率与截距

尤其需要谨慎表述两个关键组成部分:斜率与截距。

  • 截距表示回归线与 y 轴的交点。实际含义是当自变量为零时,因变量的取值。截距并非总是可解释的。在前面的树的例子中,模型可能会给出“树高为 0”时叶子数量的预测——在该情景下解读截距并无意义。 
  • 斜率表示自变量每增加 1 个单位,因变量的期望变化量。斜率为正表示正相关,斜率为负表示负相关。

一个重要提醒是相关不代表因果。即使熟悉这一点,分析师在解读简单线性回归时也可能因措辞不当而“翻车”。您不应说“树高导致叶子更多”,而应说“树高每增加一单位,与叶子数量增加若干相关”。 

另一个重要考虑是,超出数据范围进行外推可能不可靠。比如用树高预测叶子数量的模型,对极矮或极高的树可能并不准确,尤其是在建模时没有包含这些极端情况。 

如何看待变换

线性模型之所以称为线性,是因为它们在函数形式上是线性的。具体到简单线性回归,响应变量 y 与预测变量 x 的关系被建模为预测变量与常数项的线性组合。话虽如此,您可能会惊讶于简单线性回归能做的事。尽管模型假设变量之间是直线关系,但我们可以通过引入变换来刻画非线性关系。若需处理多项式形式的曲线,请参见我们的多项式回归教程。

例如,考虑按世代增长的祖先数量,这似乎呈指数式增长:双亲 2 人,祖父母 4 人,曾祖父母 8 人,等等。线性模型无法直接刻画指数增长,但若预测 log(y) 而非 y,即可把关系线性化。 

进一步思考会发现,祖先数量并不会无限指数增长,因为存在所谓的谱系塌缩(pedigree collapse):随着时间推移,远祖在家谱中多处重复出现,使增长率显著放缓。因此,取 log(y) 可能把模型“放大”过头。此时可以对 x 做平方根变换,生成新变量作为预测变量。需要强调的是,我并不是说这个模型一定正确或要完整解读它,而是想说明 log(y) 和 x 的平方根是非线性变换,但它们相对于系数仍以线性形式进入方程,因此依然是简单线性回归。  

R 与 Python 中的简单线性回归

下面分别看 R 和 Python 中的简单线性回归。

R 编程

R 使用内置的 lm() 函数完成简单线性回归——无需额外包。一次调用即可返回完整的系数、标准误、t 统计量和 p 值摘要。

手动计算斜率与截距

我们可以通过计算变量的均值与标准差自行求出系数。 

# Manually calculate the slope and intercept in R

# Sample data
X <- c(1, 2, 3, 4, 5)
y <- c(2, 4, 5, 4, 5)

# Calculate means
mean_X <- mean(X)
mean_y <- mean(y)

# Calculate standard deviations
sd_X <- sd(X)
sd_y <- sd(y)

# Calculate correlation
correlation <- cor(X, y)

# Calculate slope (b1) using the formula: b1 = (correlation * sd_y) / sd_X
slope <- (correlation * sd_y) / sd_X

# Calculate intercept (b0) using the formula: b0 = mean_y - slope * mean_X
intercept <- mean_y - slope * mean_X

# Print the slope and intercept
cat("Slope (b1):", slope, "\n")
cat("Intercept (b0):", intercept, "\n")

# Use the manually calculated coefficients to predict y values
y_pred <- intercept + slope * X
cat("Predicted values:", y_pred, "\n")

使用 lm() 函数

在 R 中,我们无需任何库即可调用 lm() 创建回归模型。 

# Fit the model 
model <- lm(y ~ X) 

# Print the summary of the regression 
summary(model)

Python

Python 进行简单线性回归主要有三条路径:使用 NumPy 手动计算;使用 statsmodels 做统计建模(可输出 p 值与置信区间);使用 scikit-learn 融入机器学习工作流。

手动计算斜率与截距

这里我们分别计算每个变量的均值和标准差。 

import numpy as np

# Sample data
X = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

# Calculate means
mean_X = np.mean(X)
mean_y = np.mean(y)

# Calculate standard deviations
sd_X = np.std(X, ddof=1)
sd_y = np.std(y, ddof=1)

# Calculate correlation
correlation = np.corrcoef(X, y)[0, 1]

# Calculate slope (b1) using the formula: b1 = (correlation * sd_y) / sd_X
slope = (correlation * sd_y) / sd_X

# Calculate intercept (b0) using the formula: b0 = mean_y - slope * mean_X
intercept = mean_y - slope * mean_X

# Print the slope and intercept
print(f"Slope (b1): {slope}")
print(f"Intercept (b0): {intercept}")

# Use the manually calculated coefficients to predict y values
y_pred = intercept + slope * X

print(f"Predicted values: {y_pred}")

使用 statsmodels

statsmodels 是进行简单线性回归的一个选项。

import statsmodels.api as sm

# Adding a constant for the intercept
X = sm.add_constant(X)

# Fit the model
model = sm.OLS(y, X)
results = model.fit()

# Print the summary of the regression
print(results.summary())

使用 scikit-learn

scikit-learn 是 Python 机器学习工作流中最常用的线性回归库。其 LinearRegression 类遵循全库统一的 fit()/predict() API,便于直接集成到流水线和交叉验证中。

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, root_mean_squared_error

# Sample data — scikit-learn expects X to be 2D
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
y = np.array([2, 4, 5, 4, 5])

# Fit the model
model = LinearRegression()
model.fit(X, y)

# Inspect coefficients
print(f"Intercept (b0): {model.intercept_:.4f}")
print(f"Slope (b1):     {model.coef_[0]:.4f}")

# Predict and evaluate
y_pred = model.predict(X)
print(f"R\u00b2:   {r2_score(y, y_pred):.4f}")
print(f"RMSE: {root_mean_squared_error(y, y_pred):.4f}")

与 statsmodels 的关键区别:scikit-learn 的 LinearRegression 不提供 p 值或置信区间,因为其设计目标是预测准确性而非统计推断。若需对系数做假设检验,请使用 statsmodels;若需把模型融入更大的机器学习流水线,请使用 scikit-learn。

简单线性回归、t 检验与 ANOVA

简单线性回归常用于假设检验,并在 t 检验与方差分析(ANOVA)中占据核心地位。 

简单线性回归与 t 检验

一项t 检验常用于判断回归线的斜率是否显著地不同于 0。该检验帮助我们理解自变量是否具有统计学上显著的影响。基本做法是提出原假设:回归线斜率等于 0,即不存在线性关系,然后用 t 检验进行评估。简单线性回归与此相关,因为当自变量为二元变量时,简单线性回归等价于均值差异检验(即 t 检验所做的事)。

简单线性回归与 ANOVA

方差分析(ANOVA)是一种用于评估模型整体拟合度、判断自变量是否能显著解释因变量方差的统计方法。其做法是将因变量的总方差划分为两个部分:由回归模型解释的方差(组间)与由残差或误差造成的方差(组内)。ANOVA 中的 F 检验本质上是在检验:作为整体的回归模型是否比没有任何预测变量的模型更好地拟合数据。以树高与树叶数量的例子为例,ANOVA 将帮助判断引入树高是否显著提升了我们预测叶子数量的能力。

OLS 简单线性回归的替代方案 

我们指出普通最小二乘是简单线性回归中最常见的估计方法,并在本文中主要聚焦 OLS。然而,需要考虑到 OLS 对异常值较为敏感,缺乏稳健性。添加一个高影响力或高杠杆的数据点,可能会显著改变回归线的斜率与截距。  

因此,存在一些非参数替代方案。下图展示了 OLS 与三种非参数方法:中位绝对偏差(MAD)、最小中位数平方(LMS)和 Theil–Sen。可以看到每种估计器得到的斜率与截距均不同。如果我们在坐标 x = 7、y = 70 处添加一个高影响点,OLS 回归线的变化将最大。

simple linear regression options四种简单线性回归选项。图片作者自制

结语

简单线性回归是更复杂预测模型的起点。若想更进一步,我们的Python 线性回归要点教程与如何在 R 中进行线性回归教程,均以真实数据集完整演示端到端流程。若您偏好系统课程,Python 线性建模入门将深入讲解使用 scipy、statsmodels 与 scikit-learn 的线性回归。

这些资源将引导您使用不同工具来进行线性回归并理解其应用。最后,若您已准备扩展技能,可查看我们的R 中的多元线性回归:实用教程,涵盖含多预测变量的更复杂模型。您也可以观看我们在 YouTube 上的 轻松学会在 Excel 中做回归视频,获取面向初学者、针对 Excel 的详细讲解。 

在 Excel 中进行简单线性回归
Josef Waples

作者

Josef Waples

我是数据科学编辑,曾为科学期刊发表的研究论文撰稿。我的兴趣领域包括线性代数、统计学、R 等相关主题。

简单线性回归常见问答

什么是简单线性回归?

简单线性回归是一种回归分析形式,涉及一个自变量(解释变量)和一个因变量(响应变量)。它用于在两者线性关系的基础上预测连续型结果。

简单线性回归的斜率如何计算?

斜率可通过将相关系数(r)乘以因变量标准差(sy)与自变量标准差(sx)之比来计算。这反映了自变量每变化一个单位时,因变量的期望变化量。

有哪些方法可以求回归模型的系数?

 简单线性回归的系数可通过普通最小二乘估计、求解正规方程(线性代数)、QR 分解,或使用梯度下降(微积分)等方法获得。

简单线性回归需要满足哪些假设?

 简单线性回归依赖多项假设。其一,变量关系必须线性;其二,残差应独立;其三,残差应具有恒定方差(同方差性);其四,残差理想情况下应近似正态分布。

如何评估一个简单线性回归模型?

您可以使用诊断图(如残差 vs. x 值、Q-Q 图)以及 R-squared、调整后的 R-squared、F 统计量等模型统计量来评估简单线性回归模型。这些工具有助于判断模型拟合程度及预测的可靠性。

简单线性回归与多元线性回归有何区别?

简单线性回归使用1 个自变量来预测因变量;多元线性回归使用2 个或更多自变量。两者都用 OLS 来拟合直线(或超平面),但多元回归能处理更复杂的关系,并需要额外检查预测变量之间的多重共线性。

简单线性回归的 4 个假设是什么?

4 个关键假设为:(1)线性关系——X 与 y 的关系为线性;(2)误差独立——残差之间不相关;(3)同方差性——残差方差在所有 X 的取值上恒定;(4)残差正态性——残差大致服从正态分布,这一点主要影响假设检验。前 3 项的违背比第 4 项更为严重。

如何在 Python 中运行简单线性回归?

最常见的方法是使用 scikit-learn:from sklearn.linear_model import LinearRegression; model = LinearRegression(); model.fit(X, y)。用 model.coef_ 查看斜率,用 model.intercept_ 查看截距。若需 p 值与置信区间,请改用 statsmodels:import statsmodels.api as sm; results = sm.OLS(y, sm.add_constant(X)).fit(); print(results.summary())。

在简单线性回归中,R-squared 表示什么?

R-squared(R²)衡量因变量方差中被自变量解释的比例。R² = 0.80 表示 x 解释了 y 80% 的方差。R² 取值范围为 0 到 1,越高表示拟合越好。在简单线性回归中,R² 等于 x 与 y 的皮尔逊相关系数的平方。

主题