12_面板数据
第12章 面板数据
12.1 面板数据的特点
定义 面板数据
一段时间内跟踪同一组个体的数据。
分类:
分类 | 分类准则 | 特点 |
---|---|---|
短面板 | n、T的大小 | n小、T大 |
长面板 | n大、T小 | |
动态面板 | 是否有被解释变量滞后项 | 有 |
静态面板* | 否 | |
平衡面板* | 每个时期样本中的个体是否完全相同 | 是 |
非平衡面板 | 否 | |
*:重点关注的类型 |
优点:
- 可以解决遗漏变量问题
- 前提是个体差异不随时间而改变
- 提供更多个体动态行为的信息
- 样本容量较大
12.2 面板数据的估计策略
基本思路:
- 最容易想到的办法:混合回归
- 直接把全部数据混合起来用做回归分析
- 假定了每个个体拥有完全相同的回归方程
- 忽略了个体不可观测的异质性,而异质性可能与解释变量相关,导致估计不一致。
- 直接把全部数据混合起来用做回归分析
- 另一个办法:每个个体估计单独的回归方程
- 样本不足,尤其是短面板
- 只能折中:个体效应模型
- 假定个体的回归方程拥有相同斜率,但截距项不同
- 用于捕捉异质性
- 模型:$$y_{it}=x_{it}’\beta+z_i\delta+u_i+\epsilon_{it} \tag{12.3}$$
- \(z_i\) :不随时间变化的个体特征
- \(x_{it}\) :可随时间和个体变化
- \(u_i+\epsilon_{it}\) :复合扰动项
- \(u_i\) :个体效应,个体异质性的截距项
- 固定效应模型:与某个解释变量相关
- 随机效应模型:与所有解释变量均不相关
- \(\epsilon_{it}\):个殊性扰动项,可随个体和时间变化
- 一般假设iid
- 与 \(u_{it}\) 相互独立
- \(u_i\) :个体效应,个体异质性的截距项
- 假定个体的回归方程拥有相同斜率,但截距项不同
12.3 混合回归
如果面板数据中个体都拥有完全相同的回归方程,个体效应 \(u_i=\alpha\) 为常数,就变成了多元线性回归模型。可以直接使用OLS进行回归。
- 基本假设是不存在个体效应,因此需要进行统计检验。
- 固定效应
- 个体固定效应
- 组内估计量
- LSDV法
- 一阶差分法
- 时间固定效应
- LSDV法
- 个体固定效应
- 随机效应
- 准离差模型:FGLS法
- 组间估计量
- 固定效应
聚类(cluster):每个个体不同时期的所有观测值
聚类样本:样本可分为不同的聚类,同一聚类的观测值相关,不同聚类不相关。
聚类稳健的标准误:聚类样本仍可进行OLS估计,但需要使用聚类稳健标准误
- 是真实标准误的一致估计
- 是异方差稳健的标准误
- 更适用于T>n的情况
12.4 固定效应模型:组内估计量
因 \(u_i\) 与某解释变量相关,OLS不一致。所以,可通过变换模型消除个体效应 \(u_i\) 。
- (12.3)两边对时间取平均值 $$\overline y_i = \overline x_i'\beta+z_i'\delta + u_i + \overline \epsilon_i \tag{12.4}$$
- (12.3)-(12.4)
- 使用OLS估计出固定效应估计量 \(\beta\),记为\(\hat \beta_{FE}\),也称 组内估计量
组内估计量的特点:
- 【优点】:即使个体效应与解释变量相关,也可得到一致估计
- 可能存在自相关,应使用以每个个位为聚类的聚类稳健标准误
- 【缺点】:无法估计 \(\delta\)
12.5 固定效应模型:LSDV法
针对 \(u_i\) ,传统上将其视为个体 i 的待估参数——截距项。
- 引入(n-1)个 个体虚拟变量。模型变为$$\overline y_i = \alpha+\overline x_i'\beta+z_i'\delta + \sum_{i=2}^n\gamma_iD_i + \overline \epsilon_i \tag{12.7}$$
- 用OLS估计(12.7),称为最小二乘虚拟变量法(Least squares dummy variable)
LSDV的特点:
- 【优点】:可以得到对个体异质性 \(u_i\) 的估计
- 【缺点】:如果n很大,将引入特别多的虚拟变量
12.6 固定效应模型:一阶差分法
对(12.3)两边做一阶差分可消除个体效应,也可用OLS估计一阶差分估计量\(\beta\) ,记为 \(\hat \beta_{FD}\)。
12.7 时间固定效应
有时可能存在随时间变化的遗漏变量,比如宏观经济环境。在(12.3)中加入时间固定效应(\(\lambda_t\)):$$y_{it}=x_{it}’\beta+z_i\delta+\lambda_t+u_i+\epsilon_{it} \tag{12.10}$$
- 使用LSDV法估计,引入T-1个时间虚拟变量$$y_{it}=\alpha+x_{it}’\beta+z_i\delta+\sum_{t=2}^T\gamma_tD_t+u_i+\epsilon_{it} \tag{12.11}$$
- 有时为节省参数,可引入时间趋势项:$$y_{it}=x_{it}’\beta+z_i\delta+\gamma t+u_i+\epsilon_{it} \tag{12.12}$$
通过检验时间虚拟变量的联合显著性来判断是否应使用双向固定效应模型。
12.8 随机效应模型
因为存在自相关性,所以OLS不是最有效率的,可进行FGLS估计。
- 使用(12.20)来估计 \(\theta\),$$\hat\theta \equiv1-\frac{\hat\sigma_{\epsilon}}{\sqrt{T\hat\sigma_u2+\hat\sigma_{\epsilon}2}} \tag{12.20}$$
- \(\sigma_u^2 + \sigma_{\epsilon}^2\):用
OLS的残差
进行估计 - \(\sigma_{\epsilon}^2\):用
FE的残差
进行估计
- \(\sigma_u^2 + \sigma_{\epsilon}^2\):用
- 再用FGLS估计原模型,即可得到随机效应估计量(random effects estimatior),记为 \(\hat\beta_{RE}\)
假设扰动项服从正态分布,可写出样本的似然函数,可以使用MLE。
12.9 组间估计量
对(12.4)进行OLS回归得到组间估计量,记为\(\hat\beta_{BE}\) 。
12.10 拟合优度的度量
整体 \(R^2\) = \([Corr(y_{it},x_{it}'\hat\beta+z_i'\hat\delta)]^2\)
- 对应原模型(12.3):\(\overline y_i = \overline x_i'\beta+z_i'\delta + u_i + \overline \epsilon_i\)
组内 \(R^2\) = \([Corr(\widetilde{y}_{it},\widetilde{x}_{it}'\hat\beta)]^2\)
- 组内离差模型(12.6):\(\widetilde{y_i} = \widetilde{x}_{it}'\beta + \widetilde{ \epsilon_{it}}\)
组间 \(R^2\) = \([Corr(\overline y_{it},\overline x_{it}'\hat\beta+z_i'\hat\delta)]^2\)
- 对时间求平均值的模型(12.21):\(\overline y_i = \overline x_i'\beta+z_i'\delta + u_i + \overline \epsilon_i\)
12.11 非平衡面板
每个时期观测到的个体不完全相同,称为非平衡面板。
- 模型中运用了对时间的离差或平均值的,均没有影响。
12.12 究竟该用固定效应还是随机效应模型
原假设:\(H_0\):\(u_i\) 与 \(x_{it}\),\(z_i\) 不相关 (随机效应模型为正确模型)
- 原理:
- FE 两种模型下 都是一致的
- RE 如果成立,效率比FE高
- 都收敛于真实值
- 使用Hausman检验统计量
- 存在异方差情况,需使用异方差稳健的hausman检验
12.13 面板模型的python命令及实例
1.面板数据的设定
import pandas as pd
import statsmodels.api as sm
from linearmodels.panel import PanelOLS, PooledOLS, RandomEffects, FirstDifferenceOLS,BetweenOLS
class Dataset:
def __init__(self, data):
self.data_original = data
self.data = self._int_data()
self.exog = self._init_exog(lm=False)
self.endog = self.data['ltvfo']
self.data_lm = self.data.set_index(['prov', 'year'])
self.exog_lm = self._init_exog(lm=True)
self.dept_lm = self.data_lm[['ltvfo']]
self.exog_lm_dv_n = self._init_exog(lm=True, dv='entity')
self.exog_lm_dv_t = self._init_exog(lm=True, dv='time')
def _int_data(self):
self.data_original['year_d'] = self.data_original['year'].astype(str)
self.data_original['prov_d'] = self.data_original['prov'].astype(str)
data = self.data_original.dropna()
return data
def _init_exog(self,lm=True, dv = None):
if lm:
exog = self.data_lm[[
'ltlan', 'ltwlab', 'ltpow',
'ltfer', 'hrs', 'mipric1',
'giprice','mci', 'ngca'
]]
if dv == 'entity':
exog = self.data_lm[[
'ltlan', 'ltwlab', 'ltpow',
'ltfer', 'hrs', 'mipric1',
'giprice', 'mci', 'ngca',
'prov_d'
]]
if dv == 'time':
exog = self.data_lm[[
'ltlan', 'ltwlab', 'ltpow',
'ltfer', 'hrs', 'mipric1',
'giprice', 'mci', 'ngca',
'year_d'
]]
else:
exog = self.data[[
'ltlan', 'ltwlab', 'ltpow',
'ltfer', 'hrs', 'mipric1',
'giprice', 'mci', 'ngca',
]]
exog = sm.add_constant(exog)
return exog
data = pd.read_stata('../2_Data/Data-2e/lin_1992.dta')
lin = Dataset(data)
2.混合回归
model = PooledOLS(dependent=lin.dept_lm, exog=lin.exog_lm)
result = model.fit(cov_type='clustered', # 采用聚类标准误
cluster_entity=True, # 按个体进行聚类
group_debias=True) # 是否按照个体数n进行聚类
print(result.summary)
3.固定效应
个体固定效应
(1)组内估计
mod = PanelOLS(dependent=lin.dept_lm, exog=lin.exog_lm, entity_effects=True)
fe_res = mod.fit(use_lsdv=False,
cov_type='clustered',
cluster_entity=True,
group_debias=True)
(2)虚拟变量
如果要把虚拟变量的参数也显示出来,需要使用exog= lin.exog_lm_dv_n
mod = PanelOLS(dependent=lin.dept_lm, exog= lin.exog_lm_dv_n) # exog需要调整
fe_res = mod.fit(use_lsdv=True,
cov_type='clustered',
cluster_entity=True,
group_debias=True
)
print(fe_res)
(3)一阶差分法
mod = FirstDifferenceOLS(dependent=lin.dept_lm,
exog=lin.exog_lm.drop(columns=['const']))
fe_res = mod.fit(cov_type='robust',
)
print(fe_res)
双向固定
(1)加入时间趋势项
panel_lin = lin.data_lm
exog = panel_lin[[
'ltlan', 'ltwlab', 'ltpow','ltfer','hrs','mipric1','giprice','mci','ngca','t'
]] # 增加了时间趋势变量't'
exog = sm.add_constant(exog)
mod = PanelOLS(dependent=lin.dept_lm, exog=exog, entity_effects=True)
fe_res = mod.fit(cov_type='clustered',
cluster_entity=True,
group_debias=True
)
print(fe_res)
(2)加入时间虚拟变量
需要删除mipric1
和giprice
全国各地都一样,会出现严格多重共线,导致虚拟变量失效,删掉。
mod = PanelOLS(dependent=lin.dept_lm,
exog= lin.exog_lm_dv_t.drop(['mipric1','giprice'], axis=1),
entity_effects=True)
res= mod.fit(cov_type='clustered', cluster_entity=True, group_debias=True)
print(res)
如果不需要显示虚拟变量的结果,直接使用:
mod = PanelOLS(dependent=lin.dept_lm,
exog= lin.exog_lm,
entity_effects=True,
time_effects=True,
drop_absorbed=True)
fe_res = mod.fit(use_lsdv=True, cov_type='clustered',
cluster_entity=True, group_debias=True)
print(fe_res)
4.随机效应
mod = RandomEffects(dependent=lin.dept_lm, exog= lin.exog_lm.drop(['mipric1','giprice'], axis=1))
re_res = mod.fit(
# cov_type='clustered',
# cluster_entity=True,
# group_debias=True
)
print(re_res)
5.豪斯曼检验
import numpy as np
import scipy.stats as stats
mod = PanelOLS(dependent=lin.dept_lm, exog=lin.exog_lm.drop(['mipric1','giprice'], axis=1), entity_effects=True)
fe_res = mod.fit()
b_diff = fe_res.params - re_res.params
v_diff = fe_res.cov - re_res.cov
df = len(fe_res.params)
table = pd.DataFrame({'FE': fe_res.params,
'RE':re_res.params,
'dif.':b_diff,
'SE(dif.)':np.sqrt(np.diag(v_diff))
}, index=fe_res.params.index)
chi2 = np.dot(b_diff.T,np.linalg.inv(v_diff).dot(b_diff))
p = 1- stats.chi2.cdf(chi2, df)
print(table)
print('=================================================')
print('Chi-squared:', chi2)
print('degrees of freedom:', df)
print(f'p-value:{p:.4f}')
print('=================================================')
6.组间统计量
mod = BetweenOLS(dependent=lin.dept_lm, exog= lin.exog_lm.drop(['mipric1','giprice'], axis=1))
bt_res = mod.fit()
print(bt_res)