Python和Pandas中的差别在于差异

10

我正在尝试使用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

通过一些研究,我发现以下是使用Pandas处理固定效应和面板数据的方法:

Pandas或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

I was told(由一位经济学家告知)这似乎没有使用固定效应。--编辑--我想要验证的是许可数量对得分的影响,考虑到时间因素。许可证数量是处理变量,是一种密集型处理。代码示例可以在此处找到:https://www.dropbox.com/sh/ped312ur604357r/AACQGloHDAy8I2C6HITFzjqza?dl=0

1
我并没有仔细看你在做什么,但是使用公式界面可以让patsy完成创建虚拟变量和交互作用的所有工作。 - Josef
您不需要正式“声明”面板数据以执行差异和差异回归(它在技术上是基本的OLS回归),pandas数据框就可以了。关于R样式公式,您只需要阅读这个链接:http://statsmodels.sourceforge.net/devel/example_formulas.html - etna
我明白我必须使用pandas来使用固定面板。@etna: http://stackoverflow.com/questions/29065097/pandas-with-fixed-effects - pceccon
如果您解释一下您的研究问题和数据,那么帮助您会更容易。差异性分析旨在调查“治疗”的结果:您想要调查的是什么治疗?您想要测量治疗的影响的变量是哪个? - etna
你说得对,@etna。我现在尝试解释一下。谢谢。 - pceccon
1个回答

7
看起来您需要的不是差异与差异(DD)回归。当您可以区分控制组和治疗组时,DD回归才相关。一个标准的简化示例是评估药物。将生病人群分为两组。一半的人什么都不给:他们是对照组。另一半人被给予药物:他们是治疗组。实质上,DD回归将捕获这样一个事实,即药物的真正效果无法直接以服用药物的人数为指标衡量。直观地说,您想知道这些人是否比没有服用任何药物的人表现更好。通过添加另一类别“安慰剂”,即给予某些看起来像药物但实际上不是药物的人,可以进一步细化此结果...但再次,这将是一个明确定义的组。最后但并非最不重要的是,为了使DD回归真正适用,您需要确保群体在可能会偏误结果的方式上不是异质的。您的药物测试的糟糕情况是,如果治疗组只包括年轻而超级健康的人(因此总体上更有可能康复),而对照组则是一群老酒鬼...
在您的情况下,如果我没有弄错,每个人都在某种程度上得到了“治疗”...因此,您更接近于标准回归框架,其中需要测量X对Y(例如IQ对工资)的影响。我了解您想要衡量许可证数量对分数的影响(或者反过来是吗?-_-),并且您必须处理经典的内生性问题,即如果Peter比Paul更有技能,他通常会获得更多的许可证和更高的分数。因此,您实际上要使用的是,具有相同水平的技能的Peter(分别是Paul)将在多年的时间内“获得”不同级别的许可证...然后您将真正测量许可证对分数的影响...
我可能猜不太好,但我想坚持一个事实,即如果您不花足够的精力理解/解释数据中发生的情况,就会有许多获得偏见的,因此毫无意义的结果。关于技术细节,您的估计只有年固定效应(可能不是估计而是通过去平均化考虑),因此您要做的就是添加entity_effects = True。如果您想进一步...恐怕面板数据回归在任何Python包中都没有得到很好的覆盖(包括作为计量经济学参考的statsmodels),因此如果您不想投资...我宁愿建议使用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']))

关于计量经济学,你可能会在交叉验证网站上获得更多/更好的答案。


感谢你的详细回答,@etna。我没有将它视为差分中的问题,但有人告诉我这是一种“强烈治疗”方法,需要编写代码来实现… - pceccon
对于仅输出x的系数和标准误差,ix对我来说无法正常工作,因此我尝试使用iloc,但出现了“索引器过多”的错误。有什么想法吗? - Marzieh Karimi
我做到了 print(reg_cl.summary()) 但是我收到了这个错误信息:约束条件的协方差矩阵不具有完整的秩。约束条件的数量为3027,但秩只有7个警告。警告:'covariance of constraints does not have full . 对于我来说,这部分(仅输出x的系数和标准误差)无法工作! - Marzieh Karimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接