【Python计量】linearmodels面板数据回归(一)
ecoil杆菌
编辑于 2024年04月08日 00:12

我们以伍德里奇《计量经济学导论:现代方法》的”第14章 高级面板数据方法“的案例14.1为例,使用jtrain中的数据来进行固定效应估计。

一、导入相关库

import wooldridge as woo

import pandas as pd

import statsmodels.formula.api as smf

from linearmodels.panel import PanelOLS

二、获取面板数据

在使用面板数据分析工具之前,首先要改变一下数据结构,使数据集体现出面板数据的特征,表明每个观察个体的身份信息和时间信息。具体的方法是增加两个索引,也就是说通过这两个索引可以确定唯一的一条数据。

jtrain  = woo.dataWoo('jtrain') print(jtrain) jtrain = jtrain.set_index(['fcode','year']) #pandas库的函数,用于将dataFrame的一列或多列作为索引,按照指定的列将数据重新排列,生成一个新的索引对象 # DataFrame.set_index(keys, *, drop=True, append=False, inplace=False, verify_integrity=False) # key:数据表中的某列 / 列标签列表 / 数组列表,需要设置为索引的列。 # drop:删除用作新索引的列,默认为True,删除。 # append:是否将列附加到现有索引,默认为False,否。 # inplace:表示当前操作是否对原数据重新,默认为False,否。 # verify_integrity:检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为False,将提高该方法的性能,默认为False。

根据fcode和year来进行索引

三、固定效应模型

固定效应,即面板数据中随个体变化但不随时间变化的一类变量方法。

消除固定效应的一种方法是去除时间均值法,即将每个变量的每条数据都减去该变量按照时间的均值,得到的差值称为去除时间均值数据,然后利用去除时间均值数据进行回归估计参数的方法。

本质上消除固定效应的目的就是减少个体特点对研究结果的影响。固定效应代表了每个观测单位(个人、公司等)特有的属性或特征,这些特征可能会对研究结果产生影响。通过消除固定效应,我们试图确保在控制了这些个体特点的情况下,更准确地研究解释变量对因变量的影响。因此,减少个人特点对研究结果的影响是消除固定效应的核心目标之一。

对每个i求方程在时间上的平均,即:

于是得到如下方程:

进而得到去除固定效应而又保留参数的方程:

这样处理虽然可以消除固定效应,但是把不随时间变化的解释变量也剔除了,如种族、性别等变量。

(一)使用ols估计固定效应模型

#求被解释变量、解释变量的去除时间均值

jtrain['lscrap_w'] = jtrain['lscrap'] - jtrain.groupby('fcode').mean()['lscrap']

jtrain['d88_w'] = jtrain['d88'] - jtrain.groupby('fcode').mean()['d88']

jtrain['d89_w'] = jtrain['d89'] - jtrain.groupby('fcode').mean()['d89']

jtrain['grant_w'] = jtrain['grant'] - jtrain.groupby('fcode').mean()['grant']

jtrain['grant_1_w'] = jtrain['grant_1'] - jtrain.groupby('fcode').mean()['grant_1']

#用OLS方程对去除时间均值进行估计

results_man = smf.ols(formula='lscrap_w ~ 0 + d88_w + d89_w + grant_w + grant_1_w', data=jtrain).fit()

print(results_man.summary())

结果如下:

(二)使用PanelOLS估计固定效应模型

模块提供PandelOLS进行固定效应模型。表示特定因素。

exog_vars = ['d88','d89','grant','grant_1'] exog = jtrain[exog_vars] reg_fe = PanelOLS(jtrain.lscrap,exog,entity_effects= True) # reg_fe = PanelOLS.from_formula(formula= 'lscrap ~ d88 + d89 + grant + grant_1+ EntityEffects',data=jtrain) results_fe = reg_fe.fit() print(results_fe)

根据固定效应方法的估计方程可以知道,固定效应方程是没有截距项的,所以在以上代码中不增加常数项。