跟着开源项目学因果推断——FixedEffectModel 固定效应模型(十七)

Posted 悟乙己

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟着开源项目学因果推断——FixedEffectModel 固定效应模型(十七)相关的知识,希望对你有一定的参考价值。

这个开源项目来源于快手,当然对于快手的开源项目是有前车之鉴的【生存分析——快手的基于深度学习框架的集成⽣存分析软件KwaiSurvival(一)】。KwaiSurvival让我觉得是实验代码,今天要接触的FixedEffectModel 稍好一些,但是仍然关联文档非常匮乏呀。

1 来源

启发源头来自一篇文章,来源地址:因果分析工具在快手的应用


2 说说固定效应模型

开发库的应该是计量经济方向的老师,FEM模型可是我们专业的论文利器,先来快速帮助自己回忆一下当年做这个模型的固定建模套路。

2.1 理论简述

曾经是版主的人大论坛有一些简单描述【[面板数据求助] 混合OLS模型、固定效应模型、随机效应模型的区别是什么?】:

  • 1.混合估计模型就是各个截面估计方程的 截距和斜率项都一样,也就是说回归方程估计结果在截距项和斜率项上是一样的
  • 2.随机效应模型和固定效应模型则认为回归方程估计结果在截距项和斜率项上是不一样的,所以你可以选择变截距模型,也可以选择变系数模型

固定效应模型可分为三类:
(1)个体固定效应模型:个体固定效应模型是对于不同的时间序列(个体)只有截距项不同的模型:

从时间和个体上看,面板数据回归模型的解释变量对被解释变量的边际影响均是相同的,而目除模型的解释变量之外,影响被解释变量的其他所有(未包括在回归模型或不可观测的)确定性变量的效应只是随个体变化而不随时间变化。

(2)时点固定效应模型:时点固定效应模型就是对于不同的截面(时点)有不同截距的模型。如果确知对于不同的截面,模型的截距显著不同,但是对于不同的时间序列(个体)截距是相同的,那么应该建立时点固定效应摸型:

(3)时点个体固定效应模型:时点个体固定效应模型就是对于不同的截面(时点)、不同的时间序列(个体)都有不同截距的模型。如果确知对于不同的截面、不同的时间序列(个体)模型的截距都显著不相同,那么应该建立时点个体固定效应模型:

2.2 用eviews实现固定效应模型

[经验分享] 面板数据之固定效应模型的建立

2.2.1 面板数据检验

单位根检验即平稳性检验。3种方法:相同根情形下的单位根LLC(Levin-Lin-Chu)检验,不同根情形下的单位根检验Fisher-ADF和Fisher-PP检验。
如果检验结果中三种检验中均存在单位根的原假设,则此面板数据是平稳的,反之则不平稳。

2.2.2 模型设定和检验结果分析

首先,根据Hausman检验,在选择固定效应模型或随机效应模型之间作出取舍。

原假设和备择假设是:
H0:个体效应与回归变量无关(个体随机效应回归模型);
H1:个体效应与回归变量相关(个体固定效应回归模型)。

在随机效应模型的回归结果中进行豪斯曼检验
拒绝原假设,说明解释变量与个体效应相关,因此不是随机效应模型而是固定效应模型。

其次,我们通过F检验来确定建立固定系数模型还是变系数模型。

原假设和备择假设是:

  • 假设1:斜率在不同的横截面样本点上和时间上都相同,但截距不同。
  • 假设2:截距和斜率在不同的横截面样本点上和时间上都相同。

判断规则:

  • 拒绝H2,则为不变参数模型即模型③,相当于不用面板数据回归。
  • 拒绝H2,接受H1,则为截距项不同的固定效应模型,即模型②;
  • 拒绝H2,拒绝H1,则截距项和斜率都不同,即变参数模型①。

① 变系数模型

② 变截距模型

不变参数模型

经过上述的推断分析和经验过程,我们针对方程最终建立的是固定效应变系数模型。

固定系数效应模型估计结果如下表:

3 FixedEffectModel的使用

github:
https://github.com/ksecology/FixedEffectModel

安装:

 pip install FixedEffectModel

涵盖的模型包括:

  • Linear model
  • Linear model with high dimensional fixed effects
  • Difference-in-difference model with parallel checking plot
  • Instrumental variable model
  • Robust/white standard error
  • Multi-way cluster standard error
  • Instrumental variable model tests, including weak iv test (cragg-dolnald statistics+stock and yogo critical values), over-identification test (sargan/Basmann test), endogeneity test (durbin test)

For instrumental variable model, we now only provide two stage least square estimator and produce second stage regression result.
In our next release we will include GMM method and robust standard error based on GMM.

3.1 简单示例

import pandas
from FixedEffectModel.api import *
from utils.panel_dgp import gen_data


N = 100
T = 10
beta = [-3,-1.5,1,2,3,4,5] 
ate = 1 
exp_date = 2

df = gen_data(N, T, beta, ate, exp_date)


consist_input = ['x_1','x_2'] # independent variables
out_input = ['y']
category_input = ['id','time']  # 固定效应
cluster_input = ['id','time']   # 分类-输出结果分类
endo_input = ['x_3','x_4']  # 内生变量:endogenous independent variables
iv_input = ['x_5','x_6']        # 工具变量

