2016-05-12 183 views
3

我正在尝试使用Python和Pandas执行Difference in Differences(使用面板数据和固定效果)分析。我没有经济学背景,我只是试图过滤数据并运行我被告知的方法。但是,据我了解,我了解,基本的差异,在-diff文件模型是这样的:Python + Pandas差异的差异

enter image description here

即,我处理一个多变量模型。

这如下中的R的简单示例:

https://thetarzan.wordpress.com/2011/06/20/differences-in-differences-estimation-in-r-and-stata/

如可以看到的那样,回归作为输入一个因变量和树组观测的。

我输入的数据是这样的:

Name Permits_13 Score_13 Permits_14 Score_14 Permits_15 Score_15 
0 P.S. 015 ROBERTO CLEMENTE 12.0 284 22 279 32 283 
1 P.S. 019 ASHER LEVY 18.0 296 51 301 55 308 
2 P.S. 020 ANNA SILVER 9.0 294 9 290 10 293 
3 P.S. 034 FRANKLIN D. ROOSEVELT 3.0 294 4 292 1 296 
4 P.S. 064 ROBERT SIMON 3.0 287 15 288 17 291 
5 P.S. 110 FLORENCE NIGHTINGALE 0.0 313 3 306 4 308 
6 P.S. 134 HENRIETTA SZOLD 4.0 290 12 292 17 288 
7 P.S. 137 JOHN L. BERNSTEIN 4.0 276 12 273 17 274 
8 P.S. 140 NATHAN STRAUS 13.0 282 37 284 59 284 
9 P.S. 142 AMALIA CASTRO 7.0 290 15 285 25 284 
10 P.S. 184M SHUANG WEN 5.0 327 12 327 9 327 

通过一些研究,我发现,这是使用固定效应和面板数据与熊猫的方式:我进行了一些

Fixed effect in Pandas or Statsmodels

转换以获得多指标数据:

rng = pandas.date_range(start=pandas.datetime(2013, 1, 1), periods=3, freq='A') 
index = pandas.MultiIndex.from_product([rng, df['Name']], names=['date', 'id']) 
d1 = numpy.array(df.ix[:, ['Permits_13', 'Score_13']]) 
d2 = numpy.array(df.ix[:, ['Permits_14', 'Score_14']]) 
d3 = numpy.array(df.ix[:, ['Permits_15', 'Score_15']]) 
data = numpy.concatenate((d1, d2, d3), axis=0) 
s = pandas.DataFrame(data, index=index) 
s = s.astype('float') 

然而,我没有得到如何通过所有这些变量的模型,如在R中可以这样做:

reg1 = lm(work ~ post93 + anykids + p93kids.interaction, data = etc) 

在这里,13,14,15表示2013年的数据,2014年,2015年,这我相信应该用来创建一个面板。 我所谓的模型是这样的:

reg = PanelOLS(y=s['y'],x=s[['x']],time_effects=True) 

这是结果:

enter image description here

有人告诉我(用经济学家)认为,这似乎并没有固定运行效果。

- 编辑 -

我想确认是在分数允许的数量的影响,由于时间。许可证的数量是治疗,这是一个强化治疗

代码示例可以在这里找到:https://www.dropbox.com/sh/ped312ur604357r/AACQGloHDAy8I2C6HITFzjqza?dl=0

+0

我没有仔细看看你在做什么,但使用公式接口,你可以让patsy完成创建虚拟变量和交互效果的所有工作。 – user333700

+0

您不需要正式“申报”面板数据以在差异回归中执行差异(技术上它是基本的OLS回归),熊猫数据框就可以。关于R风格的公式,你只需要阅读:http://statsmodels.sourceforge.net/devel/example_formulas.html – etna

+0

我明白,我不得不使用熊猫来使用固定面板,@etna:http:// stackoverflow。 com/questions/29065097 /带有固定效应的熊猫 – pceccon

回答

3

看来你需要的不是差异(DD)回归差异。当您可以区分对照组和治疗组时,DD回归是相关的。一个标准的简化例子就是对一种药物的评估。你分成两组病人。他们中的一半没有得到任何东西:他们是对照组。另一半给予药物:他们是治疗组。从本质上讲,DD回归将捕获这样一个事实,即药物的真正效果不能直接衡量有多少人获得了药物的健康。直觉上,你想知道这些人是否比没有得到任何药物的人做得更好。这个结果可以通过增加另一个类别来完善:一种安慰剂,即给予看起来像药物但实际上不是......的东西的人,但是这又是一个明确界定的群体。最后但并非最不重要的一点,为了使DD回归真的合适,您需要确保群体不会以可能偏倚结果的方式存在异质性。如果治疗组仅包括年轻和超级适合的人(因此更可能在一般情况下愈合),而对照组是一群老酗酒者,那么对于您的药物测试的不利情况将是:

在你的情况,如果我没有弄错,每个人都会在某种程度上得到“对待”......所以你更接近一个标准的回归框架,在这个框架中要衡量X对Y的影响(例如,IQ对工资的影响)。我知道你想测量许可数量对分数的影响(或者是否是另一种方式?-_-),并且你有古典的内生性来处理,即如果彼得比保罗更熟练,他会通常获得更多的许可和更高的分数。所以你真正想要使用的事实是,随着时间的推移,彼得(分别是保罗)将具有相同的技能水平,将被赋予“不同级别的许可证”......在那里你将真正衡量许可证的影响力对得分...

我可能猜测得不好,但我想坚持这样一个事实,即如果你没有足够的努力来理解/解释什么是错误的,那么有很多方法可以获得有偏差的,因此没有意义的结果在数据中继续。关于技术细节,你的估计只有一年的固定效应(可能不是估计的,但是通过贬低来考虑,因此不会在产出中得到回报),所以你想要做的就是增加entity_effects = True。如果你想进一步...恐怕面板数据回归在任何Python软件包到目前为止都没有被很好地涵盖(包括statsmodels如果是计量经济学的参考),所以如果你不愿意投资...... I宁愿建议使用R或Stata。同时,如果固定效应的回归是所有你需要,你也可以用statsmodels得到它(这也使得,如果需要集群标准误差...):

import statsmodels.formula.api as smf 
df = s.reset_index(drop = False) 
reg = smf.ols('y ~ x + C(date) + C(id)', 
       data = df).fit() 
print(reg.summary()) 
# clustering standard errors at individual level 
reg_cl = smf.ols(formula='y ~ x + C(date) + C(id)', 
       data=df).fit(cov_type='cluster', 
           cov_kwds={'groups': df['id']}) 
print(reg_cl.summary()) 
# output only coeff and standard error of x 
print(u'{:.3f} ({:.3f})'.format(reg.params.ix['x'], reg.bse.ix['x'])) 
print(u'{:.3f} ({:.3f})'.format(reg_cl.params.ix['x'], reg_cl.bse.ix['x'])) 

关于计量经济学,你可能会得到更多的/交叉验证的答案比这里更好。

+0

谢谢你详细的回答,@etna。我没有把它看作差异化差异问题,但我被告知这是一种“强化治疗”,并且对这种方法进行编码...... – pceccon