回归分析是一种用于研究因变量(目标)和自变量(预测器)之间关系的预测性建模技术,常用于预测分析、时间序列建模和探索变量间的因果关系。它通过拟合曲线或直线,使得模型与数据点的差异最小,从而揭示变量之间的相互关系。在经济学和数据分析中,回归模型广泛应用于量化解释变量(自变量)对被解释变量(因变量)的影响。一元线性回归模型是仅包含一个自变量的回归模型,其目标是通过建立一个线性方程,表达自变量\(X\)和因变量\(Y\)之间的关系,并通过最小二乘法估计模型参数,随后对这些参数进行显著性检验,评估模型的合理性和有效性。
一、一元回归模型的数学表达
一元线性回归分析,是根据自变量x和因变量Y的相关关系,建立x与Y的线性回归方程进行预测的方法。由于市场现象一般是受多种因素的影响,而并不是仅仅受一个因素的影响。所以应用一元线性回归分析预测法,必须对影响市场现象的多种因素做全面分析。只有当诸多的影响因素中,确实存在一个对因变量影响作用明显高于其他因素的变量,才能将它作为自变量,应用一元相关回归分析市场预测法进行预测。一元线性回归是通过一条直线来拟合这些数据点,使得各个数据点到直线距离的累积最小,如下图所示。
一元线性回归模型的基本形式为:
\[Y = \beta_0 + \beta_1 X + \epsilon \]其中:
- $ Y $ 为因变量,即我们希望通过模型解释或预测的目标变量。
- $ X $ 为自变量,即用来解释 $ Y $ 变化的变量。
- $ \beta_0 $ 为截距项,表示当 $ X = 0 $ 时,$ Y $ 的期望值。
- $ \beta_1 $ 为回归系数,表示自变量每增加一个单位时,因变量的平均变化量。
- $ \epsilon $ 为误差项,用来表示因变量中无法被自变量解释的部分。
回归模型的核心目的是估计\(\beta_0\) 和 \(\beta_1\),并通过这些估计值建立起 \(X\) 和 \(Y\) 之间的预测关系。
1.1 最小二乘法(OLS)求解
在回归分析中,最小二乘法(OLS) 是用于估计回归系数 $ \beta_0 $ 和 $ \beta_1 $ 的一种常用方法。OLS 的基本思想是通过最小化预测值与实际观测值之间的误差平方和,来找到最优的回归系数。
假设我们有一组观测数据:$ (X_1, Y_1), (X_2, Y_2), \dots, (X_n, Y_n) $,其中 $ n $ 是样本量。对于每一个观测点 $ i $,模型预测的 $ Y $ 值为:
\[\hat{Y}_i = \beta_0 + \beta_1 X_i \]实际值和预测值之间的误差 $ e_i $ 为:
\[e_i = Y_i - \hat{Y}_i = Y_i - (\beta_0 + \beta_1 X_i) \]最小二乘法通过最小化误差的平方和(即残差平方和,SSE)来确定最佳的回归系数:
\[S(\beta_0, \beta_1) = \sum_{i=1}^{n} (Y_i - (\beta_0 + \beta_1 X_i))^2 \]通过对 $ S(\beta_0, \beta_1) $ 分别对 $ \beta_0 $ 和 $ \beta_1 $ 求偏导,并令其等于零,可以得到最小二乘法的解:
\[\hat{\beta_1} = \frac{\sum_{i=1}^{n}(X_i - \bar{X})(Y_i - \bar{Y})}{\sum_{i=1}^{n}(X_i - \bar{X})^2} \]\[\hat{\beta_0} = \bar{Y} - \hat{\beta_1} \bar{X} \]其中,$ \hat{\beta_1} $ 和 $ \hat{\beta_0} $ 分别是 $ \beta_1 $ 和 $ \beta_0 $ 的估计值,$ \bar{X} $ 和 $ \bar{Y} $ 是 $ X $ 和 $ Y $ 的均值。
这个公式表明,$ \hat{\beta_1} $ 是通过 $ X $ 和 $ Y $ 的协方差与 $ X $ 的方差来确定的,而 $ \hat{\beta_0} $ 则是通过 $ \hat{\beta_1} $ 调整后的均值差异来确定。
1.2 模型的参数估计与检验
在估计出回归系数 $ \hat{\beta_0} $ 和 $ \hat{\beta_1} $ 之后,我们需要对它们的可靠性进行检验,以判断模型的有效性。
标准误差
标准误差是用于衡量回归系数估计值精度的一个指标。系数的标准误差越小,意味着估计值越精确。
$ \beta_1 $ 的标准误差公式为:
其中,$ \sigma^2 $ 是误差项 $ \epsilon $ 的方差。对于 $ \beta_0 $,其标准误差的计算稍微复杂,反映了它在样本均值 $ \bar{X} $ 附近的不确定性:
\[SE(\hat{\beta_0}) = \sqrt{\sigma^2 \left( \frac{1}{n} + \frac{\bar{X}^2}{\sum_{i=1}^{n}(X_i - \bar{X})^2} \right)} \]t 检验
t 检验用于检验回归系数是否显著不为零。检验假设为:
- \(H_0\):自变量对因变量没有显著影响,\(\beta_1 = 0\)。
- \(H_1\):自变量对因变量有显著影响,\(\beta_1 \neq 0\)。
t 检验的统计量为:
通过查找 t 分布表,判断该 t 值是否大于临界值。如果 t 值大于临界值,则拒绝原假设,认为自变量对因变量有显著影响。
显著性水平与置信区间
在回归分析中,我们通常使用显著性水平($ \alpha $)来衡量结果的可靠性。常用的显著性水平有 1%、5%、10% 等。此外,回归系数的置信区间也能为我们提供估计的可信范围。置信区间的计算公式为:
\[\text{置信区间} = \hat{\beta_1} \pm t_{\alpha/2, n-2} \cdot SE(\hat{\beta_1}) \]通过计算回归系数的置信区间,我们可以在 $ 1 - \alpha $ 的置信水平下,推断真实系数的可能范围。
F 检验
F 检验用于检验整个回归模型的显著性,特别是在多元回归中尤为重要。在一元回归中,F 检验的结果与 t 检验结果是一致的。F 检验的统计量为:
\[F = \frac{\text{回归平方和 / 自由度}}{\text{残差平方和 / 自由度}} \]通过比较 F 值与临界值,可以判断自变量是否显著影响因变量。
二、回归模型的评估
在估计出回归系数并进行检验后,我们还需要评估回归模型的整体拟合效果。以下几种指标可以用来衡量模型的适用性。
2.1. R平方(R-squared)
R平方是衡量模型解释能力的重要指标,取值范围为0到1,值越接近1,说明模型解释力越强,其实就是相关系数的平方。R平方的计算公式为:
\[R^2 = 1 - \frac{\text{残差平方和}}{\text{总平方和}} \]R平方越高,表明自变量 $ X $ 对因变量 $ Y $ 的解释能力越强。
2.2 残差分析
通过分析模型的残差,我们可以评估模型是否存在系统性误差。绘制残差图可以直观地观察残差的分布情况。如果残差呈现随机分布,则表明模型拟合较好;如果残差有明显的模式或趋势,说明模型可能存在问题。
2.3 Durbin-Watson 检验
Durbin-Watson 检验用于检测残差之间是否存在自相关性,特别是在时间序列数据中,残差自相关会导致估计结果偏差。Durbin-Watson 统计量的取值范围为0到4,值接近2表明不存在自相关,接近0或4则表明存在正相关或负相关。在一元回归中这个指标没有判定价值。
三、回归分析示例
例1 一家保险公司收集了每周加班时间和新保单签发的数据,数据如下表:
周序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
\(x\) (单位:小时) | 825 | 215 | 1070 | 550 | 480 | 920 | 1350 | 325 | 670 | 1215 |
\(y\) (单位:新签保单数) | 3.5 | 1.0 | 4.0 | 2.0 | 1.0 | 3.0 | 4.5 | 1.5 | 3.0 | 5.0 |
拟讨论这两个变量之间是否有显著的回归关系,以便对加班时间进行控制与管理。
3.1 散点图直观分析
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams
# 设置中文字体支持
rcParams['font.sans-serif'] = ['SimHei'] # 用SimHei显示中文
rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题
# 数据
x = np.array([825, 215, 1070, 550, 480, 920, 1350, 325, 670, 1215])
y = np.array([3.5, 1.0, 4.0, 2.0, 1.0, 3.0, 4.5, 1.5, 3.0, 5.0])
# 创建图形
plt.scatter(x, y, color='blue', marker='o')
# 添加标题和标签
plt.title("数据散点图")
plt.xlabel("x 轴")
plt.ylabel("y 轴")
# 显示图形
plt.tight_layout()
plt.show()
观察发现数据之间具有很好的相关关系,计算其相关系数为0.9489428,可以进一步探索他们之间的回归关系。
3.2 回归方程和回归曲线
在Python语言中,使用lm函数可以非常容易地求出回归方程,用它来拟合线性模型,可以进行回归、方差分析和协方差分析。
import numpy as np
import matplotlib.pyplot as plt
# 数据
x = np.array([825, 215, 1070, 550, 480, 920, 1350, 325, 670, 1215])
y = np.array([3.5, 1.0, 4.0, 2.0, 1.0, 3.0, 4.5, 1.5, 3.0, 5.0])
# 拟合回归模型
coefficients = np.polyfit(x, y, 1)
slope, intercept = coefficients
# 绘制散点图和回归直线
plt.scatter(x, y, color='blue', label='数据点')
plt.plot(x, slope * x + intercept, color='red', label=f'拟合线: y={slope:.2f}x + {intercept:.2f}')
# 添加图表标题和标签
plt.title("数据散点图和拟合回归线")
plt.xlabel("x 轴")
plt.ylabel("y 轴")
plt.legend()
# 显示图形
plt.tight_layout()
plt.show()
# 输出回归方程
print(f"回归方程: y = {slope:.2f}x + {intercept:.2f}")
回归方程: y = 0.00x + 0.12
3.3 方差分析和回归系数检验
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
# 数据
x = np.array([825, 215, 1070, 550, 480, 920, 1350, 325, 670, 1215])
y = np.array([3.5, 1.0, 4.0, 2.0, 1.0, 3.0, 4.5, 1.5, 3.0, 5.0])
# 添加常数项(截距)
x_with_constant = sm.add_constant(x)
# 拟合回归模型
model = sm.OLS(y, x_with_constant)
results = model.fit()
# 输出回归结果表
print(results.summary())
# 绘制散点图和回归直线
plt.scatter(x, y, color='blue', label='数据点')
plt.plot(x, results.predict(x_with_constant), color='red', label=f'拟合线: y = {results.params[1]:.2f}x + {results.params[0]:.2f}')
# 添加图表标题和标签
plt.title("数据散点图和拟合回归线")
plt.xlabel("x 轴")
plt.ylabel("y 轴")
plt.legend()
# 显示图形
plt.tight_layout()
plt.show()
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.900
Model: OLS Adj. R-squared: 0.888
Method: Least Squares F-statistic: 72.40
Date: Sun, 20 Oct 2024 Prob (F-statistic): 2.79e-05
Time: 15:54:01 Log-Likelihood: -5.7345
No. Observations: 10 AIC: 15.47
Df Residuals: 8 BIC: 16.07
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.1181 0.355 0.333 0.748 -0.701 0.937
x1 0.0036 0.000 8.509 0.000 0.003 0.005
==============================================================================
Omnibus: 0.930 Durbin-Watson: 0.753
Prob(Omnibus): 0.628 Jarque-Bera (JB): 0.754
Skew: -0.525 Prob(JB): 0.686
Kurtosis: 2.160 Cond. No. 1.97e+03
==============================================================================
3.4 残差分析
import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
import scipy.stats as stats
# 数据
x = np.array([825, 215, 1070, 550, 480, 920, 1350, 325, 670, 1215])
y = np.array([3.5, 1.0, 4.0, 2.0, 1.0, 3.0, 4.5, 1.5, 3.0, 5.0])
# 添加常数项(截距)
x_with_constant = sm.add_constant(x)
# 拟合回归模型
model = sm.OLS(y, x_with_constant)
results = model.fit()
# 残差
residuals = results.resid
# 1. 绘制残差图(残差 vs 拟合值)
plt.figure(figsize=(10, 6))
plt.scatter(results.fittedvalues, residuals, color='blue')
plt.axhline(y=0, color='red', linestyle='--')
plt.title("残差图: 残差 vs 拟合值")
plt.xlabel("拟合值")
plt.ylabel("残差")
plt.tight_layout()
plt.show()
# 2. 残差的正态性检验 (Q-Q 图)
plt.figure(figsize=(10, 6))
sm.qqplot(residuals, line='s')
plt.title("残差的 Q-Q 图")
plt.tight_layout()
plt.show()
# 3. Durbin-Watson 检验 (检测残差的自相关性)
dw_value = sm.stats.stattools.durbin_watson(residuals)
print(f"Durbin-Watson 值: {dw_value:.2f}")
# 4. Shapiro-Wilk 正态性检验
shapiro_test = stats.shapiro(residuals)
print(f"Shapiro-Wilk 正态性检验的 p 值: {shapiro_test.pvalue:.4f}")
# 输出回归结果
print(results.summary())
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.900
Model: OLS Adj. R-squared: 0.888
Method: Least Squares F-statistic: 72.40
Date: Sun, 20 Oct 2024 Prob (F-statistic): 2.79e-05
Time: 15:57:24 Log-Likelihood: -5.7345
No. Observations: 10 AIC: 15.47
Df Residuals: 8 BIC: 16.07
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.1181 0.355 0.333 0.748 -0.701 0.937
x1 0.0036 0.000 8.509 0.000 0.003 0.005
==============================================================================
Omnibus: 0.930 Durbin-Watson: 0.753
Prob(Omnibus): 0.628 Jarque-Bera (JB): 0.754
Skew: -0.525 Prob(JB): 0.686
Kurtosis: 2.160 Cond. No. 1.97e+03
==============================================================================
3.5 回归预测
# 虚构的 5 期 x 值
new_x = np.array([1400, 1600, 1800, 2000, 2200])
# 添加常数项(截距)
new_x_with_constant = sm.add_constant(new_x)
# 使用之前拟合的模型预测新的 y 值
predicted_y = results.predict(new_x_with_constant)
# 输出预测结果
for i, (x_val, y_pred) in enumerate(zip(new_x, predicted_y), 1):
print(f"第{i}期: x = {x_val}, 预测的 y = {y_pred:.2f}")
第1期: x = 1400, 预测的 y = 5.14
第2期: x = 1600, 预测的 y = 5.85
第3期: x = 1800, 预测的 y = 6.57
第4期: x = 2000, 预测的 y = 7.29
第5期: x = 2200, 预测的 y = 8.01
例2:中国全体居民的消费水平与经济发展数量关系的分析。随着中国经济的快速发展,人民生活水平不断提高,居民的消费水平也在不断增长。研究中国全体居民的消费水平与经济发展的数量关系,对于探寻居民消费增长的规律性,预测居民消费的发展趋势有重要意义。影响居民人均消费水平的因素有多种,但从理论和经验分析,最主要的影响因素应是经济发展水平。从理论上说经济发展水平越高,居民消费越多,这里选择:被解释变量选择能代表城乡所有居民消费的“全体居民人均年消费水平”(元/人);解释变量选择表现经济增长水平的“人均国民生产总值(人均GDP)”(元/人)。数据来源:1978年至2007年中国“全体居民人均年消费水平”与“人均国内生产总值(人均GDP)” 的时间序列数据。
年份 | 全体居民消费水平(元)Y | 人均GDP(元)X | 年份 | 全体居民消费水平(元)Y | 人均GDP(元)X | 年份 | 全体居民消费水平(元)Y | 人均GDP(元)X |
---|---|---|---|---|---|---|---|---|
1978 | 184 | 381 | 1979 | 208 | 419 | 1980 | 238 | 463 |
1981 | 264 | 492 | 1982 | 288 | 528 | 1983 | 316 | 583 |
1984 | 361 | 695 | 1985 | 446 | 858 | 1986 | 497 | 963 |
1987 | 565 | 1112 | 1988 | 714 | 1366 | 1989 | 788 | 1519 |
1990 | 833 | 1644 | 1991 | 932 | 1893 | 1992 | 1116 | 2311 |
1993 | 1393 | 2998 | 1994 | 1833 | 4044 | 1995 | 2355 | 5046 |
1996 | 2789 | 5846 | 1997 | 3002 | 6420 | 1998 | 3159 | 6796 |
1999 | 3346 | 7159 | 2000 | 3632 | 7858 | 2001 | 3869 | 8622 |
2002 | 4106 | 9398 | 2003 | 4411 | 10542 | 2004 | 4925 | 12336 |
2005 | 5463 | 14053 | 2006 | 6138 | 16165 | 2007 | 7081 | 18934 |
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from matplotlib.font_manager import FontProperties
# 设置中文字体以避免图中中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 数据
Y = np.array([184, 208, 238, 264, 288, 316, 361, 446, 497, 565, 714, 788, 833, 932,
1116, 1393, 1833, 2355, 2789, 3002, 3159, 3346, 3632, 3869, 4106,
4411, 4925, 5463, 6138, 7081])
X = np.array([381, 419, 463, 492, 528, 583, 695, 858, 963, 1112, 1366, 1519,
1644, 1893, 2311, 2998, 4044, 5046, 5846, 6420, 6796, 7159,
7858, 8622, 9398, 10542, 12336, 14053, 16165, 18934])
# 绘制散点图
plt.scatter(X, Y)
plt.xlabel('人均GDP(元) X')
plt.ylabel('全体居民消费水平(元) Y')
plt.title('全体居民消费水平与人均GDP的散点图')
plt.show()
# 一元回归分析
X_with_const = sm.add_constant(X)
model = sm.OLS(Y, X_with_const)
results = model.fit()
# 输出回归结果和回归方程
print(results.summary())
regression_eq = f"Y = {results.params[0]:.4f} + {results.params[1]:.4f} * X"
print("回归方程:", regression_eq)
# 残差图
residuals = results.resid
plt.scatter(X, residuals)
plt.axhline(0, color='red', linestyle='--')
plt.xlabel('人均GDP(元) X')
plt.ylabel('残差')
plt.title('残差图')
plt.show()
散点图 | 残差图 |
---|---|
总结
一元回归模型是分析两个变量之间线性关系的重要工具,其核心目的是通过建立简单的线性方程来描述自变量与因变量之间的关系。通过最小二乘法,我们可以有效地估计这些模型参数,进而进行显著性检验,以评估自变量对因变量的影响程度和方向。回归分析的意义不仅在于量化变量间的关系,还在于为预测提供科学依据。在经济学中,分析人均收入与消费支出之间的关系,可以为政策制定者提供重要的决策支持。此外,回归分析还可以揭示潜在的因果关系,帮助我们理解数据背后的机制。
参考文献
- python:一元线性回归模型案例分析
- 完整详细的回归分析实例R语言实现(含数据代码)
- [学习笔记 第九章(上)一元线性回归分析](https://cloud.tencent.com/developer/article/1412088}