2016-05-12 36 views
3

PythonとPandasを使用してDifference in Differences(パネルデータと固定効果のある)解析を実行しようとしています。私は経済学の背景がなく、私はデータをフィルタリングし、私が言われた方法を実行しようとしています。しかし、私の知る限り学ぶことができるよう、私は基本的なデフ・イン・差分モデルは次のようになりますことを理解: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

私は、これは固定で実行していないように見えること(経済学者で)言われました効果。私が確認したいこと

--EDIT--

時間与えられ、スコア上の許可証の数の効果です。許可の数は治療ですが、集中治療です。

コードのサンプルは、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/pandas-with-fixed-effects – pceccon

答えて

3

あなたが必要とするのは違い(DD)回帰の違いではないようです。 DD回帰は、対照群と治療群を区別できる場合に関連します。簡素化された標準的な例は、医療機関の評価です。あなたは病気の人の人口を2つのグループに分けました。それらの半分は何も与えられていません。彼らはコントロールグループです。他の半分には薬が与えられています:彼らは治療グループです。本質的に、DD回帰は、薬の実際の効果が、薬を与えられた人の数が健康になるという点で直接的に測定可能ではないという事実を捉えます。直感的に言えば、これらの人々が薬を与えられていない人よりも優れているかどうかを知りたがります。この結果は、さらに別のカテゴリーを追加することによって洗練され得る:プラセボ、すなわち、薬のように見えるが実際にはないものを与えられる人々...しかし、これもまた明確なグループであろう。最後に、DD回帰が本当に適切であるためには、結果を偏らせる可能性のある方法でグループが異種でないことを確認する必要があります。コントロールグループが古いアルコール中毒者の束である一方で、あなたの薬検査のための悪い状況は、若者とスーパーフィット(従って一般的に治癒する可能性が高い)だけの人々だけが含まれている場合、コントロールグループは...古いアルコール症の束です。あなたが誤解されていないならば、誰もがある程度「扱われる」ことになるので、Xに対するYの影響(例えば賃金に関するIQ)を測定する標準的な回帰フレームワークに近づきます。私はあなたがスコア上の許可の数の影響を測定したいと思っていることを理解しています(あるいはそれは他の方法ですか?-_-)。そして、あなたは対処する古典的な内在性を持っています。すなわち、PeterがPaulより熟練すれば、典型的にはより多くの許可とより高い得点を得る。あなたが実際に使ってみたいのは、同じレベルのスキルで、ピーター(それぞれポール)が何年にもわたって異なるレベルの許可を「与えられる」という事実です。そこには、許可証の影響を実際に測定しますオンスコア...

私はうまく推測できないかもしれませんが、偏った結果を得るための方法がたくさんあることを強く主張したいと思います。データを処理しています。技術的な詳細については、推定値は年固定効果しかない(推定値ではないかもしれないが、減量によって考慮されるので、出力には戻されない)ので、entity_effects = Trueを追加することです。あなたがさらに進めたいのであれば...私は残念ながら、パネルデータの回帰はこれまでのPythonパッケージではうまくカバーされていません(計量経済学のための参照であれば統計モデルを含む)ので、投資したくなければ...むしろ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'])) 

、あなたはより多くの可能性が得られます/こちらよりもCross Validatedの方が良いでしょう。

+0

詳細な回答、@etnaありがとうございます。私はdiff-in-diffsの問題としてそれを見ませんでしたが、私はそれが "集中的な扱い"であり、このメソッドをコーディングすると言われました... – pceccon