面板数据:区别于独立混合横截面,面板数据是指在不同时间跟踪同一批个体,确保每个样本个体在不同时间都有观测值,其兼具横截面和时间序列的特征。
混合横截面对于评价某一事件或政策的影响可能非常有用。
我们以伍德里奇《计量经济学导论:现代方法》的“第13章 跨时横截面的混合:简单面板数据方法”的案例13.3为例,本例的数据样本为美国的垃圾焚化炉和住房相关数据,分别有1978年和1981年两个横截面数据集,1981年动工建造垃圾焚化炉,研究其对住房价格的影响。
import wooldridge as woo
import pandas as pd
import statsmodels.formula.api as smf
kielmc = woo.dataWoo('kielmc')
变量设置:rprice表示住房价格,nearinc为虚拟变量,表示是否靠近垃圾焚化炉,如果靠近(3英里内)则为1,否则为0。
我们可以将数据集分为1978年数据和1981年数据,分别将rprice对nearinc做回归,模型如下:
r p r i c e = π 0 + π 1 n e a r i n c + u rprice=\pi_0+\pi_1nearinc+u rprice=π0+π1nearinc+u
代码如下:
#1978年和1981年数据分别回归:
y78 = (kielmc['year'] == 1978)
reg78 = smf.ols(formula='rprice ~ nearinc', data=kielmc, subset=y78)
results78 = reg78.fit()
print(results78.summary().tables[1])
y81 = (kielmc['year'] == 1981)
reg81 = smf.ols(formula='rprice ~ nearinc', data=kielmc, subset=y81)
results81 = reg81.fit()
print(results81.summary().tables[1])
结果如下:
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 8.252e+04 2653.790 31.094 0.000 7.73e+04 8.78e+04
nearinc -1.882e+04 4744.594 -3.968 0.000 -2.82e+04 -9461.117
==============================================================================
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 1.013e+05 3093.027 32.754 0.000 9.52e+04 1.07e+05
nearinc -3.069e+04 5827.709 -5.266 0.000 -4.22e+04 -1.92e+04
==============================================================================
我们可以用一个回归方程允许两种不同的截距和斜率:
y = β 0 + δ 0 D + β 1 x + δ 1 D ∗ x + u y=\beta_0+\delta_0D+\beta_1x+\delta_1D*x+u y=β0+δ0D+β1x+δ1D∗x+u
其中 D为虚拟变量, δ 0 ≠ 0 \delta_0\neq0 δ0=0代表两个组别的截距不同,\delta_0\neq0意味着两个组别的斜率不同。
因此,检验两组的回归方程是否不同可以检验涉及虚拟变量的项的系数是否联合显著。
H 0 : δ 0 = 0 , δ 1 = 0 H_0:\delta_0=0,\delta_1=0 H0:δ0=0,δ1=0
具体到本案例,我们可以将1978年和1981年数据进行联合回归,设定虚拟变量y81,若数据为1981年数据,则为1;若数据为1978年数据,则为0。构建模型:
r p r i c e = β 0 + δ 0 y 81 + β 1 n e a r i n c + δ 1 y 81 ∗ n e a r i n c + u rprice=\beta_0+\delta_0y81+\beta_1nearinc+\delta_1y81*nearinc+u rprice=β0+δ0y81+β1nearinc+δ1y81∗nearinc+u
模型具体情况:
年份 | 截距项 | nearinc系数 |
---|---|---|
1978 | β 0 \beta_0 β0 | β 1 \beta_1 β1 |
1981 | β 0 + δ 0 \beta_0+\delta_0 β0+δ0 | β 1 + δ 1 \beta_1+\delta_1 β1+δ1 |
代码如下:
#设置年份虚拟变量,将全数据样本进行回归
reg_joint = smf.ols(formula='rprice ~ nearinc * C(year)', data=kielmc)
results_joint = reg_joint.fit()
print(results_joint.summary().tables[1])
结果如下:
===========================================================================================
coef std err t P>|t| [0.025 0.975]
-------------------------------------------------------------------------------------------
Intercept 8.252e+04 2726.910 30.260 0.000 7.72e+04 8.79e+04
C(year)[T.1981] 1.879e+04 4050.065 4.640 0.000 1.08e+04 2.68e+04
nearinc -1.882e+04 4875.322 -3.861 0.000 -2.84e+04 -9232.293
nearinc:C(year)[T.1981] -1.186e+04 7456.646 -1.591 0.113 -2.65e+04 2806.867
===========================================================================================
结果显示,Intercept表示1978年的不靠近焚化炉的住房平均价格是82520美元,nearinc系数说明在1978年,靠近垃圾焚化炉位置的房价比不靠近的低18820美元;C(year)[T.1981]即为y81,系数表明1981年的平均房价相对1978年增长了18790美元;交互项系数表明房价因新建焚化炉而变化的幅度。
#联合显著性F检验
hypotheses = ['C(year)[T.1981] = 0','nearinc:C(year)[T.1981] = 0']
f_test = results_joint.f_test(hypotheses)
print(f_test)
结果如下:
由结果可知,F检验的p值<1%,说明在1%的显著性水平下,可以拒绝原假设。
在含有k个解释变量和一个截距项的一般模型中,假设有两组数据,模型分别为:
y = α 0 + α 1 x 1 + . . . + α k x k + u y = β 0 + β 1 x 1 + . . . + β k x k + u y=\alpha_0+\alpha_1x_1+...+\alpha_kx_k+u\\ y=\beta_0+\beta_1x_1+...+\beta_kx_k+u y=α0+α1x1+...+αkxk+uy=β0+β1x1+...+βkxk+u
由于不同组别之间可能会存在差异 (截距项或斜率项存在差异),因此,我们需要检验这些差异在统计上是否显著。检验原假设:
α i = β i , i = 0 , 1 , 2 , . . . , k \alpha_i=\beta_i,i=0,1,2,...,k αi=βi,i=0,1,2,...,k
邹氏参数稳定性检验的步骤:
(1)分别用第一组数据估计模型得到残差平方和 S S R 1 SSR_1 SSR1,用第二组数据估计模型得到残差平方和 S S R 2 SSR_2 SSR2
(2)将两组数据并为一个大样本估计模型,得到残差平方和 S S R SSR SSR
(3)通过F统计量进行假设检验。如果F大于相应的临界值,则拒绝原假设,认为发生了结构变化,参数是非稳定的。
F = [ S S R − ( S S R 1 + S S R 2 ) ] / ( k + 1 ) S S R / [ n − 2 ( k + 1 ) ] ∼ F ( k + 1 , n − 2 ( k + 1 ) ) F=\frac {[SSR-(SSR_1+SSR_2)]/(k+1)} {SSR/[n-2(k+1)]}\sim F(k+1,n-2(k+1)) F=SSR/[n−2(k+1)][SSR−(SSR1+SSR2)]/(k+1)∼F(k+1,n−2(k+1))
#1978年和1981年数据分别回归
y78 = (kielmc['year'] == 1978)
reg78 = smf.ols(formula='rprice ~ nearinc', data=kielmc, subset=y78)
results78 = reg78.fit()
print(results78.summary().tables[1])
y81 = (kielmc['year'] == 1981)
reg81 = smf.ols(formula='rprice ~ nearinc', data=kielmc, subset=y81)
results81 = reg81.fit()
#1978年和1981年数据合并回归
reg_sum = smf.ols(formula='rprice ~ nearinc', data=kielmc)
results_sum = reg_sum.fit()
#邹氏检验
ssr_1=results78.ssr
ssr_2=results81.ssr
ssr=results_sum.ssr
n=len(kielmc)
k=1
F=(ssr-ssr_1-ssr_2)/(k+1)/(ssr_1+ssr_2)*(n-2*k-2)
p_value=1-stats.f.cdf(F,k+1,n-2*k-2)
print(f'F统计量: {F}')
print(f'p_value: {p_value}')
结果为:
F统计量: 11.374436971311864
p_value: 1.6956879821616866e-05
由结果知,F检验的p值<1%,说明在1%的显著性水平下,可以拒绝原假设。
import wooldridge as woo
import pandas as pd
import statsmodels.formula.api as smf
import scipy.stats as stats
kielmc = woo.dataWoo('kielmc')
#设置年份虚拟变量,将全数据样本进行回归
reg_joint = smf.ols(formula='rprice ~ nearinc * C(year)', data=kielmc)
results_joint = reg_joint.fit()
print(results_joint.summary().tables[1])
#联合显著性F检验(原假设:涉及年份虚拟变量的系数均为0)
hypotheses = ['C(year)[T.1981] = 0','nearinc:C(year)[T.1981] = 0']
f_test = results_joint.f_test(hypotheses)
print(f_test)
#1978年和1981年数据分别回归
y78 = (kielmc['year'] == 1978)
reg78 = smf.ols(formula='rprice ~ nearinc', data=kielmc, subset=y78)
results78 = reg78.fit()
print(results78.summary().tables[1])
y81 = (kielmc['year'] == 1981)
reg81 = smf.ols(formula='rprice ~ nearinc', data=kielmc, subset=y81)
results81 = reg81.fit()
#1978年和1981年数据合并回归
reg_sum = smf.ols(formula='rprice ~ nearinc', data=kielmc)
results_sum = reg_sum.fit()
#邹氏检验
ssr_1=results78.ssr
ssr_2=results81.ssr
ssr=results_sum.ssr
n=len(kielmc)
k=1
F=(ssr-ssr_1-ssr_2)/(k+1)/(ssr_1+ssr_2)*(n-2*k-2)
p_value=1-stats.f.cdf(F,k+1,n-2*k-2)
print(f'F统计量: {F}')
print(f'p_value: {p_value}')
以伍德里奇《计量经济学导论:现代方法》的“第7章 含有定性信息的多元回归分析:二值(或虚拟)变量”的7-4-c为例,研究大学男女运动员的大学GPA,尝试用以上方法进行研究。
代码如下:
import wooldridge as woo
import pandas as pd
import statsmodels.formula.api as smf
import scipy.stats as stats
gpa3 = woo.dataWoo('gpa3')
#设置性别虚拟变量,将全数据样本进行回归
reg = smf.ols(formula='cumgpa ~ female * (sat + hsperc + tothrs)',
data=gpa3, subset=(gpa3['spring'] == 1))
results = reg.fit()
#联合显著性F检验(原假设:涉及性别虚拟变量的系数均为0)
hypotheses = ['female = 0', 'female:sat = 0',
'female:hsperc = 0', 'female:tothrs = 0']
ftest = results.f_test(hypotheses)
print(ftest)
#分组分别进行回归
reg_m = smf.ols(formula='cumgpa ~ sat + hsperc + tothrs',
data=gpa3,
subset=(gpa3['spring'] == 1) & (gpa3['female'] == 0))
results_m = reg_m.fit()
reg_f = smf.ols(formula='cumgpa ~ sat + hsperc + tothrs',
data=gpa3,
subset=(gpa3['spring'] == 1) & (gpa3['female'] == 1))
results_f = reg_f.fit()
#合并回归
reg_sum=smf.ols(formula='cumgpa ~ sat + hsperc + tothrs',
data=gpa3,
subset=(gpa3['spring'] == 1))
results_sum=reg_sum.fit()
#邹氏检验
ssr_1=results_m.ssr
ssr_2=results_f.ssr
ssr=results_sum.ssr
n=(gpa3['spring'] == 1).sum()
k=3
F=(ssr-ssr_1-ssr_2)/(k+1)/(ssr_1+ssr_2)*(n-2*k-2)
p_value=1-stats.f.cdf(F,k+1,n-2*k-2)
print(f'F统计量: {F}')
print(f'p_value: {p_value}')
结果如下:
F统计量: 8.179111637046145
p_value: 2.5446371918480537e-06
我们获取的结果与伍德里奇教材的一致。