result1 = ols_high_d_category(df,
                              consist_input,
                              out_input,
                              category_input,
                              cluster_input,
                              endo_input,
                              iv_input,
                              formula=None,
                              robust=False,
                              c_method = 'cgm',
                              epsilon = 1e-8,
                              max_iter = 1e6)

#show result
result1.summary()

从time可以看出来,生成的模拟数据是一个面板数据:

得到的模型结论:

                 High Dimensional Fixed Effect Regression Results                 
==================================================================================
  Dep. Variable:               y   R-squared(proj model):             -2.749e+05  
  No. Observations:         1000   Adj. R-squared(proj model):        -3.096e+05  
  DoF of residual:         887.0   R-squared(full model):             -2.416e+05  
  Residual std err:    3977.6992   Adj. R-squared(full model):        -2.724e+05  
  Covariance Type:     clustered   F-statistic(proj model):               0.0017  
  Cluster Method:            cgm   Prob (F-statistic (proj model)):       1.0000  
                                   DoF of F-test (proj model):          [4.0, 9]  
                                   F-statistic(full model):            2.543e-05  
                                   Prob (F-statistic (full model)):       1.0000  
                                   DoF of F-test (full model):        [113, 887]  
==========================================================================================
                    coef cluster std err          t      P>|t|       [0.025      0.975]   
------------------------------------------------------------------------------------------
  const       -250.73283      6005.79285    -0.0417     0.9667  -12037.9545  11536.4889   
  x_1           48.64828      1243.56217     0.0391     0.9688   -2392.0191   2489.3157   
  x_2          153.05847      3700.41112     0.0414     0.9670   -7109.5240   7415.6410   
  hat_x_3    -3904.29585     94284.66692    -0.0414     0.9670 -188951.3491 181142.7574   
  hat_x_4      755.68036     17806.23744     0.0424     0.9662  -34191.5902  35702.9510   
==========================================================================================
=============================================
             First-Stage F-stat      P > F   
---------------------------------------------
  x_3                    0.4130     0.7994   
  x_4                    0.5341     0.7107   
=============================================

#get fixed effects 固定效应
getfe(result1)

输出结果为:

    dummy_name       effect           s.e   t-value     P>|t|
0        id1.0  -927.667109  22502.699068 -0.041225  0.967126
1        id2.0   507.346007  12430.347112  0.040815  0.967452
2        id3.0 -2671.189437  64333.241496 -0.041521  0.966890
3        id4.0   543.810098  13143.803153  0.041374  0.967007
4        id5.0   185.897042   4757.012648  0.039079  0.968837
..         ...          ...           ...       ...       ...
105    time6.0  -197.069938   4828.720590 -0.040812  0.967455
106    time7.0   398.671416   9713.998689  0.041041  0.967273
107    time8.0   268.889328   6491.382174  0.041423  0.966968
108    time9.0  -204.926493   4954.929115 -0.041358  0.967020
109   time10.0  -138.471971   3333.637133 -0.041538  0.966877

# IV检测
# Diagnostics and specification tests
# We provide specification test for iv models:
ivtest(result1)

输出结果为:

Weak IV test with critical values based on 2SLS size
================================================
  Cragg-Donald Statistics:            0.000577  
  number of instrumental variables:          2  
  number of endogenous variables:            2  
=============================================================================
                                      5%        10%        20%        30%    
-----------------------------------------------------------------------------
2SLS Size of nominal 5% Wald test     7.0300     4.5800     3.9500     3.6300
-----------------------------------------------------------------------------
H0: Instruments are weak

     Over identification test - nonrobust     
==============================================
                    test statistics  p values 
----------------------------------------------
Sargan Statistics:                0          0
Basmann Statistics:               0          0
----------------------------------------------

             Tests of endogeneity            
=============================================
                   test statistics  p values 
---------------------------------------------
Durbin Statistics:        974.8824          0
---------------------------------------------
H0: variables are exogenous


3.2 DID模型

from FixedEffectModel.api import *
from utils.panel_dgp import gen_data

N = 100
T = 10
beta = [-3,-1.5,1,2,3,4,5] 
alpha = 0.9
ate = 1 
exp_date = 2

#generate sample data
data_df = gen_data(N, T, beta, ate, exp_date)

#did wrt group effect
formula = 'y~0|id+time|0|0'
result = ols_high_d_category(data_df,
                             formula=formula,
                             treatment_input ={'treatment_col':'treatment',
                                               'exp_date':5,
                                               'effect':'group'})
result.summary()

#did wrt individual effect
formula = 'y~0|id+time|0|0'
result = ols_high_d_category(data_df,
                             formula=formula,
                             treatment_input ={'treatment_col':'treatment',
                                               'exp_date':5,
                                               'effect':'individual'})
result.summary()

其中formula的含义为:因变量 ~ 连续变量| 固定效应|分类
可以看到,这个treatment_input是当要进行DID建模时候使用的

以上是关于跟着开源项目学因果推断——FixedEffectModel 固定效应模型(十七)的主要内容,如果未能解决你的问题,请参考以下文章

跟着开源项目学因果推断——FixedEffectModel 固定效应模型(十七)

跟着开源项目学因果推断——FixedEffectModel 固定效应模型(十七)

跟着开源项目学因果推断——causalnex(十三)

跟着开源项目学因果推断——causalnex(十三)

跟着开源项目学因果推断——mr_uplift(十五)

跟着开源项目学因果推断——mr_uplift(十五)