快速提示:
- 经济学中的回归,基本目标是解释2个变量之间的关系:\(x\) 如何影响 \(y\)?
- 这里更重视解释变量的系数 \(\beta_i\) 及其显著性,而不是太关心 \(R^2\) 等统计量
- 因此,回归模型的设计,以及对系数的进行统计检验以及解释,是经济学中回归的重点。
基本多元回归
分析目标和数据
这个案例来自伍德里奇的《计量经济学导论》。
本案希望研究的问题是:教育水平对工资有什么影响?即:每多读一年书,工资会有什么变化?
数据采用《导论》中的数据Wage1。
# 加载并查看wage1.csv数据集
import pandas as pd
# 加载数据
wage1_data = pd.read_csv("data/wage1.csv")
# 查看数据集的前几行和列名
wage1_data.iloc[:5, :10] # 显示前5行和前10列
| 0 |
3.10 |
11 |
2 |
0 |
0 |
1 |
0 |
2 |
1 |
0 |
| 1 |
3.24 |
12 |
22 |
2 |
0 |
1 |
1 |
3 |
1 |
0 |
| 2 |
3.00 |
11 |
2 |
0 |
0 |
0 |
0 |
2 |
0 |
0 |
| 3 |
6.00 |
8 |
44 |
28 |
0 |
0 |
1 |
0 |
1 |
0 |
| 4 |
5.30 |
12 |
7 |
2 |
0 |
0 |
1 |
1 |
0 |
0 |
wage1_data.columns # 显示所有列名
Index(['wage', 'educ', 'exper', 'tenure', 'nonwhite', 'female', 'married',
'numdep', 'smsa', 'northcen', 'south', 'west', 'construc', 'ndurman',
'trcommpu', 'trade', 'services', 'profserv', 'profocc', 'clerocc',
'servocc', 'lwage', 'expersq', 'tenursq'],
dtype='object')
回归公式
我们的目标是解释教育水平对工资的影响,那么可以建立以下回归模型:
\[
\text{wage} = \beta_0 + \delta_0 \cdot \text{female} + \beta_1 \cdot \text{educ} + \beta_2 \cdot \text{exper} + \beta_3 \cdot \text{tenure} + u
\]
其中:
- \(\text{wage}\) 是工资。
- \(\text{female}\) 是一个虚拟变量,女性为1,男性为0。
- \(\text{educ}\), \(\text{exper}\), 和 \(\text{tenure}\) 分别代表教育年数、工作经验和在当前工作的年限。
- \(u\) 是误差项。
从理论上看,这类线性回归模型通常可以写成一般形式: \[
y = \beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k + u,
\] 其中 \(E(u\mid x_1,\dots,x_k)=0\) 是一个核心假设,它表示在给定解释变量之后,误差项的条件期望为零。在线性和这一条件期望假设下,\(\beta_j\) 可以理解为条件均值 \(E(y\mid x)\) 对相应解释变量的边际影响。普通最小二乘法(OLS)就是通过让残差平方和尽量小来估计这些系数。
教育水平对工资的影响体现在系数\(\beta_1\)中,这就是我们关心的目标。
进行回归分析
在进行回归分析之前,我们需要准备数据和定义模型。这个过程包括设置自变量(解释变量)和因变量(被解释变量),以及确保数据格式适合进行回归分析。
定义因变量和自变量
因变量 \(y\): 因变量是我们想要预测或解释的变量。在本例中,因变量是 wage,即工资,我们希望了解其他变量如何影响工资。
自变量 \(X\): 自变量是可能影响因变量的变量。在这个模型中,我们选择了四个自变量:female, educ, exper, 和 tenure。这些变量分别表示:
female: 表示性别,是一个二分类变量,女性为1,男性为0。
educ: 表示受教育年数,是一个连续变量。
exper: 表示总工作经验年数,是一个连续变量。
tenure: 表示在当前工作的年限,也是一个连续变量。
构造自变量 \(X\) 和因变量 \(y\)
在开始构建模型之前,我们需要从数据集中提取这些变量。使用Pandas库,我们可以地从DataFrame中选择需要的列。同时,为了进行回归分析,我们需要向自变量矩阵 \(X\) 中添加一个常数项,以便模型包含截距 \(\beta_0\)。
import statsmodels.api as sm
# 选择自变量和因变量
X = wage1_data[["female", "educ", "exper", "tenure"]]
y = wage1_data["wage"]
# 向自变量矩阵X添加常数项,以便包含截距
X = sm.add_constant(X)
X.head() # 注意,多了一列const
| 0 |
1.0 |
1 |
11 |
2 |
0 |
| 1 |
1.0 |
1 |
12 |
22 |
2 |
| 2 |
1.0 |
0 |
11 |
2 |
0 |
| 3 |
1.0 |
0 |
8 |
44 |
28 |
| 4 |
1.0 |
0 |
12 |
7 |
2 |
拟合回归模型
使用statsmodels库的OLS类,我们可以定义并拟合一个普通最小二乘回归模型。OLS类的第一个参数是因变量 \(y\),第二个参数是自变量 \(X\)。在前面的模型假设下,OLS 给出的系数是通过最小化残差平方和得到的估计值,可以用来构造样本回归函数(或预测方程)。
# 创建OLS回归模型的实例并拟合数据
model = sm.OLS(y, X)
results = model.fit()
查看回归结果
模型拟合后,我们可以通过调用 summary() 方法来查看详细的回归分析结果,包括每个变量的系数、标准误、t 值、p 值等统计指标。每个系数的 t 值和 p 值都对应于一个假设检验,通常是检验原假设 \(H_0: \beta_j = 0\),用来判断该解释变量在统计上是否对因变量有影响。
# 输出回归结果摘要
print(results.summary())
OLS Regression Results
==============================================================================
Dep. Variable: wage R-squared: 0.364
Model: OLS Adj. R-squared: 0.359
Method: Least Squares F-statistic: 74.40
Date: Wed, 19 Nov 2025 Prob (F-statistic): 7.30e-50
Time: 15:15:14 Log-Likelihood: -1314.2
No. Observations: 526 AIC: 2638.
Df Residuals: 521 BIC: 2660.
Df Model: 4
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -1.5679 0.725 -2.164 0.031 -2.991 -0.145
female -1.8109 0.265 -6.838 0.000 -2.331 -1.291
educ 0.5715 0.049 11.584 0.000 0.475 0.668
exper 0.0254 0.012 2.195 0.029 0.003 0.048
tenure 0.1410 0.021 6.663 0.000 0.099 0.183
==============================================================================
Omnibus: 185.864 Durbin-Watson: 1.794
Prob(Omnibus): 0.000 Jarque-Bera (JB): 715.580
Skew: 1.589 Prob(JB): 4.11e-156
Kurtosis: 7.749 Cond. No. 141.
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
回归线
可以得到回归线(或者样本回归函数):
\[
\widehat{wage} = -1.568 + (-1.811) \cdot female + 0.572 \cdot educ + 0.025 \cdot exper + 0.141 \cdot tenure
\]
这里给出的就是样本回归函数(或预测方程),用估计得到的系数来给出在不同特征组合下的工资预测值。与前面的“包含误差项 \(u\) 的模型方程”不同,这里已经不再带误差项。
解释回归结果
从回归结果中,我们可以提取以下关键信息:
- 模型拟合情况: \(R^2\) 值为 0.364,说明模型解释了 36.4% 的因变量(wage)的方差。这表明模型有一定的解释能力,但仍有大部分变异未被模型捕捉。在线性回归中,我们通常不会仅凭 \(R^2\) 来判断模型优劣,更关心的是系数的含义及其显著性。
- 系数解释:
- const(截距): \(-1.568\), 在统计上显著(\(p < 0.05\)),在形式上表示当所有解释变量为0时预测的工资值。在本例中,“教育年数=0、工作经验=0、在现单位年限=0、且为男性”的情形本身并不常见,因此截距更多是起到调整回归线位置的技术作用,通常不作强经济解释。
- female: \(-1.811\), 显著地负相关(\(p < 0.001\)),表示在控制了教育、总工作经验和在现单位年限之后,女性的工资平均比男性低约 $1.81,这是一种“条件工资差异”的估计,而不是简单的男女平均工资差。
- educ(教育年数): \(0.572\), 显著正相关(\(p < 0.001\)),意味着每增加一年的教育,工资平均增加约 $0.57,其他条件不变。
- exper(工作经验): \(0.025\), 在边际上显著(\(p = 0.029\)),表示每增加一年工作经验,工资增加约 $0.03,其他条件不变。
- tenure(在当前工作的年限): \(0.141\), 显著正相关(\(p < 0.001\)),每增加一年在当前工作的年限,工资增加约 $0.14,其他条件不变。
- 模型诊断:
- Durbin-Watson 统计量为 1.794,接近2,说明残差中不存在自相关问题。
- Omnibus 和 Jarque-Bera 测试的 \(p\) 值都接近0,表明残差不符合正态分布,这可能影响了某些统计测试的有效性,尤其是在小样本数据中。
回归结果的经济学解释
在经济学研究中,分析者往往特别关注模型中的系数(\(\beta_i\)),因为这些系数能够揭示不同变量之间的关系,如大小、方向和显著性。这些关系有助于解释经济理论中的假设或验证特定的经济行为。每个系数的解释性质能够表达自变量对因变量的预期变化量,即当其他条件保持不变时,自变量每变化一个单位,因变量平均预期会如何变化。
对系数的解释
大小:系数的大小告诉我们,当自变量增加一个单位时,因变量预期会增加或减少多少。在经济学中,了解这种影响的规模是至关重要的,因为它有助于量化政策变动或市场条件变化对经济行为的影响。
方向:系数的符号(正或负)表明变量间的关系是正向还是负向。例如,如果某个变量的系数为正,则表明这两个变量是正相关的;如果系数为负,则两者是负相关的。
显著性:统计显著性(通常通过p值来衡量)告诉我们系数是否在统计上显著,即我们观察到的关系是否有可能仅仅是由于抽样误差。p值较小(通常小于0.05)意味着我们有足够的证据认为该系数在总体中不为零。
以前面的回归分析为例,我们研究了教育水平(educ)对工资(wage)的影响。根据回归结果,教育的系数是0.572,且非常显著(p值 < 0.001)。
这就回答了我们最初的问题:在其他因素不变的情况下,每增加一年的教育,工资平均预期增加0.572单位。
多元回归练习题
在一项研究中,研究人员收集了一批学生的高中成绩(hsGPA)、大学入学考试成绩(ACT)以及他们在大学第一年的成绩(colGPA)。该研究目的是探索高中GPA和ACT成绩对大学第一年GPA的影响。
数据集包含以下变量:
hsGPA:高中GPA
ACT:大学入学考试成绩
colGPA:大学第一年GPA
研究问题: 高中GPA和ACT成绩如何影响大学第一年的GPA?
回归模型: 使用以下回归模型分析数据: \[
\text{colGPA} = \beta_0 + \beta_1 \times \text{hsGPA} + \beta_2 \times \text{ACT} + u
\]
其中:
- \(\beta_0\) 是截距
- \(\beta_1\) 是高中GPA对大学GPA的影响。
- \(\beta_2\) 是ACT成绩对大学GPA的影响。
- \(u\) 是误差项。
在这个模型中,可以把系数理解为在控制了另一个成绩之后,各自对大学第一年GPA的边际影响。需要注意的是,如果还有其他重要但未观测的因素同时影响 hsGPA、ACT 和 colGPA,这些遗漏变量可能会使系数偏离理想的因果效应,因此在解释时要结合实际背景进行判断。
任务:
- 利用提供的数据,估计上述回归模型。
- 解释高中GPA和ACT成绩的系数,包括意义和显著性。
- 思考题:讨论模型的适用性和限制。
# 读取数据
gpa1_data = pd.read_csv("data/gpa1.csv")
# 显示列名
gpa1_data.columns
Index(['age', 'soph', 'junior', 'senior', 'senior5', 'male', 'campus',
'business', 'engineer', 'colGPA', 'hsGPA', 'ACT', 'job19', 'job20',
'drive', 'bike', 'walk', 'voluntr', 'PC', 'greek', 'car', 'siblings',
'bgfriend', 'clubs', 'skipped', 'alcohol', 'gradMI', 'fathcoll',
'mothcoll'],
dtype='object')
固定效应
更进一步,我们可以使用 linearmodels来完成基准回归,并且加入固定效应。
在面板数据中,同一企业在不同年份反复出现,每个企业往往有一些不随时间变化但又影响因变量的特质,例如管理水平、企业文化等。如果这些特质与解释变量有关,简单的回归可能会有偏。固定效应模型通过为每个个体(以及每个年份)引入一个单独的截距,把这种“时间不变但个体不同”的因素吸收掉,更接近我们关心的价值和资本对投资的净影响。
安装:
在Jupyter Notebook的python单元格中执行如下代码,注意开头有个感叹号:
!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple linearmodels
数据准备
这里使用来自statsmodels的数据集 grunfeld :“The Determinants of Corporate Investment”
这里我们试图使用企业的价值和资本来解释企业的投资行为。
from statsmodels.datasets import grunfeld
data = grunfeld.load_pandas().data
data.head()
| 0 |
317.6 |
3078.5 |
2.8 |
General Motors |
1935.0 |
| 1 |
391.8 |
4661.7 |
52.6 |
General Motors |
1936.0 |
| 2 |
410.6 |
5387.1 |
156.9 |
General Motors |
1937.0 |
| 3 |
257.7 |
2792.2 |
209.2 |
General Motors |
1938.0 |
| 4 |
330.8 |
4313.2 |
203.4 |
General Motors |
1939.0 |
变量的定义如下:
- invest - Gross investment in 1947 dollars
- value - Market value as of Dec. 31 in 1947 dollars
- capital - Stock of plant and equipment in 1947 dollars
- firm - General Motors, US Steel, General Electric, Chrysler, Atlantic Refining, IBM, Union Oil, Westinghouse, Goodyear, Diamond Match, American Steel
- year - 1935 - 1954
首先把表示个体和时间的列(准备要控制的固定效应)都转为index
data = data.set_index(["firm", "year"])
data.head()
| firm |
year |
|
|
|
| General Motors |
1935.0 |
317.6 |
3078.5 |
2.8 |
| 1936.0 |
391.8 |
4661.7 |
52.6 |
| 1937.0 |
410.6 |
5387.1 |
156.9 |
| 1938.0 |
257.7 |
2792.2 |
209.2 |
| 1939.0 |
330.8 |
4313.2 |
203.4 |
进行回归
考虑企业投资的决定,我们设置2个回归模型:
不带有固定效应: \[
invest_{it} = \beta_0 + \beta_1 value_{it} + \beta_2 capital_{it} + \varepsilon_{it}
\]
带有个体和时间固定效应,其中\(\nu_i\),\(\lambda_t\)分代表个体和时间: \[
invest_{it} = \beta_0 + \beta_1 value_{it} + \beta_2 capital_{it} + \nu_i + \lambda_t + \varepsilon_{it}
\]
这里 \(\nu_i\) 可以理解为企业 \(i\) 的“固定特征”,在所有年份都相同;\(\lambda_t\) 是年份 \(t\) 的共同冲击,对所有企业都相同。例如,宏观经济环境的变化就可以通过年份固定效应来近似刻画。
要控制固定效应,只要在公式中添加 EntityEffects或TimeEffects 即可。拟合两个模型:
from linearmodels import PanelOLS
# 无固定效应
m1 = PanelOLS.from_formula(
"invest ~ 1 + value + capital", data=data
).fit()
# 有固定效应
m2 = PanelOLS.from_formula(
"invest ~ 1 + value + capital + EntityEffects + TimeEffects", data=data
).fit()
# 有固定效应,聚类到个体
m3 = PanelOLS.from_formula(
"invest ~ 1 + value + capital + EntityEffects + TimeEffects", data=data
).fit(cov_type="clustered", cluster_entity=True)
比较结果:
from linearmodels.panel.results import compare
print(compare(results = {'OLS':m1,"FE":m2, 'FE-cluster':m3}))
Model Comparison
===================================================================
OLS FE FE-cluster
-------------------------------------------------------------------
Dep. Variable invest invest invest
Estimator PanelOLS PanelOLS PanelOLS
No. Observations 220 220 220
Cov. Est. Unadjusted Unadjusted Clustered
R-squared 0.8179 0.7253 0.7253
R-Squared (Within) 0.7357 0.7566 0.7566
R-Squared (Between) 0.8426 0.7944 0.7944
R-Squared (Overall) 0.8179 0.7856 0.7856
F-statistic 487.28 248.15 248.15
P-value (F-stat) 0.0000 0.0000 0.0000
===================== ============ ============ ===========
Intercept -38.410 -72.394 -72.394
(-4.5654) (-5.6861) (-3.5000)
value 0.1145 0.1167 0.1167
(20.753) (9.0219) (10.368)
capital 0.2275 0.3514 0.3514
(9.3904) (16.696) (7.4836)
======================= ============== ============== =============
Effects Entity Entity
Time Time
-------------------------------------------------------------------
T-stats reported in parentheses
注意到
- 2个“FE”列的最下方,显示这2个模型已经控制了个体和时间固定效应。
- Cov. Est.行, 显示FE-Cluster模型使用了聚类标准误。