跳到主要内容
面板数据模型原理与Python实现 | 极客日志
Python 算法
面板数据模型原理与Python实现 面板数据模型(Panel Data Model),涵盖定义、特征及与传统单维度模型的对比。深入推导固定效应(FE)与随机效应(RE)的数学原理,包括组内离差变换与广义最小二乘法(GLS)。提供统计检验方法(F 检验、Hausman 检验)指导模型选择,并给出基于 Python linearmodels 库的完整代码实现,包含数据模拟、预处理、模型估计及可视化全流程,适用于数学建模与计量经济学分析。
编程诗人 发布于 2026/3/27 更新于 2026/6/9 38 浏览面板数据模型(Panel Data Model)
一、背景溯源:从单维度到双维度数据的演进
1.1 面板数据的精确定义与结构特征
面板数据(Panel Data)是同时包含横截面维度(Cross-Sectional Dimension)和时间维度(Time Dimension)的二维结构化数据,其数学表示为 ${y_{it}, X_{it}}_{i=1,t=1}^{N,T}$,其中:
$i=1,2,...,N$:横截面个体(如个人、企业、国家等不可观测时间变化的分析单元);
$t=1,2,...,T$:时间周期(如年份、季度、月份等不可观测个体差异的时间单元);
$y_{it}$:个体 $i$ 在时间 $t$ 的被解释变量(因变量),通常为连续型(如收入、消费);
$X_{it}$:个体 $i$ 在时间 $t$ 的解释变量向量(自变量),维度为 $K$(即包含 $K$ 个解释变量),记为 $X_{it} = (X_{it1}, X_{it2},..., X_{itK})'$。
面板数据的核心特征是'跟踪同一批个体的动态变化',例如:
家庭面板:跟踪 1000 个家庭 2018-2022 年的收入、消费、教育支出;
企业面板:跟踪 500 家上市公司 2010-2020 年的资产规模、研发投入、净利润;
国家面板:跟踪 30 个 OECD 国家 1990-2020 年的 GDP、失业率、通胀率。
1.2 传统单维度模型的本质局限
传统计量模型仅利用单一维度的信息,无法处理未观测异质性(Unobserved Heterogeneity)——即个体层面或时间层面无法直接测量的特征/冲击,最终导致估计结果有偏且不一致。具体局限如下:
(1)横截面回归(Cross-Sectional Regression)
仅使用同一时间点的个体数据(如 2023 年 1000 个家庭的收入与消费),模型形式为:
$$ y_i = \alpha + X_i\beta + \epsilon_i $$
其中 $i$ 为个体,无时间维度。
局限 :忽略了个体未观测异质性(如家庭理财能力、遗传禀赋)。若未观测异质性与解释变量相关(如理财能力强的家庭收入更高),则违反 OLS'解释变量与误差项不相关'的假设,导致遗漏变量偏差(Omitted Variable Bias)。数学上,若真实模型为 $y_i = \alpha + X_i\beta + \alpha_i + \epsilon_i$($\alpha_i$ 为未观测异质性),且 $Cov(X_i, \alpha_i) \neq 0$,则横截面回归的估计量为:
$$ \hat{\beta}^{CS} = \beta + (X'X)^{-1}X'\alpha $$
由于 $Cov(X_i, \alpha_i) \neq 0$,$\hat{\beta}^{CS}$ 是有偏且不一致的。
(2)时间序列回归(Time Series Regression)
仅使用单个个体的时间序列数据(如某企业 2010-2020 年的投资与利润),模型形式为:
$$ y_t = \alpha + X_t\beta + \epsilon_t $$
其中 $t$ 为时间,无个体维度。
局限 :
样本量极小(仅 $T$ 个观测值),估计精度低;
无法推广到其他个体(如某企业的结论不能代表所有企业);
忽略时间未观测异质性(如宏观经济周期、政策冲击),若时间异质性与解释变量相关,同样导致偏差。
1.3 面板数据的不可替代优势
面板数据通过结合横截面与时间维度的双重信息,从根本上解决了单维度模型的局限,具体优势包括:
样本量扩充 :样本量从 $N$(横截面)或 $T$(时间序列)扩展到 $NT$,大幅提高估计精度;
分离未观测异质性 :通过'个体固定效应'或'时间固定效应',明确控制未观测特征/冲击的影响;
识别动态因果关系 :可分析变量随时间的变化效应(如教育对收入的长期影响),而非仅个体间的差异效应(如高教育个体与低教育个体的收入差异);
解决内生性 :部分内生性问题(如双向因果)可通过'差分变换'或'工具变量'缓解(如动态面板模型)。
二、核心思想:未观测异质性的分离与控制
2.1 被解释变量的变异分解
面板数据模型的核心目标是将被解释变量的总变异分解为三个部分:
$$ \text{总变异} = \text{可观测因素变异} + \text{未观测异质性变异} + \text{随机误差变异} $$
数学上,双向固定效应模型(最常用的面板模型)的变异分解为:
$$ y_{it} = \underbrace{\alpha_i}{\text{个体固定效应}} + \underbrace{\lambda_t} {\text{时间固定效应}} + \underbrace{X_{it}\beta}{\text{可观测因素}} + \underbrace{\epsilon {it}}_{\text{随机误差}} $$
$\alpha_i$:个体固定效应 ——个体 $i$ 不随时间变化的未观测特征(如家庭理财能力、企业管理水平、国家制度质量);
$\lambda_t$:时间固定效应 ——时间 $t$ 不随个体变化的未观测冲击(如宏观政策、自然灾害、技术革命);
$\beta$:核心参数 ——解释变量对被解释变量的边际影响(即控制异质性后,$X_{itk}$ 增加 1 单位时 $y_{it}$ 的平均变化量);
$\epsilon_{it}$:随机误差项 ——满足 $E(\epsilon_{it})=0$ 且 $Cov(X_{it}, \epsilon_{it})=0$(即解释变量与随机误差不相关)。
2.2 未观测异质性的处理逻辑 模型的关键是如何处理未观测异质性。根据 $\alpha_i$(或 $\lambda_t$)的性质(固定参数 vs 随机变量),面板数据模型分为两类:
固定效应模型(Fixed Effect, FE) :将 $\alpha_i$ 视为固定参数(即每个个体有独特的截距项),且假设 $\alpha_i$ 与解释变量 $X_{it}$ 相关(如理财能力与收入相关);
随机效应模型(Random Effect, RE) :将 $\alpha_i$ 视为随机变量(即个体异质性来自一个随机分布),且假设 $\alpha_i$ 与解释变量 $X_{it}$ 不相关(如企业地理位置与广告支出无关)。
三、算法原理与公式推导
3.1 模型分类与基础形式 面板数据模型的基础分类需同时考虑个体异质性与时间异质性,具体如下:
模型类型 假设条件 模型形式 混合回归(POLS) 无个体异质性($\alpha_1=\alpha_2=...=\alpha_N$)、无时间异质性($\lambda_1=...=\lambda_T$) $y_{it} = \alpha + X_{it}\beta + \epsilon_{it}$ 单向个体固定效应(FE) 个体异质性为固定参数,与 $X_{it}$ 相关;无时间异质性 $y_{it} = \alpha_i + X_{it}\beta + \epsilon_{it}$ 单向时间固定效应(TE) 时间异质性为固定参数,与 $X_{it}$ 相关;无个体异质性 $y_{it} = \lambda_t + X_{it}\beta + \epsilon_{it}$ 双向固定效应(Two-Way FE) 个体异质性与时间异质性均为固定参数,且至少一个与 $X_{it}$ 相关 $y_{it} = \alpha_i + \lambda_t + X_{it}\beta + \epsilon_{it}$ 随机效应(RE) 个体异质性为随机变量($\alpha_i \sim iid(0,\sigma_\alpha^2)$),与 $X_{it}$ 不相关;无时间异质性 $y_{it} = \alpha + X_{it}\beta + (\alpha_i + \epsilon_{it})$
3.2 固定效应模型(FE):离差变换的本质与推导 固定效应模型的核心是消除与解释变量相关的未观测异质性,最常用的方法是组内离差变换(Within Transformation)。以下以单向个体固定效应模型为例,详细推导其原理。
3.2.1 模型设定与关键假设 单向个体固定效应模型 的设定为:
$$ y_{it} = \alpha_i + X_{it}\beta + \epsilon_{it}, \quad i=1,...,N; \ t=1,...,T $$
严格外生性 :$E(\epsilon_{it} | X_{i1},..., X_{iT}, \alpha_i) = 0$(即随机误差与所有时间的解释变量、个体固定效应均不相关);
个体异质性与解释变量相关 :$Cov(X_{it}, \alpha_i) \neq 0$(这是选择固定效应模型的核心原因);
误差项独立同分布 :$\epsilon_{it} \sim iid(0,\sigma_\epsilon^2)$(可放松为'聚类稳健',后续会讨论)。
3.2.2 组内离差变换的推导(消除 $\alpha_i$) 由于 $\alpha_i$ 是不随时间变化的固定参数,我们可以通过个体时间均值来消除它。具体步骤如下:
步骤 1:计算个体时间均值 对每个个体 $i$,计算被解释变量与解释变量的时间均值(即该个体在所有时间点的平均值):
$$ \bar{y}i = \frac{1}{T} \sum {t=1}^T y_{it}, \quad \bar{X}i = \frac{1}{T} \sum {t=1}^T X_{it}, \quad \bar{\epsilon}i = \frac{1}{T} \sum {t=1}^T \epsilon_{it} $$
将原模型对时间 $t$ 求和并除以 $T$,得到均值模型 :
$$ \bar{y}_i = \alpha_i + \bar{X}_i\beta + \bar{\epsilon}_i $$
步骤 2:原模型减去均值模型 将原模型与均值模型相减,得到离差模型(Within Model) :
$$ y_{it} - \bar{y}i = (X {it} - \bar{X}i)\beta + (\epsilon {it} - \bar{\epsilon}_i) $$
记离差变量 为:
$$ \tilde{y}{it} = y {it} - \bar{y}i, \quad \tilde{X} {it} = X_{it} - \bar{X}i, \quad \tilde{\epsilon} {it} = \epsilon_{it} - \bar{\epsilon}_i $$
则离差模型简化为:
$$ \tilde{y}{it} = \tilde{X} {it}\beta + \tilde{\epsilon}_{it} $$
步骤 3:离差变换的核心作用 离差变换完全消除了个体固定效应 $\alpha_i$——因为 $\alpha_i$ 不随时间变化,其时间均值仍为 $\alpha_i$,故 $\alpha_i - \alpha_i = 0$。
更重要的是,离差变换仅保留了解释变量的'个体内变异'(即同一个体随时间的变化),而剔除了'个体间变异'(即不同个体的差异)。这意味着固定效应模型的估计结果仅依赖于个体内部的动态变化,而非个体之间的静态差异——这正是固定效应模型解决'未观测异质性与解释变量相关'问题的关键!
3.2.3 固定效应估计量的推导 离差模型满足 OLS 的基本假设(解释变量与误差项不相关),因此我们可以用普通最小二乘法(OLS)估计离差模型,得到固定效应估计量:
$$ \hat{\beta}^{FE} = \left( \sum_{i=1}^N \sum_{t=1}^T \tilde{X}{it}'\tilde{X} {it} \right)^{-1} \sum_{i=1}^N \sum_{t=1}^T \tilde{X}{it}'\tilde{y} {it} $$
个体固定效应的估计 在得到 $\hat{\beta}^{FE}$ 后,个体固定效应 $\alpha_i$ 的估计值为:
$$ \hat{\alpha}_i = \bar{y}_i - \bar{X}_i\hat{\beta}^{FE} $$
其含义是:个体 $i$ 的未观测特征对被解释变量的平均影响(控制了解释变量的个体均值后)。
3.2.4 双向固定效应模型的推导 若同时存在个体固定效应与时间固定效应,则模型为双向固定效应模型:
$$ y_{it} = \alpha_i + \lambda_t + X_{it}\beta + \epsilon_{it} $$
此时需使用双重离差变换(同时消除 $\alpha_i$ 与 $\lambda_t$),具体步骤如下:
步骤 1:计算总均值 首先计算所有观测值的总均值(即所有个体、所有时间的平均值):
$$ \bar{y} = \frac{1}{NT} \sum_{i=1}^N \sum_{t=1}^T y_{it}, \quad \bar{X} = \frac{1}{NT} \sum_{i=1}^N \sum_{t=1}^T X_{it} $$
步骤 2:双重离差变换 将原模型减去个体时间均值与时间个体均值,再加上总均值(避免重复消除):
$$ y_{it} - \bar{y}_i - \bar{y}t + \bar{y} = (X {it} - \bar{X}_i - \bar{X}t + \bar{X})\beta + (\epsilon {it} - \bar{\epsilon}_i - \bar{\epsilon}_t + \bar{\epsilon}) $$
其中 $\bar{y}t = \frac{1}{N} \sum {i=1}^N y_{it}$(时间 $t$ 的个体均值),$\bar{X}t = \frac{1}{N} \sum {i=1}^N X_{it}$(时间 $t$ 的解释变量均值)。
记双重离差变量 为:
$$ \ddot{y}{it} = y {it} - \bar{y}i - \bar{y}t + \bar{y}, \quad \ddot{X} {it} = X {it} - \bar{X}_i - \bar{X}_t + \bar{X} $$
则双向固定效应模型的离差形式为:
$$ \ddot{y}{it} = \ddot{X} {it}\beta + \ddot{\epsilon}_{it} $$
同样使用 OLS 估计该模型,得到双向固定效应估计量 $\hat{\beta}^{Two-Way FE}$。
3.2.5 固定效应模型的一致性证明 固定效应估计量的一致性(Consistency)要求:当 $N \to \infty$(或 $T \to \infty$)时,$\hat{\beta}^{FE} \to \beta$(真实参数)。
前提条件 一致性的核心前提是离差变量与离差误差项不相关,即:
$$ plim_{N\to\infty} \frac{1}{NT} \sum_{i=1}^N \sum_{t=1}^T \tilde{X}{it}'\tilde{\epsilon} {it} = 0 $$
证明过程 根据离差变量的定义,$\tilde{X}{it} = X {it} - \bar{X}i$,$\tilde{\epsilon} {it} = \epsilon_{it} - \bar{\epsilon}i$。因此:
$$ \sum {i=1}^N \sum_{t=1}^T \tilde{X}{it}'\tilde{\epsilon} {it} = \sum_{i=1}^N \sum_{t=1}^T (X_{it} - \bar{X}i)'(\epsilon {it} - \bar{\epsilon}_i) $$
展开后:
$$ = \sum_{i=1}^N \left[ \sum_{t=1}^T X_{it}'\epsilon_{it} - \bar{X}i'\sum {t=1}^T \epsilon_{it} - \sum_{t=1}^T X_{it}'\bar{\epsilon}_i + T\bar{X}_i'\bar{\epsilon}_i \right] $$
由于 $\bar{X}i = \frac{1}{T}\sum {t=1}^T X_{it}$,$\bar{\epsilon}i = \frac{1}{T}\sum {t=1}^T \epsilon_{it}$,因此:
$$ \bar{X}i'\sum {t=1}^T \epsilon_{it} = T\bar{X}i'\bar{\epsilon}i, \quad \sum {t=1}^T X {it}'\bar{\epsilon}_i = T\bar{X}_i'\bar{\epsilon}_i $$
代入后,中间两项抵消,最终简化为:
$$ \sum_{i=1}^N \sum_{t=1}^T \tilde{X}{it}'\tilde{\epsilon} {it} = \sum_{i=1}^N \sum_{t=1}^T X_{it}'\epsilon_{it} - T\sum_{i=1}^N \bar{X}_i'\bar{\epsilon}_i $$
根据严格外生性假设 ($E(\epsilon_{it} | X_{i1},..., X_{iT}) = 0$),有:
$$ E\left( \sum_{t=1}^T X_{it}'\epsilon_{it} \right) = 0, \quad E\left( T\bar{X}_i'\bar{\epsilon}_i \right) = 0 $$
因此,当 $N \to \infty$ 时,样本均值收敛于总体均值:
$$ plim_{N\to\infty} \frac{1}{NT} \sum_{i=1}^N \sum_{t=1}^T \tilde{X}{it}'\tilde{\epsilon} {it} = 0 $$
3.3 随机效应模型(RE):复合误差与 GLS 估计 随机效应模型的核心是将个体异质性视为随机变量,并利用广义最小二乘法(GLS)处理复合误差项的相关性。
3.3.1 模型设定与关键假设 随机效应模型 的设定为:
$$ y_{it} = \alpha + X_{it}\beta + u_{it} $$
其中复合误差项 为:
$$ u_{it} = \alpha_i + \epsilon_{it} $$
个体异质性为随机变量 :$\alpha_i \sim iid(0,\sigma_\alpha^2)$(均值为 0,方差为 $\sigma_\alpha^2$);
严格外生性 :$E(u_{it} | X_{i1},..., X_{iT}) = 0$(即复合误差与所有时间的解释变量不相关);
独立性 :$\alpha_i$ 与 $\epsilon_{it}$ 独立,$\epsilon_{it} \sim iid(0,\sigma_\epsilon^2)$;
个体异质性与解释变量不相关 :$Cov(X_{it}, \alpha_i) = 0$(这是选择随机效应模型的核心原因)。
3.3.2 复合误差的方差 - 协方差结构 由于 $\alpha_i$ 是个体共有的随机项,同一个体的不同时间观测值的误差项存在序列相关性。具体来说:
(1)方差 复合误差项的方差为:
$$ Var(u_{it}) = Var(\alpha_i + \epsilon_{it}) = Var(\alpha_i) + Var(\epsilon_{it}) = \sigma_\alpha^2 + \sigma_\epsilon^2 $$
(2)协方差 同一个体 $i$、不同时间 $t$ 与 $s$ 的协方差为:
$$ Cov(u_{it}, u_{is}) = Cov(\alpha_i + \epsilon_{it}, \alpha_i + \epsilon_{is}) = Var(\alpha_i) + Cov(\alpha_i, \epsilon_{is}) + Cov(\epsilon_{it}, \alpha_i) + Cov(\epsilon_{it}, \epsilon_{is}) $$
根据假设,$\alpha_i$ 与 $\epsilon_{it}$ 独立,$\epsilon_{it}$ 与 $\epsilon_{is}$ 独立,因此:
$$ Cov(u_{it}, u_{is}) = \sigma_\alpha^2 $$
(3)方差 - 协方差矩阵 对于个体 $i$,其 $T$ 个观测值的误差项向量为 $u_i = (u_{i1}, u_{i2},..., u_{iT})'$,则其方差 - 协方差矩阵为:
$$ \Omega_i = E(u_i u_i') = \sigma_\alpha^2 \iota_T \iota_T' + \sigma_\epsilon^2 I_T $$
其中 $\iota_T$ 是 $T$ 维全 1 向量($\iota_T = (1,1,...,1)'$),$I_T$ 是 $T$ 维单位矩阵。
(4)个体内相关系数 同一个体内不同时间观测值的误差相关性用**个体内相关系数(Intraclass Correlation)**衡量:
$$ \rho = \frac{Cov(u_{it}, u_{is})}{Var(u_{it})} = \frac{\sigma_\alpha^2}{\sigma_\alpha^2 + \sigma_\epsilon^2} $$
$\rho=0$:无个体异质性(即混合回归模型);
$\rho=1$:所有误差变异均来自个体异质性(即横截面回归模型);
实际应用中,$\rho$ 通常介于 0.2~0.8(如企业面板中,同一企业的误差相关性约为 0.5)。
3.3.3 GLS 估计的推导(消除相关性) 由于复合误差项存在序列相关性,OLS 估计虽然无偏,但不有效(即标准误偏大,无法利用相关性信息)。因此需使用广义最小二乘法(GLS)——通过变换矩阵将复合误差转换为同方差且不相关的误差项。
步骤 1:GLS 变换矩阵的构造 GLS 的核心是找到变换矩阵 $P$,使得 $P u_i$ 的方差 - 协方差矩阵为单位矩阵 $I_T$。根据方差 - 协方差矩阵 $\Omega_i$ 的结构,我们可以构造如下变换矩阵:
$$ P = I_T - \theta \cdot \frac{1}{T}\iota_T \iota_T' $$
其中 $\theta$ 为变换参数 ,计算公式为:
$$ \theta = 1 - \frac{\sigma_\epsilon}{\sqrt{\sigma_\epsilon^2 + T\sigma_\alpha^2}} $$
步骤 2:变换参数的推导(为什么是这个形式?) 我们希望变换后的误差项 $P u_i$ 的方差为 1,即:
$$ Var(P u_{it}) = 1 $$
代入 $P$ 的定义:
$$ Var(u_{it} - \theta \bar{u}i) = Var(u {it}) + \theta^2 Var(\bar{u}i) - 2\theta Cov(u {it}, \bar{u}_i) = 1 $$
其中 $\bar{u}i = \frac{1}{T}\sum {t=1}^T u_{it}$,且:
$Var(\bar{u}i) = \frac{1}{T^2} Var(\sum {t=1}^T u_{it}) = \frac{1}{T^2} (T\sigma_\alpha^2 + T\sigma_\epsilon^2) = \frac{\sigma_\alpha^2 + \sigma_\epsilon^2}{T}$;
$Cov(u_{it}, \bar{u}i) = \frac{1}{T} Cov(u {it}, \sum_{s=1}^T u_{is}) = \frac{1}{T} (Var(\alpha_i) + Var(\epsilon_{it})) = \frac{\sigma_\alpha^2 + \sigma_\epsilon^2}{T}$。
将上述结果代入方差公式:
$$ (\sigma_\alpha^2 + \sigma_\epsilon^2) + \theta^2 \cdot \frac{\sigma_\alpha^2 + \sigma_\epsilon^2}{T} - 2\theta \cdot \frac{\sigma_\alpha^2 + \sigma_\epsilon^2}{T} = 1 $$
提取公因子 $(\sigma_\alpha^2 + \sigma_\epsilon^2)$:
$$ (\sigma_\alpha^2 + \sigma_\epsilon^2) \left[ 1 + \frac{\theta^2 - 2\theta}{T} \right] = 1 $$
为了简化,令 $\theta = 1 - \frac{\sigma_\epsilon}{\sqrt{\sigma_\epsilon^2 + T\sigma_\alpha^2}}$,则:
$$ 1 + \frac{\theta^2 - 2\theta}{T} = 1 - \frac{(1 - \theta)^2}{T} = \frac{\sigma_\epsilon^2}{\sigma_\epsilon^2 + T\sigma_\alpha^2} $$
代入后:
$$ (\sigma_\alpha^2 + \sigma_\epsilon^2) \cdot \frac{\sigma_\epsilon^2}{\sigma_\epsilon^2 + T\sigma_\alpha^2} = 1 $$
显然成立,因此变换参数 $\theta$ 的形式正确。
3.3.4 随机效应估计量的推导 使用变换矩阵 $P$ 对原模型进行 GLS 变换,得到:
$$ P y_i = P \alpha \iota_T + P X_i \beta + P u_i $$
其中 $y_i = (y_{i1},..., y_{iT})'$,$X_i = (X_{i1},..., X_{iT})'$。
由于 $P \iota_T = \iota_T - \theta \cdot \frac{1}{T}\iota_T \iota_T' \iota_T = \iota_T - \theta \iota_T = (1 - \theta)\iota_T$,因此变换后的模型可写为:
$$ y_{it}^* = \alpha^* + X_{it}^\beta + \epsilon_{it}^ $$
$y_{it}^* = y_{it} - \theta \bar{y}_i$(被解释变量的 GLS 变换);
$X_{it}^* = X_{it} - \theta \bar{X}_i$(解释变量的 GLS 变换);
$\alpha^* = \alpha (1 - \theta)$(截距项的变换);
$\epsilon_{it}^* = P u_{it}$(变换后的误差项,满足 $\epsilon_{it}^* \sim iid(0,1)$)。
对变换后的模型使用 OLS,得到随机效应估计量:
$$ \hat{\beta}^{RE} = \left( \sum_{i=1}^N \sum_{t=1}^T (X_{it} - \theta \bar{X}i)'(X {it} - \theta \bar{X}i) \right)^{-1} \sum {i=1}^N \sum_{t=1}^T (X_{it} - \theta \bar{X}i)'(y {it} - \theta \bar{y}_i) $$
3.3.5 方差组分的估计(可行 GLS) 变换参数 $\theta$ 依赖于 $\sigma_\alpha^2$ 与 $\sigma_\epsilon^2$,而这两个方差是未知的,因此需用方差组分估计(Variance Components Estimation)从样本中估计,具体步骤如下:
步骤 1:估计组内方差 $\sigma_\epsilon^2$ 组内方差是固定效应模型的残差方差,计算公式为:
$$ \hat{\sigma}\epsilon^2 = \frac{1}{NT - N - K} \sum {i=1}^N \sum_{t=1}^T (\tilde{y}{it} - \tilde{X} {it}\hat{\beta}^{FE})^2 $$
$NT - N - K$:固定效应模型的自由度(样本量 $NT$ 减去 $N$ 个个体固定效应和 $K$ 个解释变量);
$\tilde{y}{it} - \tilde{X} {it}\hat{\beta}^{FE}$:固定效应模型的残差。
步骤 2:估计组间方差 $\sigma_\alpha^2$ 组间方差是混合回归模型的个体均值残差方差减去组内方差的均值,计算公式为:
$$ \hat{\sigma}\alpha^2 = \frac{1}{N - K - 1} \sum {i=1}^N (\bar{y}_i - \bar{X}i\hat{\beta}^{POLS})^2 - \frac{\hat{\sigma} \epsilon^2}{T} $$
$N - K - 1$:混合回归模型的自由度(个体数 $N$ 减去 $K$ 个解释变量和 1 个截距项);
$\bar{y}_i - \bar{X}_i\hat{\beta}^{POLS}$:混合回归模型的个体均值残差。
步骤 3:计算变换参数 $\theta$ 将估计的 $\hat{\sigma}\alpha^2$ 与 $\hat{\sigma} \epsilon^2$ 代入变换参数公式,得到:
$$ \hat{\theta} = 1 - \frac{\hat{\sigma}\epsilon}{\sqrt{\hat{\sigma} \epsilon^2 + T\hat{\sigma}_\alpha^2}} $$
此时的 GLS 称为可行广义最小二乘法(FGLS) ——因为我们用样本估计的方差组分代替了真实方差。
3.4 模型选择:统计检验的本质与推导
3.4.1 混合回归 vs 固定效应:F 检验 原假设 $H_0$:所有个体固定效应相同($\alpha_1=\alpha_2=...=\alpha_N=\alpha$),即混合回归模型成立;备择假设 $H_1$:至少有一个个体固定效应不同($\exists i \neq j, \alpha_i \neq \alpha_j$),即固定效应模型成立。
F 统计量的推导 F 检验的核心是比较混合回归与固定效应模型的拟合优度——若固定效应模型的拟合优度显著高于混合回归,则拒绝原假设。
F 统计量的公式为:
$$ F = \frac{(RSSR - RSSFE)/ (N - 1)}{RSSFE / (NT - N - K)} $$
$RSSR$:混合回归模型的残差平方和(Restricted Sum of Squares);
$RSSFE$:固定效应模型的残差平方和(Unrestricted Sum of Squares);
$N - 1$:原假设的约束个数($N$ 个个体固定效应等于同一个值,约束数为 $N-1$);
$NT - N - K$:固定效应模型的自由度。
为什么约束个数是 $N-1$? 因为固定效应模型有 $N$ 个个体固定效应,而混合回归模型只有 1 个截距项,因此约束数为 $N-1$(即要求 $N$ 个固定效应等于 1 个共同值)。
决策规则 若 $F > F_{\alpha}(N-1, NT-N-K)$($\alpha$ 为显著性水平,通常取 0.05),则拒绝原假设,选择固定效应模型;否则选择混合回归模型。
3.4.2 固定效应 vs 随机效应:Hausman 检验 原假设 $H_0$:$Cov(X_{it}, \alpha_i) = 0$(随机效应模型的核心假设成立,即个体异质性与解释变量不相关);备择假设 $H_1$:$Cov(X_{it}, \alpha_i) \neq 0$(固定效应模型更合适)。
Hausman 检验的核心思想 Hausman 检验的本质是比较固定效应(FE)与随机效应(RE)估计量的差异:
若 $H_0$ 成立:FE 与 RE 估计量均一致,但 RE 估计量更有效(标准误更小);
若 $H_0$ 不成立:FE 估计量一致,但 RE 估计量不一致(因为 RE 未控制与解释变量相关的异质性)。
因此,若两个估计量的差异显著不为零,则拒绝原假设,选择固定效应模型。
Hausman 统计量的推导 Hausman 统计量的公式为:
$$ H = (\hat{\beta}^{FE} - \hat{\beta}^{RE})' \left( Var(\hat{\beta}^{FE}) - Var(\hat{\beta}^{RE}) \right)^{-1} (\hat{\beta}^{FE} - \hat{\beta}^{RE}) $$
推导过程 令 $\hat{\delta} = \hat{\beta}^{FE} - \hat{\beta}^{RE}$,则 Hausman 统计量可写为:
$$ H = \hat{\delta}' Var(\hat{\delta})^{-1} \hat{\delta} $$
其中 $Var(\hat{\delta}) = Var(\hat{\beta}^{FE}) - Var(\hat{\beta}^{RE})$——因为 FE 与 RE 估计量在 $H_0$ 成立时是渐近独立的(证明略)。
渐近分布 当 $N \to \infty$ 时,Hausman 统计量服从卡方分布:
$$ H \sim \chi^2(K) $$
其中 $K$ 为解释变量的个数(即估计量 $\hat{\beta}$ 的维度)。
决策规则 若 $H > \chi^2_{\alpha}(K)$($\alpha$ 为显著性水平,通常取 0.05),则拒绝原假设,选择固定效应模型;否则选择随机效应模型。
四、完整模型求解步骤
4.1 数据准备与预处理 面板数据的预处理是模型估计的基础,直接影响结果的可靠性。具体步骤如下:
(1)数据结构确认
明确横截面维度($i$)与时间维度($t$):例如,家庭面板的 $i$ 为家庭 ID,$t$ 为年份;
确认数据类型:平衡面板 (每个个体有相同的时间观测值,如 1000 个家庭各有 5 年数据)或非平衡面板 (个体的时间观测值数量不同,如部分家庭缺失 2022 年数据)。
(2)缺失值处理
平衡面板:若缺失值较少,可使用线性插值或均值填充(但需注意填充后的结果是否合理);若缺失值较多,需删除缺失的个体/时间;
非平衡面板:固定效应模型会自动删除无足够时间观测的个体(如某家庭只有 1 年数据,无法计算时间均值);随机效应模型需使用最大似然估计(MLE)处理缺失值。
(3)异常值处理
使用箱线图或 3σ原则识别异常值(如收入超过均值 3 倍标准差的观测值);
处理方法:删除异常值、缩尾(Winsorize)或截尾(Truncate)——缩尾更常用(如将前 1% 和后 1% 的观测值替换为 1% 和 99% 分位数的值)。
(4)描述性统计分析 计算变量的个体内变异与个体间变异,判断固定效应模型是否适用(若个体内变异很小,则固定效应模型可能无法估计出显著结果):
个体内标准差 :$\sigma_W(X) = \sqrt{\frac{1}{NT} \sum_{i=1}^N \sum_{t=1}^T (X_{it} - \bar{X}_i)^2}$(同一个体随时间的变化);
个体间标准差 :$\sigma_B(X) = \sqrt{\frac{1}{N} \sum_{i=1}^N (\bar{X}_i - \bar{X})^2}$(不同个体的差异);
变异比例 :$\frac{\sigma_W(X)}{\sigma_W(X) + \sigma_B(X)}$(个体内变异占总变异的比例)。
4.2 模型设定与初步估计 根据研究问题与数据特征,选择合适的模型并进行初步估计:
(1)混合回归模型(POLS)
估计方法:直接对所有观测值进行 OLS 估计;
适用场景:未观测异质性与解释变量完全不相关(但实际中很少成立);
结果解读:$\hat{\beta}^{POLS}$ 表示'个体间差异'与'个体内变化'的混合影响。
(2)固定效应模型(FE)
估计方法:组内离差变换 + OLS(或最小二乘虚拟变量法 LSDV);
最小二乘虚拟变量法(LSDV):在模型中加入 $N-1$ 个个体虚拟变量(如 $D_{i1}=1$ 表示个体 1,否则为 0),此时虚拟变量的系数即为个体固定效应 $\hat{\alpha}_i$;
注意事项:LSDV 与组内离差变换的结果完全一致(证明略),但当 $N$ 很大时(如 $N=1000$),LSDV 会消耗大量自由度,因此更推荐组内离差变换。
(3)随机效应模型(RE)
估计方法:可行广义最小二乘法(FGLS);
注意事项:若个体异质性与解释变量相关,则 RE 估计量有偏且不一致,因此需先进行 Hausman 检验。
4.3 模型选择与统计检验
(1)混合回归 vs 固定效应:F 检验
估计混合回归与固定效应模型,计算 F 统计量;
若 F 统计量显著(p 值 < 0.05),则拒绝原假设,选择固定效应模型。
(2)固定效应 vs 随机效应:Hausman 检验
估计固定效应与随机效应模型,计算 Hausman 统计量;
若 Hausman 统计量显著(p 值 < 0.05),则拒绝原假设,选择固定效应模型;否则选择随机效应模型。
(3)是否加入时间固定效应:F 检验
估计单向个体固定效应模型与双向固定效应模型,计算 F 统计量(原假设:所有时间固定效应相同);
若 F 统计量显著,则加入时间固定效应。
4.4 模型诊断与稳健性检验 模型估计后,需进行诊断检验(判断模型假设是否成立)与稳健性检验(判断结果是否可靠)。
(1)诊断检验
① 异方差检验
检验方法:White 检验或 Breusch-Pagan 检验;
原假设:误差项同方差;
若拒绝原假设:使用聚类稳健标准误(Cluster Robust Standard Errors)——聚类到个体层面(因为同一个体的误差存在相关性)。
聚类稳健标准误的计算公式为:
$$ Var(\hat{\beta}^{FE}){cluster} = \left( \sum {i=1}^N \tilde{X}_i'\tilde{X}i \right)^{-1} \left( \sum {i=1}^N \tilde{X}_i'\tilde{\epsilon}_i \tilde{\epsilon}_i'\tilde{X}i \right) \left( \sum {i=1}^N \tilde{X}_i'\tilde{X}_i \right)^{-1} $$
其中 $\tilde{X}i = (\tilde{X} {i1},..., \tilde{X}{iT})'$,$\tilde{\epsilon}i = (\tilde{\epsilon} {i1},..., \tilde{\epsilon} {iT})'$。
② 序列相关检验
检验方法:Wooldridge 检验;
原假设:误差项无序列相关($Cov(\epsilon_{it}, \epsilon_{it-1}) = 0$);
若拒绝原假设:使用聚类稳健标准误(可同时处理异方差与序列相关)或可行广义最小二乘法(FGLS)。
③ 工具变量有效性检验(若使用 IV)
弱工具变量检验:F 统计量(若 F > 10,则工具变量有效);
过度识别检验:Hansen J 统计量(原假设:工具变量与误差项不相关)。
(2)稳健性检验 稳健性检验是判断结果是否可靠的关键,常用方法如下:
① 改变模型设定
加入时间固定效应:从单向固定效应模型扩展为双向固定效应模型;
加入控制变量:增加可能影响被解释变量的其他变量(如家庭面板中加入家庭规模);
改变函数形式:将被解释变量取对数(如收入取对数,解释变量的系数表示弹性)。
② 更换估计方法
最小二乘虚拟变量法(LSDV):验证固定效应模型的结果是否一致;
动态面板模型:若存在滞后被解释变量(如 $y_{it-1}$),则使用 Arellano-Bond GMM 或 Blundell-Bond 系统 GMM 估计;
工具变量法(IV):若解释变量存在内生性(如双向因果、测量误差),则使用工具变量(如用'教育年限的工具变量'估计收入对消费的影响)。
③ 子样本分析
将样本分为不同的子样本(如男性/女性家庭、东部/西部企业),分别估计模型,判断结果是否稳定;
若子样本结果与总样本一致,则说明结果具有稳健性。
④ 安慰剂检验(Placebo Test)
核心思想:通过'虚假处理'验证结果是否由偶然因素导致;
操作方法:随机分配解释变量(如将教育年限随机打乱),重新估计模型,若估计系数不显著,则说明原结果是真实的;
应用场景:政策评估(如最低工资政策对就业的影响)——随机分配政策实施时间,若估计系数不显著,则说明政策效果是真实的。
4.5 结果解释与结论 模型估计与检验完成后,需清晰、准确地解释结果,并给出政策建议。
(1)核心参数解释
固定效应模型的系数 $\hat{\beta}^{FE}$:表示控制个体未观测异质性后,解释变量对被解释变量的边际影响(即同一个体内解释变量变化 1 单位时,被解释变量的平均变化量);
例如:若 $\hat{\beta}^{FE} = 0.5$(解释变量为教育年限,被解释变量为收入),则表示'在控制家庭理财能力等未观测特征后,教育年限增加 1 年,收入平均增加 0.5 万元'。
(2)个体固定效应解释
个体固定效应 $\hat{\alpha}_i$:表示未观测异质性对被解释变量的平均影响(如 $\hat{\alpha}_i = 2$ 表示家庭 $i$ 的理财能力使收入平均增加 2 万元);
注意事项:固定效应模型无法估计不随时间变化的变量(如性别、种族)——因为这些变量的个体内变异为零($\tilde{X}{it} = X {it} - \bar{X}_i = 0$),因此系数无法识别。
(3)时间固定效应解释
时间固定效应 $\hat{\lambda}t$:表示时间共同冲击对被解释变量的影响(如 $\hat{\lambda} {2020} = -1$ 表示 2020 年疫情使所有家庭的收入平均减少 1 万元)。
(4)结论与政策建议
总结核心发现:明确解释变量对被解释变量的影响方向与大小;
给出政策建议:根据结果提出可操作的政策(如'增加教育投入能提高长期收入,因此政府应加大教育补贴');
指出局限性:说明模型的不足(如未考虑非线性关系、内生性问题),为未来研究提供方向。
五、适用边界与局限性
5.1 模型类型的适用条件 模型类型 适用场景 局限性 混合回归(POLS) 未观测异质性与解释变量完全不相关 忽略异质性会导致严重偏差 固定效应(FE) 未观测异质性与解释变量相关(如家庭能力与收入) 无法估计不随时间变化的变量;依赖个体内变异 随机效应(RE) 未观测异质性与解释变量不相关(如企业地理位置与广告支出) 若异质性与解释变量相关,估计量有偏;依赖随机抽样假设 双向固定效应(Two-Way FE) 同时存在个体与时间未观测异质性,且至少一个与解释变量相关 无法估计不随时间/个体变化的变量;计算复杂度高
5.2 数据维度的适用条件 面板数据的维度($N$ 与 $T$ 的大小)直接影响模型的选择与估计结果:
(1)大 N 小 T(如 $N=1000, T=5$)
适用模型:固定效应、随机效应模型;
渐近性质:依赖于 $N \to \infty$(即个体数趋于无穷大);
注意事项:若 $T$ 很小(如 $T=2$),则固定效应模型的估计精度较低(因为时间均值的方差较大)。
(2)小 N 大 T(如 $N=10, T=50$)
适用模型:动态面板模型(如 Arellano-Bond GMM);
注意事项:需检验时间序列的单位根(Unit Root)与协整(Cointegration)——若变量存在单位根,则静态模型可能失效,需使用误差修正模型(ECM)。
(3)平衡面板 vs 非平衡面板
平衡面板:估计简单,结果可靠;
非平衡面板:需使用最大似然估计(MLE)或加权最小二乘法(WLS)处理缺失值;若缺失值是随机的(Missing at Random, MAR),则结果仍一致;若缺失值是非随机的(Missing Not at Random, MNAR),则结果有偏。
5.3 内生性问题的处理 内生性是面板数据模型中最常见的问题之一,主要来源包括双向因果、测量误差与遗漏变量。以下是常用的处理方法:
(1)工具变量法(IV)
核心思想:找到与解释变量相关但与误差项不相关的工具变量(IV);
适用场景:解释变量存在双向因果(如收入影响消费,消费也影响收入);
估计方法:两阶段最小二乘法(2SLS)——第一阶段用工具变量预测解释变量,第二阶段用预测值估计模型;
注意事项:工具变量需满足相关性(与解释变量相关)与外生性(与误差项不相关)两个条件。
(2)动态面板模型
核心思想:在模型中加入滞后被解释变量(如 $y_{it-1}$),控制动态效应;
模型形式:$y_{it} = \rho y_{it-1} + X_{it}\beta + \alpha_i + \epsilon_{it}$;
估计方法:Arellano-Bond GMM(差分 GMM)或 Blundell-Bond 系统 GMM;
适用场景:存在路径依赖(如收入具有惯性)或滞后效应(如教育对收入的影响需要时间)。
(3)双重差分模型(DID)
核心思想:通过'处理组'与'控制组'的差异,估计政策的平均处理效应(ATE);
模型形式:$y_{it} = \alpha_i + \lambda_t + \delta (Treatment_i \times Post_t) + \epsilon_{it}$;
其中 $Treatment_i=1$ 表示处理组(受政策影响的个体),$Post_t=1$ 表示政策实施后的时间;
适用场景:政策评估(如最低工资政策对就业的影响)——需满足平行趋势假设(处理组与控制组在政策实施前的趋势一致)。
六、总结 面板数据模型是处理多维度数据的核心工具,其优势在于:
分离未观测异质性 :通过固定效应或随机效应控制个体/时间层面的未观测特征;
利用双重信息 :结合横截面与时间维度的信息,提高估计精度;
识别动态因果 :通过动态面板模型或双重差分模型,估计变量的动态效应与政策效果。
模型选择的核心依据是未观测异质性与解释变量的相关性:
若相关:选择固定效应模型;
若不相关:选择随机效应模型;
若同时存在个体与时间异质性:选择双向固定效应模型。
在实际应用中,需严格遵循数据预处理→模型估计→统计检验→稳健性检验→结果解释的流程,确保结果的可靠性与政策含义的准确性。
Wooldridge, J. M. (2010). Econometric Analysis of Cross Section and Panel Data (2nd ed.). MIT Press.(面板数据模型的'圣经',涵盖所有核心理论与方法)
Arellano, M. (2003). Panel Data Econometrics . Oxford University Press.(动态面板模型的权威著作)
Baltagi, B. H. (2021). Econometric Analysis of Panel Data (6th ed.). Wiley.(面板数据模型的综合教材,包含最新研究进展)
Cameron, A. C., & Trivedi, P. K. (2005). Microeconometrics: Methods and Applications . Cambridge University Press.(微观计量经济学的经典教材,涵盖面板数据的非线性模型)
案例介绍 模拟企业面板数据(2015-2019 年,200 家企业),研究研发投入对企业利润的影响,使用双向固定效应模型,包含个体(企业)固定效应和时间固定效应。
完整代码 import numpy as np
import pandas as pd
import statsmodels.api as sm
from linearmodels.panel import PanelOLS
from linearmodels.panel import PooledOLS
from linearmodels.iv import IV2SLS
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif' ] = ['SimHei' ]
plt.rcParams['axes.unicode_minus' ] = False
def simulate_panel_data (n_firms=200 , n_years=5 , seed=42 ):
"""
模拟企业面板数据
:param n_firms: 企业数量
:param n_years: 时间跨度(年数)
:param seed: 随机种子,保证结果可复现
:return: 面板数据 DataFrame
"""
np.random.seed(seed)
firms = np.repeat(range (n_firms), n_years)
years = np.tile(range (2015 , 2015 + n_years), n_firms)
firm_effects = np.repeat(np.random.normal(10 , 2 , n_firms), n_years)
time_effects = np.tile(np.random.normal(5 , 1 , n_years), n_firms)
R_D = np.random.normal(20 , 5 , n_firms * n_years) + firm_effects * 0.2 + time_effects * 0.1
assets = np.random.normal(100 , 20 , n_firms * n_years) + firm_effects * 0.5
epsilon = np.random.normal(0 , 3 , n_firms * n_years)
profit = 0.8 * R_D + 0.2 * assets + firm_effects + time_effects + epsilon
data = pd.DataFrame({
'firm_id' : firms,
'year' : years,
'R_D' : R_D,
'assets' : assets,
'profit' : profit
})
data = data.set_index(['firm_id' , 'year' ])
return data
def preprocess_panel_data (data ):
"""
面板数据预处理(缺失值、异常值处理)
:param data: 原始面板数据
:return: 预处理后面板数据
"""
data = data.dropna()
for col in ['R_D' , 'assets' , 'profit' ]:
q1 = data[col].quantile(0.01 )
q99 = data[col].quantile(0.99 )
data[col] = np.clip(data[col], q1, q99)
return data
def estimate_panel_models (data ):
"""
估计面板数据模型并进行检验
:param data: 预处理后面板数据
:return: 各模型估计结果
"""
y = data['profit' ]
X = data[['R_D' , 'assets' ]]
pooled = PooledOLS(y, sm.add_constant(X)).fit()
fe_individual = PanelOLS(y, X, entity_effects=True ).fit()
two_way_fe = PanelOLS(y, X, entity_effects=True , time_effects=True ).fit()
try :
from linearmodels.panel import RandomEffects
re_model = RandomEffects(y, sm.add_constant(X)).fit()
except ImportError:
re_model = None
return pooled, fe_individual, two_way_fe, re_model
def hausman_test (fe_results, re_results ):
"""
执行 Hausman 检验(固定效应 vs 随机效应)
:param fe_results: 固定效应模型结果
:param re_results: 随机效应模型结果
:return: Hausman 检验统计量和 p 值
"""
if re_results is None :
return "RandomEffects 模型未安装"
common_params = list (set (fe_results.params.index) & set (re_results.params.index))
if not common_params:
return "没有公共参数,无法进行 Hausman 检验"
fe_beta = fe_results.params[common_params]
re_beta = re_results.params[common_params]
fe_cov = fe_results.cov.loc[common_params, common_params]
re_cov = re_results.cov.loc[common_params, common_params]
diff = fe_beta - re_beta
var_diff = fe_cov - re_cov
hausman_stat = diff.T @ np.linalg.pinv(var_diff) @ diff
from scipy.stats import chi2
df = len (diff)
p_value = 1 - chi2.cdf(hausman_stat, df)
return f"Hausman 统计量:{hausman_stat:.4 f} , p 值:{p_value:.4 f} "
if __name__ == "__main__" :
panel_data = simulate_panel_data()
processed_data = preprocess_panel_data(panel_data)
pooled_result, fe_individual_result, two_way_fe_result, re_result = estimate_panel_models(processed_data)
print ("混合回归模型结果:" )
print (pooled_result)
print ("\n单向个体固定效应模型结果:" )
print (fe_individual_result)
print ("\n双向固定效应模型结果:" )
print (two_way_fe_result)
print ("\nHausman 检验结果:" )
hausman_result = hausman_test(fe_individual_result, re_result)
print (hausman_result)
plt.figure(figsize=(12 , 8 ))
plt.scatter(panel_data['R_D' ], panel_data['profit' ], alpha=0.3 , label='原始数据' )
plt.axline((20 , two_way_fe_result.params['assets' ]*100 + two_way_fe_result.params['R_D' ]*20 ),
slope=two_way_fe_result.params['R_D' ],
color='red' ,
label=f'双向 FE 拟合线(斜率:{two_way_fe_result.params["R_D" ]:.2 f} )' )
plt.xlabel('研发投入(R_D)' )
plt.ylabel('企业利润' )
plt.title('研发投入与企业利润的关系' )
plt.legend()
plt.grid(True )
plt.savefig('R_D_profit_relation.png' , dpi=300 )
plt.show()
这份代码是数学建模比赛中面板数据双向固定效应模型的完整研究流程实现,涵盖「模拟数据→预处理→多模型估计→Hausman 检验→可视化」全环节,核心目标是验证研发投入对企业利润的影响。接下来从数学原理、代码逻辑、建模细节三方面逐块解析:
1. 导入与环境配置 import numpy as np
import pandas as pd
import statsmodels.api as sm
from linearmodels.panel import PanelOLS, PooledOLS, RandomEffects
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif' ] = ['SimHei' ]
plt.rcParams['axes.unicode_minus' ] = False
关键解释:
库选择逻辑 :
numpy/pandas:用于数据模拟与结构化处理(面板数据的核心载体是 pd.DataFrame)。
linearmodels:专门为面板数据设计的库,支持直接指定个体/时间固定效应(无需手动生成哑变量),比 statsmodels 更高效。
statsmodels:仅用于给混合回归模型添加常数项。
中文显示 :比赛中图表需中文标注,避免乱码。
2. 面板数据模拟函数 simulate_panel_data
核心数学模型(真实数据生成过程) 模拟的是平衡面板数据(200 企业×5 年=1000 条观测),真实关系符合双向固定效应模型:
$$ \text{profit}{it} = 0.8 \cdot R {D,it} + 0.2 \cdot \text{assets}{it} + \alpha_i + \lambda_t + \varepsilon {it} $$
其中:
$\alpha_i$:个体固定效应 (企业固有特征,如管理水平,不随时间变)。
$\lambda_t$:时间固定效应 (宏观冲击,如政策、经济周期,不随企业变)。
$\varepsilon_{it}$:随机误差项 (满足 $E(\varepsilon_{it})=0, Var(\varepsilon_{it})=3$ 的正态分布)。
真实核心系数:研发投入对利润的边际效应为 0.8(后续模型估计需验证该值)。
代码逐行解析 def simulate_panel_data (n_firms=200 , n_years=5 , seed=42 ):
np.random.seed(seed)
firms = np.repeat(range (n_firms), n_years)
years = np.tile(range (2015 , 2015 + n_years), n_firms)
firm_effects = np.repeat(np.random.normal(10 , 2 , n_firms), n_years)
time_effects = np.tile(np.random.normal(5 , 1 , n_years), n_firms)
R_D = np.random.normal(20 , 5 , n_firms * n_years) + firm_effects * 0.2 + time_effects * 0.1
assets = np.random.normal(100 , 20 , n_firms * n_years) + firm_effects * 0.5
epsilon = np.random.normal(0 , 3 , n_firms * n_years)
profit = 0.8 * R_D + 0.2 * assets + firm_effects + time_effects + epsilon
data = pd.DataFrame({
'firm_id' : firms,
'year' : years,
'R_D' : R_D,
'assets' : assets,
'profit' : profit
})
data = data.set_index(['firm_id' , 'year' ])
return data
关键细节:
双索引设置 :这是 linearmodels 识别「个体维度(firm_id)」和「时间维度(year)」的唯一方式,必须放在预处理前。
R_D 的内生性模拟 :让 R_D 与 $\alpha_i$、$\lambda_t$ 关联(系数 0.2、0.1),模拟现实中「好企业研发多、经济好年份研发多」的情况,避免数据太理想。
3. 面板数据预处理 preprocess_panel_data def preprocess_panel_data (data ):
data = data.dropna()
for col in ['R_D' , 'assets' , 'profit' ]:
q1 = data[col].quantile(0.01 )
q99 = data[col].quantile(0.99 )
data[col] = np.clip(data[col], q1, q99)
return data
数学原理:
缩尾法 vs 删除法 :删除异常值会损失样本,缩尾法保留样本同时避免极端值对回归系数的影响,是论文/比赛中连续变量异常值处理的标准方法。
4. 面板模型估计 estimate_panel_models
核心模型对比逻辑 为验证「双向固定效应模型的有效性」,同时估计 4 种面板模型做对比:
混合回归(POLS) :忽略个体/时间效应,将所有观测视为截面数据。
单向个体固定效应(FE) :仅控制 $\alpha_i$,忽略 $\lambda_t$。
双向固定效应(Two-Way FE) :同时控制 $\alpha_i$ 和 $\lambda_t$(研究目标模型)。
随机效应(RE) :假设 $\alpha_i$ 与解释变量不相关,将其视为随机变量(用于 Hausman 检验)。
代码解析 def estimate_panel_models (data ):
y = data['profit' ]
X = data[['R_D' , 'assets' ]]
pooled = PooledOLS(y, sm.add_constant(X)).fit()
fe_individual = PanelOLS(y, X, entity_effects=True ).fit()
two_way_fe = PanelOLS(y, X, entity_effects=True , time_effects=True ).fit()
try :
re_model = RandomEffects(y, sm.add_constant(X)).fit()
except ImportError:
re_model = None
return pooled, fe_individual, two_way_fe, re_model
关键细节:
PanelOLS 的常数项 :默认不包含常数项,因为固定效应 $\alpha_i$ 已涵盖个体层面的截距差异;若需全局常数项,需手动添加 sm.add_constant(X)。
双向 FE 的识别 :通过 time_effects=True 自动生成时间哑变量,无需手动创建(如 2015-2019 年生成 4 个哑变量)。
5. Hausman 检验 hausman_test
数学原理
原假设 :随机效应(RE)的核心假设成立($\alpha_i$ 与解释变量不相关)。
备择假设 :RE 假设不成立,需用固定效应(FE)。
检验统计量 :
$$ H = (\hat{\beta}{FE} - \hat{\beta} {RE})^T \cdot [Var(\hat{\beta}{FE}) - Var(\hat{\beta} {RE})]^{-1} \cdot (\hat{\beta}{FE} - \hat{\beta} {RE}) $$
服从自由度为 $k$(解释变量个数)的 $\chi^2$ 分布,若 $p<0.05$ 则拒绝原假设。
代码解析 def hausman_test (fe_results, re_results ):
if re_results is None :
return "RandomEffects 模型未安装"
common_params = list (set (fe_results.params.index) & set (re_results.params.index))
if not common_params:
return "无公共参数,无法检验"
fe_beta = fe_results.params[common_params]
re_beta = re_results.params[common_params]
fe_cov = fe_results.cov.loc[common_params, common_params]
re_cov = re_results.cov.loc[common_params, common_params]
diff = fe_beta - re_beta
var_diff = fe_cov - re_cov
hausman_stat = diff.T @ np.linalg.pinv(var_diff) @ diff
from scipy.stats import chi2
df = len (diff)
p_value = 1 - chi2.cdf(hausman_stat, df)
return f"Hausman 统计量:{hausman_stat:.4 f} , p 值:{p_value:.4 f} "
关键细节:
广义逆的使用 :当方差矩阵不可逆时,np.linalg.pinv 可替代逆矩阵,保证检验可执行。
参数筛选 :FE 模型无常数项,RE 模型有,需只对比 R_D 和 assets 的系数。
6. 主程序与结果输出
流程执行 if __name__ == "__main__" :
panel_data = simulate_panel_data()
processed_data = preprocess_panel_data(panel_data)
pooled_result, fe_individual_result, two_way_fe_result, re_result = estimate_panel_models(processed_data)
print ("混合回归结果:" , pooled_result, sep=" " )
print (" 单向个体 FE 结果:" , fe_individual_result, sep=" " )
print (" 双向 FE 结果:" , two_way_fe_result, sep=" " )
print (" Hausman 检验:" , hausman_test(fe_individual_result, re_result), sep=" " )
plt.figure(figsize=(12 , 8 ))
plt.scatter(panel_data['R_D' ], panel_data['profit' ], alpha=0.3 , label='原始数据' )
plt.axline((20 , two_way_fe_result.params['assets' ]*100 + two_way_fe_result.params['R_D' ]*20 ),
slope=two_way_fe_result.params['R_D' ],
color='red' ,
label=f'双向 FE 拟合线(斜率:{two_way_fe_result.params["R_D" ]:.2 f} )' )
plt.xlabel('研发投入(R_D)' )
plt.ylabel('企业利润' )
plt.title('研发投入与企业利润的关系' )
plt.legend()
plt.savefig('R_D_profit_relation.png' , dpi=300 )
plt.show()
结果预期:
双向 FE 的 R_D 系数 :应接近真实值 0.8(误差由随机误差项 $\varepsilon_{it}$ 导致)。
Hausman 检验 :若 RE 安装,p 值<0.05,拒绝原假设,说明需用固定效应模型。
可视化 :红色拟合线的斜率即为研发投入对利润的边际效应(控制了个体/时间效应和资产规模)。
7. 建模比赛中的扩展应用
真实数据替换 :将 simulate_panel_data 替换为 pd.read_csv 读取真实面板数据,注意必须保证双索引格式。
模型拓展 :若存在内生性(如研发投入与利润双向因果),可使用代码中导入的 IV2SLS(工具变量法)。
稳健性检验 :
更换缩尾分位数(如 2%)。
用不同的固定效应模型(如单向时间 FE)对比。
结果呈现 :论文中需报告双向 FE 的系数、标准误、显著性,结合 Hausman 检验说明模型选择的合理性。
核心总结 这份代码是面板数据双向固定效应模型的标准化建模模板,从数据生成到结果输出完全符合数学建模比赛的要求。其核心优势在于:
模拟数据严格遵循研究假设,可验证模型有效性。
使用专业面板数据库 linearmodels,代码简洁且不易出错。
包含预处理、多模型对比、检验、可视化全流程,可直接用于论文写作或队友讲解。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online