线性模型之所以称为线性,是因为它们在函数形式上是线性的。具体到简单线性回归,响应变量 y 与预测变量 x 的关系被建模为预测变量与常数项的线性组合。话虽如此,您可能会惊讶于简单线性回归能做的事。尽管模型假设变量之间是直线关系,但我们可以通过引入变换来刻画非线性关系。若需处理多项式形式的曲线,请参见我们的多项式回归教程。
进一步思考会发现,祖先数量并不会无限指数增长,因为存在所谓的谱系塌缩(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 interceptprint(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 regressionprint(results.summary())技术支持
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 coefficientsprint(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 将帮助判断引入树高是否显著提升了我们预测叶子数量的能力。
简单线性回归是统计学和机器学习中最基础的模型——当要探索两个变量之间的关系时,数据分析师首先会想到它。因此,如果您立志成为数据分析师或数据科学家,简单线性回归(以及回归分析整体)都值得深入掌握。
学习回归不仅因为它几乎在每个领域都是回答关键问题的宝贵技术,还因为它能为您打开深入理解许多其他主题的大门,比如假设检验、因果推断和预测。欢迎学习我们的R 回归入门课程和Python 中使用 statsmodels 的回归入门课程。
要点速览
LinearRegression,若需 p 值和置信区间则用 statsmodels 的OLSlm()拟合模型,summary(model)返回完整回归表什么是简单线性回归?
简单线性回归是只有一个自变量(也称解释变量)和一个因变量(也称响应变量)的线性回归。在简单线性回归中,因变量是连续型的。
普通最小二乘估计量
进行简单线性回归最常见的方法是普通最小二乘(OLS)估计。由于 OLS 是最常用的方法,谈到简单线性回归时往往默认就是 OLS。
普通最小二乘通过最小化观测值(实际数据点)与回归线预测值之间差异的平方和来工作。这些差异称为残差,把它们平方可以确保正负残差被同等对待。
简单线性回归的用途
简单线性回归有助于做出预测并理解关系,即一个自变量与一个因变量之间的联系。比如,您可能想知道树的高度(自变量)如何影响树叶数量(因变量)。通过收集数据并拟合简单线性回归模型,您可以基于树高预测叶子数量——这是“做预测”的部分。同时,这种方法也会揭示树高每增加一单位,叶子数量平均会变化多少,这就是用简单线性回归来理解变量关系。
简单线性回归方程
我们先从几何或代数教材中常见的直线斜截式开始,然后再看简单线性回归方程。也就是说,从头开始。
其中
在数据科学语境中,更常见的是下面这个方程:
其中
使用 b0 和 b1 的记号帮助我们意识到此处是在对 y 做预测,因此记为 ŷ(读作 y-hat),因为我们并不指望回归线会穿过所有点。
下图展示了左侧斜截式与右侧回归方程在概念上的差别。用线性代数的语言说,这是一个超定的线性方程组,意味着方程(大约三十个)多于未知数(两个),因此不指望能找到精确解。
简单线性回归模型系数
如果仅使用斜截式,我们会先通过“升高/前进”(即两点间 y 的变化除以 x 的变化)计算斜率 m,再将某一点坐标代入方程解出 y 轴截距 b。最后一步给出直线与 y 轴的交点。
在回归中这行不通,因为没有一条线能穿过所有点,所以我们要寻找最优拟合线。斜率和截距都有闭式解。
斜率可以通过将相关系数 r 乘以 因变量 y 的标准差与自变量 x 的标准差之比来计算。这在直觉上合理,因为我们实质上是把相关系数转换回原变量的量纲。下式中,a 表示斜率,sy 和 sx 分别表示 y 与 x 的标准差。
在计算出斜率后,可得到最优拟合线的截距。方法是用 x 的均值乘以斜率,再从 y 的均值中减去。在下式中,i 表示 y 截距,x 和 y 上的横线表示均值;我们常称它们为 x-bar 和 y-bar。
为求完整性,我们也可以用其他写法表示这些方程。请记住,标准差是方差的平方根,因此与其说 y 与 x 的标准差,我们也可以说它们的方差的平方根。方差本身是平方和的平均值。
在上面的斜率方程中,a,我们也可以把 sy 和 sx 写成标准差的定义,并把相关系数 r 的长式写出来。进一步交叉相乘、化简并消去公因子后,可以得到下面这组斜率和截距的方程。这里的重点不是推导过程,而是强调两种写法本质相同,您可能会看到其中任意一种。
另一个有趣的结论是,简单线性回归线会经过中心点,即 x 的均值与 y 的均值。换言之,不管数据点如何分布,简单线性回归都会穿过自变量和因变量的均值点,这也赋予了它某种“平衡”特性。
求取简单线性回归系数的其他方法
我们已经通过简洁方程求得了系数。这里进一步看看一些涉及线性代数和微积分的其他方法。尤其在编程环境中,通常采用更高级的技术,因为它们更快、更精确(利用平方来求方差可能降低数值精度)。
简单线性回归模型的假设
现在来看简单线性回归的主要假设。如果这些假设被违反,我们可能需要考虑其他方法。尤其是前 3 条是假设很强,不能忽视。
简单线性回归模型评估
假设我们建立了一个简单线性回归模型。如何判断拟合是否良好?可以查看诊断图和模型统计量。
简单线性回归诊断图
诊断图帮助我们判断模型是否拟合良好、是否违反假设。若这些图中出现模式或偏离,就提示模型存在需要关注的问题或未被捕捉的信息。简单线性回归特有的一张诊断图是自变量值与残差的散点图,如下所示。其他图包括 Q-Q 图、尺度-位置图、观测序号 vs. Cook 距离等。
简单线性回归模型统计量
R-squared 与调整后的 R-squared量化自变量对因变量方差的解释程度。F 统计量检验模型整体显著性,系数的 p 值则反映单个预测变量的影响。
如何解读简单线性回归模型
解读简单线性回归结果时,我们应准确描述自变量与因变量之间的关系。
如何解读斜率与截距
尤其需要谨慎表述两个关键组成部分:斜率与截距。
一个重要提醒是相关不代表因果。即使熟悉这一点,分析师在解读简单线性回归时也可能因措辞不当而“翻车”。您不应说“树高导致叶子更多”,而应说“树高每增加一单位,与叶子数量增加若干相关”。
另一个重要考虑是,超出数据范围进行外推可能不可靠。比如用树高预测叶子数量的模型,对极矮或极高的树可能并不准确,尤其是在建模时没有包含这些极端情况。
如何看待变换
线性模型之所以称为线性,是因为它们在函数形式上是线性的。具体到简单线性回归,响应变量 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 值摘要。手动计算斜率与截距
我们可以通过计算变量的均值与标准差自行求出系数。
使用 lm() 函数
在 R 中,我们无需任何库即可调用
lm()创建回归模型。Python
Python 进行简单线性回归主要有三条路径:使用 NumPy 手动计算;使用 statsmodels 做统计建模(可输出 p 值与置信区间);使用 scikit-learn 融入机器学习工作流。
手动计算斜率与截距
这里我们分别计算每个变量的均值和标准差。
使用 statsmodels
statsmodels是进行简单线性回归的一个选项。使用 scikit-learn
scikit-learn 是 Python 机器学习工作流中最常用的线性回归库。其
LinearRegression类遵循全库统一的fit()/predict()API,便于直接集成到流水线和交叉验证中。与 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 回归线的变化将最大。结语
简单线性回归是更复杂预测模型的起点。若想更进一步,我们的Python 线性回归要点教程与如何在 R 中进行线性回归教程,均以真实数据集完整演示端到端流程。若您偏好系统课程,Python 线性建模入门将深入讲解使用 scipy、statsmodels 与 scikit-learn 的线性回归。
这些资源将引导您使用不同工具来进行线性回归并理解其应用。最后,若您已准备扩展技能,可查看我们的R 中的多元线性回归:实用教程,涵盖含多预测变量的更复杂模型。您也可以观看我们在 YouTube 上的 轻松学会在 Excel 中做回归视频,获取面向初学者、针对 Excel 的详细讲解。