首页 > Python资料 博客日记

Python 因果推断(下)

2024-10-29 00:00:05Python资料围观39

这篇文章介绍了Python 因果推断(下),分享给大家做个参考,收藏Python资料网收获更多编程知识

六、2007-2009 年大衰退期间加拿大就业市场上白人女性名字的溢价

原文:causal-methods.github.io/Book/6%29_The_Premium_of_Having_a_White_Female_Name_in_the_Canadian_Job_Market_During_the_Great_Recession_2007_2009.html

译者:飞龙

协议:CC BY-NC-SA 4.0

Vitor Kamada

电子邮件:econometrics.methods@gmail.com

最近更新:2020 年 9 月 15 日

我重新分析了 Oreopoulos(2011)的实验数据,并发现在 2007-2009 年大萧条期间,在加拿大的就业市场中,拥有白人女性名字是有优势的。白人女性在 2009 年 2 月至 9 月之间的回电率比白人男性高出 8%。考虑到白人男性在不同的回归规范下的回电率约为 10%,这一效应的幅度是相当高的。

Oreopoulos(2011)发现,英文名字的回电率为 15.7%,而印度、巴基斯坦、中国和希腊名字的回电率为 6%。我认为他的主要发现在很大程度上是由白人女性驱动的。我发现,在 2009 年 2 月至 9 月的大萧条最严重时期,拥有白人男性名字与印度、中国和希腊男性名字相比,并没有太多优势。

我使用了 Oreopoulos(2011)的数据集。每一行是发送给多个多伦多和蒙特利尔地区职业的简历。

import numpy as np
import pandas as pd
pd.set_option('precision', 3)

# Data from Oreopoulos (2011)
path = "https://github.com/causal-methods/Data/raw/master/" 
df = pd.read_stata(path + "oreopoulos.dta")
df.head(5) 
公司 ID职业类型name_ethnicity额外证书名字语言技能资格认证参考法律列出的资格认证说话技能社交能力写作能力秋季数据中国人印度人英国人巴基斯坦人中加人相同经验
0-3行政加拿大0.0JillWilson0.00.00.00.00.070.050.067.02.0NaNNaNNaNNaNNaNNaN
1-3行政印度0.0PanavSingh0.00.00.00.00.070.050.067.02.0NaNNaNNaNNaNNaNNaN
2-3行政印度0.0RahulKaur0.00.00.01.01.070.050.067.02.0NaNNaNNaNNaNNaNNaN
3-3行政中国0.0雷丽0.01.01.00.01.070.050.067.02.0NaNNaNNaNNaNNaNNaN
4-4行政印度0.0MayaKumar1.00.00.00.00.080.070.065.02.0NaNNaNNaNNaNNaNNaN

5 行×31 列

# Transform the variable of interest in % 
df["callback"] = 100*df["callback"] 

Oreopoulos(2011)收集的第一批实验数据是在 2008 年 4 月至 8 月之间。这是大萧条的“起始期”。

# Restrict data to April and August 2008
df0 = df[(df.fall_data == 0)] 

回电率对工作面试的比例对于加拿大名字(15.84%)要比中国和印度名字(9.23%和 9.53%)高得多。名族是随机的。不可能争辩说加拿大人有更多的教育或经验来证明大约 5%的差异。所有的简历在质量上都是一样的,除了申请人的名字。因此,我们可以得出结论,对移民的歧视是一个真实的现象。

mean = df0.groupby('name_ethnicity').agg([np.mean, np.size])
mean["callback"] 
平均值大小
name_ethnicity
加拿大15.845953.0
中国9.2311430.0
印度9.5341416.0

在 2008 年 4 月至 8 月的样本中,女性名字似乎比男性名字稍微有一些优势,但可以忽略不计,以获得工作面试。这一结果支持了 Oreopoulos(2011)的发现。在他的论文中,女性的系数在大部分回归中都不具有统计学显著性。

prop = pd.crosstab(index= df0['name_ethnicity'], columns=df0['female'], 
            values=df0['callback'], aggfunc='mean')
prop 
女性0.01.0
name_ethnicity
加拿大15.55116.122
中国9.0659.392
印度9.4909.577

Oreopoulos(2011)收集的第三波实验数据是在 2009 年 2 月至 9 月之间进行的。这是大萧条的最糟糕时期。

# Restrict data to February and September 2009
df2 = df[(df.fall_data == 2)] 

加拿大名字的回电率为 14%,而中国名字为 8.96%,英文名和中国姓氏为 7.13%,希腊为 10.11%,印度为 7.9%。

请注意,总体上,这第三波样本中的回电率略低于第一波样本,对于两个样本中的常见种族来说。

mean = df2.groupby('name_ethnicity').agg([np.mean, np.size])
mean["callback"] 
平均大小
名字种族
加拿大14.0801044.0
中国8.9561418.0
中国-加拿大7.128491.0
希腊10.109366.0
印度7.8991937.0
import plotly.express as px

y = mean["callback"].values[:, 0]
x = mean["callback"].index

fig = px.bar(df2, x, y, color = x,
             title="Callback Rate for Interview by Name Ethnicity",
             labels={ "y": "Callback Rate (%)",
                      "x": "Name Ethnicity",                 
                      "color": ""} )

fig.update_layout(font_size = 17)
fig.show() 

在 2009 年 2 月至 9 月的样本中,白人女性的名字回电率为 18.3%,而白人男性的名字回电率为 10.17%。我们没有看到其丨他种族有这么大的差异。事实上,对于希腊名字来说,效果是相反的。希腊男性的名字回电率为 10.71%,而希腊女性的名字回电率为 9.6%。白人男性的名字比中国和印度男性的名字有优势,但幅度不像白人男性与白人女性之间的差异那么大。

prop = pd.crosstab(index= df2['name_ethnicity'], columns=df2['female'], 
            values=df2['callback'], aggfunc='mean')
prop 
女性0.01.0
名字种族
加拿大10.16918.129
中国8.7159.177
中国-加拿大6.4107.782
希腊10.7149.596
印度7.2528.559
import plotly.graph_objects as go

ethnicity = prop.index
male = prop.values[:,0]
female = prop.values[:,1]

fig = go.Figure(data=[
         go.Bar(name='Male', x = ethnicity, y = male),
         go.Bar(name='Female', x = ethnicity, y = female) ])

fig.update_layout(barmode='group', font_size = 17,
      title = "Callback Rate for Interview by Gender",
      yaxis = dict(title='Callback Rate (%)'),
      xaxis = dict(title='Name Ethnicity') )

fig.show() 

有人可能会争辩说,有一些混杂因素导致了观察到的差异。例如,有人可能会说,在现实世界中,女性比男性更受教育和更合格。请记住,这是实验数据,所有简历都是人为构造的,所有相关维度都是由 Oreopoulos(2011)随机化的。控制变量表明,女性和男性彼此相似。

control = ['additional_credential', 'ba_quality',
           'extracurricular_skills', 'language_skills',
           'certificate', 'ma', 'same_exp', 'exp_highquality',
           'skillspeaking', 'skillsocialper', 'skillwriting']

df2.groupby('female').agg([np.mean])[control] 
附加证书学士质量课外技能语言技能证书硕士相同经验经验高质量说话技能社交能力写作技能
平均平均平均平均平均平均平均平均平均平均平均
女性
0.00.0590.6400.5980.3060.0070.170NaN0.19770.75759.65464.286
1.00.0540.6550.5950.3220.0080.185NaN0.16970.52459.77764.216

敏锐的读者可能会争辩说,仅仅表明男性和女性相互之间相似是不够的,以支持我关于白人女性溢价的论点。我必须表明样本中的平均白人女性与平均白人男性相似。对于某些变量,白人女性看起来略微更合格,但对于其丨他变量,略微不太合格。许多数据维度都是随机的,观察到的差异看起来是抽样变异的产物。总的来说,白人男性和女性看起来很相似。我们可以在回归框架中严格控制所有这些因素。我看到种族之间的变化比性别之间的变化更大。种族之间的变化看起来对实验来说过多。因此,我将按种族分解回归分析,并控制几个因素。

df2.groupby(['female', 'name_ethnicity']).agg([np.mean])[control] 
附加证书学士质量课外技能语言技能证书硕士相同经验经验高质量说话技能社交能力写作技能
平均平均平均平均平均平均平均平均平均平均
女性名字种族
0.0加拿大0.0560.7460.6230.3430.0040.209NaN0.19070.42259.07063.546
中国人0.0620.6070.5920.3260.0070.165NaN0.18370.70259.85064.312
中-加0.0680.6280.5380.2820.0130.154NaN0.21471.14159.51363.979
希腊人0.0650.7740.6310.3210.0120.214NaN0.23270.97659.69665.220
印度人0.0550.5860.5960.2760.0060.147NaN0.20070.84659.86264.582
1.0加拿大0.0550.7890.5770.3270.0040.228NaN0.17770.14660.04164.179
中国人0.0550.5900.5960.3000.0110.189NaN0.17970.79959.60764.349
中-加0.0470.6380.6380.3460.0040.113NaN0.17170.00059.50663.233
希腊人0.0450.8080.5660.3080.0100.217NaN0.13671.25860.66264.894
印度人0.0550.6080.5990.3340.0080.172NaN0.16370.50359.65764.257

y r j t y_{rjt} yrjt是一个虚拟变量,如果简历 r r r发送到工作 j j j在时间 t t t收到回电,则为 1;否则为 0。感兴趣的变量是“女性”虚拟变量和与“简历类型”的交互。

有五种“简历类型”:0) 英文名,加拿大教育和经验;1) 外国名字,加拿大教育和经验;2) 外国名字和教育,加拿大经验;3) 外国名字和教育,混合经验;和 4) 外国名字,教育和经验。

以下的线性概率模型是首选的规范:

y r j t = β F e m a l e r j t + γ R e s u m e   T y p e s r j t + δ F e m a l e r j t ⋅ R e s u m e   T y p e s r j t + α X + ϵ r j t y_{rjt}= \beta Female_{rjt}+\gamma Resume\ Types_{rjt}+ \delta Female_{rjt} \cdot Resume\ Types_{rjt} + \alpha X + \epsilon_{rjt} yrjt=βFemalerjt+γResume Typesrjt+δFemalerjtResume Typesrjt+αX+ϵrjt

其中 X X X是控制变量的向量, ϵ r j t \epsilon_{rjt} ϵrjt是通常的误差项。所有回归都呈现了对异方差性的稳健标准误差。

对于表 1、2 和 3,我们呈现了 4 个回归,以比较“加拿大人”与特定种族。逻辑是保持一个同质样本,避免可能混淆结果的种族变化。

表 1 呈现了没有交互作用和控制变量的结果。作为女性的优势范围从增加 3.64%到 5.97%的回电率,相对于男性。白人男性的回电率,基准(类型 0),范围从 11.14%到 12.29%。Oreopoulos(2011)提出的类型 0 的估计值从 15.4%到 16%不等,但他的估计捕捉了英文名字的影响,而没有孤立地考虑性别影响。

我们看到一个模式,类型 1、2、3 和 4 的系数都是负数,并且随着“外国”的程度绝对值增加。一个人在名字、教育和经验方面越“外国”,回电率就越低。但仅仅一个外国名字就足以使回电率比英文名字低 3.38%到 5.11%。总体而言,结果在 1%的显著水平上是统计学显著的。一个例外是类型 1 的系数,用于英文名和中国姓氏的回归(3)。这里描述的模式与 Oreopoulos(2011)报告的主要发现相匹配。

import statsmodels.formula.api as smf

# Sample Restriction based on name ethnicity
Canada = df2.name_ethnicity == "Canada"
Indian = df2[(Canada) | (df2.name_ethnicity == "Indian")]
Chinese = df2[(Canada) | (df2.name_ethnicity == "Chinese")]
Chn_Cdn = df2[(Canada) | (df2.name_ethnicity == "Chn-Cdn")]
Greek = df2[(Canada) | (df2.name_ethnicity == "Greek")]

sample = [Indian, Chinese, Chn_Cdn, Greek]

#  Run the simple model for each ethnicity
# and save the results
model1 = "callback ~ female + C(type)"

result1 = []
for data in sample:
   ols = smf.ols(model1, data).fit(cov_type='HC1')
   result1.append(ols) 
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\tools\_testing.py:19: FutureWarning:

pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead. 
#  Library to print professional publication
# tables in Latex, HTML, etc.
!pip install stargazer 
Requirement already satisfied: stargazer in c:\anaconda\envs\textbook\lib\site-packages (0.0.5) 
WARNING: Error parsing requirements for numpy: [Errno 2] No such file or directory: 'c:\\anaconda\\envs\\textbook\\lib\\site-packages\\numpy-1.19.2.dist-info\\METADATA' 
# Settings for a nice table
from stargazer.stargazer import Stargazer
stargazer = Stargazer(result1)

stargazer.title('Table 1 - Callback Rates by Resume Type')

names = ['Indian', 'Chinese', 'Chn_Cdn', 'Greek']
stargazer.custom_columns(names, [1, 1, 1, 1])

order = ['female', 'Intercept', 'C(type)[T.1.0]',
         'C(type)[T.2.0]', 'C(type)[T.3.0]',
         'C(type)[T.4.0]']     
stargazer.covariate_order(order)

dict1 = {'C(type)[T.1.0]': '1) Foreign Name, Cdn Educ and Exp',
         'C(type)[T.2.0]': '2) Foreign Name and Educ, Cdn exp',
         'C(type)[T.3.0]': '3) Foreign Name and Educ, Mixed Exp',
         'C(type)[T.4.0]': '4) All Foreign (Name, Educ, and Exp)',
              'Intercept': '0) English Name, Cdn Educ and Exp',
                 'female': 'Female'}
stargazer.rename_covariates(dict1)

stargazer 

表 1 - 简历类型的回电率

女性
0) 英文名,加拿大教育和经验
1) 外国名字,加拿大教育和经验
2) 外国名字和教育,加拿大经验
3) 外国名字和教育,混合经验
4) 所有外国人(姓名,教育和经验)
观察
调整后的 R²
残差标准误差
F 统计量
注:

表 2 添加了女性和简历类型的交互项。女性的系数仅捕捉了白人女性的影响,因为外国女性是由女性和类型之间的交互项捕捉的。与白人男性(10.17%的基线)相比,白人女性的回访率增加了 7.96%。

交互项的系数在绝对值上为负,但并非全部统计上显着。这种模式表明,外国女性的回访率与白人女性相比非常低。

有趣的是,类型 1、2、3 和 4 的系数在幅度上较低,并且与表 1 相比在统计上不太显着。这种模式表明,白人男性比印度人和中国姓氏的人有优势,但不包括希腊人或中国人(名字和姓氏)。这两个最后一组的系数在统计上不显着。

model2 = "callback ~ female*C(type)"

result2 = []
for data in sample:
   ols = smf.ols(model2, data).fit(cov_type='HC1')
   result2.append(ols) 
stargazer = Stargazer(result2)

stargazer.title('Table 2 - Callback Rates by Resume Type and Gender')

stargazer.custom_columns(names, [1, 1, 1, 1])

dict2 = {'female:C(type)[T.1.0]':'[Female]x[1]',
         'female:C(type)[T.2.0]':'[Female]x[2]',
         'female:C(type)[T.3.0]':'[Female]x[3]',
         'female:C(type)[T.4.0]':'[Female]x[4]'}

list2 = list(dict2.keys())

dict2.update(dict1)
stargazer.rename_covariates(dict2)

list2 = order + list2
stargazer.covariate_order(list2)

stargazer 

表 2 - 简历类型和性别的回访率

女性
0) 英文名,加拿大教育和经验
1) 外国名字,加拿大教育和经验
2) 外国名字和教育,加拿大经验
3) 外国名字和教育,混合经验
4) 所有外国人(姓名,教育和经验)
[女性]x[1]
[女性]x[2]
[女性]x[3]
[女性]x[4]
观察
调整后的 R²
残差标准误差
F 统计量
注:

表 3 添加了控制变量作为鲁棒性检查。总体结果与表 2 相似。与表 2 相比,白人女性的影响甚至略有增加。白人女性的巨大溢价仍然超过所有其丨他类别。白人女性的溢价优于来自世界排名前 200 的大学的学士学位,大型公司的经验,课外活动,流利的法语和其丨他语言以及加拿大硕士学位的累积影响。

请注意,对于类型 1,只有印度回归的系数在统计上显着。白人男性的名字与中国,中国加拿大和希腊名字没有优势。

control1 = "+ ba_quality + extracurricular_skills + language_skills"
control2 = "+ ma + exp_highquality"
model3 = "callback ~ female*C(type)" + control1 + control2

result3 = []
for data in sample:
   ols = smf.ols(model3, data).fit(cov_type='HC1')
   result3.append(ols) 
stargazer = Stargazer(result3)

stargazer.title('Table 3 - Callback Rates and Robustness Checks')

stargazer.custom_columns(names, [1, 1, 1, 1])

dict3 = {'ba_quality':'Top 200 world ranking university',
         'exp_highquality':'High quality work experience',
         'extracurricular_skills'	:'List extra-curricular activities',
         'language_skills':'Fluent in French and other languages',
         'ma':'Canadian master’s degree'}

list3 = list(dict3.keys())

dict3.update(dict2)
stargazer.rename_covariates(dict3)

list3 = list2 + list3
stargazer.covariate_order(list3)

stargazer 

表 3 - 回访率和鲁棒性检查

女性
0) 英文名字,加拿大教育和经验
1) 外国名字,加拿大教育和经验
2) 外国名字和教育,加拿大经验
3) 外国名字和教育,混合经验
4) 所有外国人(姓名,教育和经验)
[女性]x[1]
[女性]x[2]
[女性]x[3]
[女性]x[4]
世界排名前 200 的大学
高质量的工作经验
列出课外活动
流利的法语和其丨他语言
加拿大硕士学位
观察
调整后的 R²
残差标准误差
F 统计量
注:

练习

1)为什么白人女性的溢价出现在 2009 年 2 月至 9 月的大衰退期间,而在 2008 年 4 月和 8 月之前没有出现?推测。

2)招聘人员可能更愿意与白人女性丨交谈,但不一定会雇佣她们。我如何能确定更高的回电率是否反映在更多的工作提供中。例如,我如何获取数据来检查这种关系?

3)你能从下表推断出什么?你有什么见解要分享吗?

pd.crosstab(index= [df2['name_ethnicity'], df2['female'],
                           df2['name']], columns=df2['type'], 
                         values=df2['callback'], aggfunc='mean') 
类型0.01.02.03.04.0
名字 _ 种族女性名字
加拿大0.0格雷格·约翰逊11.561NaNNaNNaNNaN
约翰·马丁8.235NaNNaNNaNNaN
马修·威尔逊10.638NaNNaNNaNNaN
1.0艾莉森·约翰逊18.675NaNNaNNaNNaN
凯丽·马丁20.455NaNNaNNaNNaN
吉尔·威尔逊15.205NaNNaNNaNNaN
中国人0.0刘东NaN10.8703.39013.1582.381
李蕾NaN14.0629.7568.06511.364
张勇NaN10.2277.4073.5098.333
1.0刘敏NaN8.2355.35711.32115.556
李娜NaN10.12712.6985.5562.703
张秀英NaN11.9276.7809.0917.018
中国-加拿大0.0王艾瑞克NaN9.6773.3908.8890.000
1.0王美琪NaN12.5006.7804.3483.571
希腊0.0鲁卡斯·米诺普洛斯NaN10.714NaNNaNNaN
1.0NicoleMinsopoulosNaN9.596NaNNaNNaN
印度人0.0阿尔琼·库马尔NaN8.6428.3333.1254.762
帕纳夫·辛格NaN1.33315.9427.3172.500
拉胡尔·考尔NaN8.57110.7695.4557.317
萨米尔·夏尔马NaN5.8146.89710.2566.522
1.0MayaKumarNaN14.2866.9443.4485.263
PriyankaKaurNaN6.48114.8153.6365.128
ShreyaSharmaNaN13.1588.7724.6515.128
TaraSinghNaN14.2868.0659.0914.444

4)你能从下表推断出什么?你有什么见解要分享吗?

pd.crosstab(index= df2['occupation_type'],
                   columns=[df2['name_ethnicity'], df2['female']], 
                   values=df2['callback'], aggfunc='mean') 
姓名种族加拿大中国中国-加拿大希腊印度
女性0.01.00.01.00.0
职业类型
会计2.7038.9295.7696.7800.000
行政7.89523.28810.1128.0366.897
土木工程师5.55650.0006.2506.2500.000
文书工作4.4448.1405.1726.0000.000
电子商务0.0000.0009.0910.0000.000
电气工程师6.25028.5717.1438.33314.286
行政助丨理23.07717.6475.26316.00016.667
金融16.66726.3165.00012.1950.000
餐饮服务经理16.66716.6670.0008.33320.000
人力资源工资20.00018.1820.0000.0000.000
保险53.84640.00014.28613.63628.571
市场营销和销丨售12.79122.22212.40911.9669.091
生产0.0000.0000.0004.7620.000
程序员10.25617.39113.46210.5260.000
零售19.04821.62214.54517.64722.727
技术0.00016.6673.2264.0000.000

5)解释表 4 的结果。重点关注固定效应(职业,姓名和城市)的添加。

FE = "+ C(occupation_type) + C(city) + C(name)"
model4 = "callback ~ female*C(type) " + control1 + control2 + FE

result4 = []
for data in sample:
   ols = smf.ols(model4, data).fit(cov_type='HC1')
   result4.append(ols) 
stargazer = Stargazer(result4)

stargazer.title('Table 4 - Callback Rates and Fixed Effects')
stargazer.custom_columns(names, [1, 1, 1, 1])
stargazer.rename_covariates(dict3)
stargazer.covariate_order(list3)

stargazer.add_line('Fixed Effects', ['', '', '', ''])
stargazer.add_line('Occupation', ['Yes', 'Yes', 'Yes', 'Yes'])
stargazer.add_line('Name', ['Yes', 'Yes', 'Yes', 'Yes'])
stargazer.add_line('City', ['Yes', 'Yes', 'Yes', 'Yes'])

stargazer 
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning:

covariance of constraints does not have full rank. The number of constraints is 43, but rank is 1

C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning:

covariance of constraints does not have full rank. The number of constraints is 41, but rank is 39

C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning:

covariance of constraints does not have full rank. The number of constraints is 37, but rank is 35

C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning:

covariance of constraints does not have full rank. The number of constraints is 31, but rank is 29 

表 4 - 回拨率和固定效应

印度
女性
0) 英文姓名,加拿大教育和经验
1) 外国姓名,加拿大教育和经验
2) 外国姓名和教育,加拿大经验
3) 外国姓名和教育,混合经验
4) 所有外国(姓名,教育和经验)
[女性]x[1]
[女性]x[2]
[女性]x[3]
[女性]x[4]
世界排名前 200 的大学
高质量工作经验
列出课外活动
流利的法语和其丨他语言
加拿大硕士学位
固定效应
职业
名字
城市
观察
调整后的 R²
残差标准误差
F 统计量
注:

6)Oreopoulos (2011)收集的第二波实验数据是在 2008 年 9 月至 11 月之间。使用这些数据来调查在加拿大就业市场中是否拥有白人女性姓名会有额外的优势。只生成一张专业出版表,并解释主要结果。

7)对于这个问题,要像 Bertrand & Mullainathan (2004)和 Oreopoulos (2011)一样打破常规思维。一些研究认为身高较高的人赚更多钱并不是因为身高的直接影响,而是通过自尊心的间接影响。提出一个可行的研究设计来测丨试以下因果关系:

a) 身高和薪水。

b) 身高和自尊心。

c) 自尊心和薪水。

参考

Bertrand, Marianne, and Sendhil Mullainathan. (2004). Are Emily and Greg More Employable Than Lakisha and Jamal? A Field Experiment on Labor Market Discrimination. American Economic Review, 94 (4): 991-1013.

Oreopoulos, Philip. (2011). Why Do Skilled Immigrants Struggle in the Labor Market? A Field Experiment with Thirteen Thousand Resumes. American Economic Journal: Economic Policy, 3 (4): 148-71.

七、卖丨淫合法化对犯罪的影响

原文:causal-methods.github.io/Book/7%29_The_Impact_of_Legalizing_Prostitution_on_Crime.html

译者:飞龙

协议:CC BY-NC-SA 4.0

Vitor Kamada

电子邮件:econometrics.methods@gmail.com

最近更新:2020 年 11 月 2 日

在荷兰,有法定的卖丨淫区,荷兰称之为 tippelzones。Bisschop 等人(2017)报告称,tippelzone 的开放可以减少大约 30-40%的性丨虐丨待和强丨奸案件。

让我们打开 Bisschop 等人的数据集。每一行是荷兰的一个城市。同一个城市在 1994 年至 2011 年之间被观察到。

import numpy as np
import pandas as pd
pd.set_option('precision', 3)

# Data from Bisschop et al. (2017)
path = "https://github.com/causal-methods/Data/raw/master/" 
df = pd.read_stata(path + "CBSregist2015.dta")
df.head(5) 
城市年份开放关闭城市 1logpopdensopeningRegmayorCDAmayorCUmayorD66相似盗窃率聚合盗窃率相似盗窃率的自然对数聚合盗窃率的自然对数盗窃率盗窃率的自然对数职务侵犯率职务暴力率职务侵犯率的自然对数职务暴力率的自然对数
0阿姆斯特丹1994-01-010.00.01.08.3810.00.00.00.059.24657.9348.3648.342117.1819.0467.5965.1106.3105.914
1阿姆斯特丹1995-01-010.00.01.08.3790.00.00.00.050.81543.8238.2088.06094.6378.8307.0614.3616.2345.753
2阿姆斯特丹1996-01-011.00.01.08.3730.00.00.00.042.33337.1118.0207.88879.4448.6497.5205.4316.2925.966
3阿姆斯特丹1997-01-011.00.01.08.3690.00.00.00.046.84332.8608.1177.76279.7048.6486.8524.1956.1945.704
4阿姆斯特丹1998-01-011.00.01.08.3730.00.00.00.045.25533.9078.0867.79879.1628.6466.1274.5956.0875.799

5 行×65 列

让我们将城市分成 3 组。大城市和中等城市至少在某一年有 tippelzone,而样本中的其丨他城市没有 tippelzone。

big_cities = ["Amsterdam", "Rotterdam", "Den Haag"]
medium_cities = ["Utrecht", "Nijmegen", "Groningen",
                 "Heerlen", "Eindhoven", "Arnhem"]

# Classify cities
def classify(var):
    if var in big_cities:
        return "Big Cities"
    elif var in medium_cities:
        return "Medium Cities"    
    else:   
        return "No tippelzone"

df['group'] = df["city"].apply(classify) 

以下是每 10,000 名居民的年度犯罪报告。总体而言,大城市的犯罪率更高。唯一的例外是与毒丨品有关的犯罪。

outcome = ['sexassaultpcN', 'rapepcN', 
	'drugspcN', 'maltreatpcN', 'weaponspcN']

df.groupby('group')[outcome].mean().T 
大城市中等城市无 tippelzone
性丨侵犯率0.7750.6260.664
强丨奸率1.0320.8460.691
毒丨品犯罪率14.92115.59912.779
maltreatpcN21.25918.66517.864
weaponspcN5.6354.3854.207

tippelzones 城市的人口和人口密度比没有 tippelzones 的城市更多。平均家庭收入(以 1,000 欧元计)在 3 个组中相似。tippelzones 城市也有受过较高教育的个体。移民比例在大城市中更高(11.4%)。社丨会保险福利(“insurWWAO_pc”)的份额与 3 个组相似。

demographics = ['popul_100', 'pop_dens_100', 'popmale1565_100',
            'inkhh', 'educhpc', 'nondutchpc', 'insurWWAO_pc']

df.groupby('group')[demographics].mean().T 
大城市中等城市无 tippelzone
popul_1005974.8861724.1911131.138
pop_dens_10043.25822.97719.560
popmale1565_1002101.446617.019392.255
inkhh29.05228.98930.502
educhpc0.3000.3170.245
非荷兰人比例0.1140.0590.052
insurWWAO_pc0.0740.0810.078

基丨督丨教联盟在没有 tippelzone 的城市中拥有更多的市长(31%)。值得一提的是,该党反对开放 tippelzone。

political_party = ['mayorSoc', 'mayorLib', 'mayorChr']
df.groupby('group')[political_party].mean().T 
大城市中等城市无 tippelzone
mayorSoc0.4810.5560.410
mayorLib0.2590.3240.278
mayorChr0.2590.1200.312

数据集是平衡的面板数据。有必要按顺序声明指数:分析单位和时间单位。

df['year'] = pd.DatetimeIndex(df['year']).year
df['Dyear'] = pd.Categorical(df.year)

# Set Panel Data
# Set city as the unit of analysis
df25 = df.set_index(['city1', 'year']) 

Y c t Y_{ct} Yct为城市 c c c在年份 t t t的犯罪率。设 D c t D_{ct} Dct = 1,如果城市 c c c在年份 t t t有开放的 tippelzone;否则为 0。让我们估计以下模型:

l n ( Y c t ) = α c + ρ D c t + β X c t + γ t + ϵ c t ln(Y_{ct})=\alpha_c+\rho D_{ct}+\beta X_{ct}+\gamma_t + \epsilon_{ct} ln(Yct)=αc+ρDct+βXct+γt+ϵct

其中 α c \alpha_c αc是城市固定效应, X c t X_{ct} Xct是控制变量向量, γ t \gamma_t γt是年固定效应, ϵ c t \epsilon_{ct} ϵct是通常的误差项。

import statsmodels.formula.api as smf

Ys = ["lnsexassaultN", "lnrapeN", "lndrugsN",
      "lnweaponsN", "lnmaltreatN"]

base = "~ 1 + opening"
fe = "+ C(city) + C(Dyear)"

controls = ['logpopmale1565', 'logpopdens', 'inkhh', 
	'educhpc', 'nondutchpc', 'insurWWAO', 'mayorCDA',
  'mayorCU', 'mayorD66', 'mayorVVD']

Xs = ""
for var in controls:
    Xs = Xs + '+' + var

columns = []
for Y in Ys:
  result = smf.ols(Y + base + fe + Xs, df25).fit(cov_type='cluster',
                cov_kwds={'groups': df25['city']})
  columns.append(result) 
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\tools\_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
  import pandas.util.testing as tm 
#  Library to print professional publication
# tables in Latex, HTML, etc.
!pip install stargazer 
Requirement already satisfied: stargazer in c:\anaconda\envs\textbook\lib\site-packages (0.0.5) 
WARNING: Error parsing requirements for numpy: [Errno 2] No such file or directory: 'c:\\anaconda\\envs\\textbook\\lib\\site-packages\\numpy-1.19.2.dist-info\\METADATA' 

第 1 列表明开放 tippelzone 将性丨虐丨待减少 26%( e − 0.302 − 1 e^{-0.302}-1 e0.3021)。在其丨他列中,tippelzone 的系数在统计上不显著。看起来合法化卖丨淫会减少性丨虐丨待,但不会减少其丨他犯罪,如强丨奸、攻击、非法武器和毒丨品相关犯罪。

# Settings for a nice table
from stargazer.stargazer import Stargazer
stargazer = Stargazer(columns)

stargazer.title('The Impact of Tippelzone on Crime')

names = ['Sex Abuse', 'Rape', 'Drugs', 'Weapons', 'Assault']
stargazer.custom_columns(names, [1, 1, 1, 1, 1])

stargazer.covariate_order(['opening'])

stargazer.add_line('Covariates', ['Yes', 'Yes', 'Yes', 'Yes', 'Yes'])

stargazer.add_line('City Fixed Effects', ['Yes', 'Yes', 'Yes', 'Yes', 'Yes'])
stargazer.add_line('Year Fixed Effects', ['Yes', 'Yes', 'Yes', 'Yes', 'Yes'])

stargazer 
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning: covariance of constraints does not have full rank. The number of constraints is 52, but rank is 24
  'rank is %d' % (J, J_), ValueWarning)
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning: covariance of constraints does not have full rank. The number of constraints is 52, but rank is 24
  'rank is %d' % (J, J_), ValueWarning)
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning: covariance of constraints does not have full rank. The number of constraints is 52, but rank is 24
  'rank is %d' % (J, J_), ValueWarning)
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning: covariance of constraints does not have full rank. The number of constraints is 52, but rank is 24
  'rank is %d' % (J, J_), ValueWarning)
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning: covariance of constraints does not have full rank. The number of constraints is 52, but rank is 24
  'rank is %d' % (J, J_), ValueWarning) 

Tippelzone 对犯罪的影响

开放
协变量
城市固定效应
年固定效应
观察
调整 R²
残差标准误差
F 统计量
注意:
import math
math.exp(-0.302) - 1 
-0.2606619351104681 

练习

1)在论文的引言部分,Bisschop 等人(2017: 29)表示:“我们的研究是第一个提供卖丨淫监丨管与犯罪之间关联的因果证据之一。”在讨论部分,Bisschop 等人(2017:44)表示:“开放 tippelzone,无论是否有许可制度,都与性丨虐丨待和强丨奸的短期减少 30-40%相关,并且结果在不同规范下都是稳健的。”为什么 Bisschop 等人(2017)在引言部分使用“因果”一词,在讨论部分使用“相关”一词?您是否认为 Bisschop 等人(2017)的主要结果是“因果”还是“相关”?请解释。

2)Bisschop 等人(2017: 29)表示:“我们进行了几项实证测丨试,以评估 tippelzone 开放周围的内生犯罪趋势。”他们为什么这样做?这其中的逻辑是什么?是否存在内生犯罪趋势?请解释并具体说明您的答案。

3)Bisschop 等人(2017: 36)表示:“…时间趋势 μ t \mu_t μt是使用年固定效应来建模的。”模拟时间趋势的其丨他方法是什么?编写不同假设下创建时间趋势的代码片段。提示:记住这是面板数据。在横截面数据中有效的代码将在面板数据结构中创建错误的变量。

4)Bisschop 等人(2017: 36)表示:“我们使用差异中的差异规范来研究 tippelzone 存在对各种犯罪的影响。”部署差异中的差异估计器的关键假设是什么?

5)复制表格“Tippelzone 对犯罪的影响”,不包括阿姆斯特丹、鹿特丹和海牙。此外,用以下四个变量替换变量“opening”:

i) “everopenNoReg”: 如果城市 c c c在年份 t t t之前曾开放过没有许可证的 tippelzone,则为 1,否则为 0。

ii) “openingRegP”: 如果城市 c c c在年份 t t t之前开放了 tippelzone 并引入了事后许可证,则为 1,否则为 0。

iii) “openingRegA”: 如果城市 c c c在年份 t t t之前曾开放过带有许可证的 tippelzone,则为 1,否则为 0。

iv) “closing”: 如果城市 c c c在年份 t t t之前关闭 tippelzone,则为 1,否则为 0。

解释结果。

参考

Bisschop, Paul, Stephen Kastoryano, and Bas van der Klaauw. (2017). 街头卖丨淫区和犯罪. 美丨国经济学杂志:经济政策,9 (4): 28-63.

八、Airbnb 的主人是否歧视黑人客人?

原文:causal-methods.github.io/Book/8%29_Do_Hosts_Discriminate_against_Black_Guests_in_Airbnb.html

译者:飞龙

协议:CC BY-NC-SA 4.0

Vitor Kamada

电子邮件:econometrics.methods@gmail.com

最后更新时间:11-1-2020

Edelman et al.(2017)发现,黑人名字听起来比白人名字听起来更不可能被 Airbnb 接受为客人,减少了 16%。这个结果不仅仅是相关性。种族变量是随机的。黑人和白人之间唯一的区别是名字。除此之外,黑人和白人客人是一样的。

让我们打开 Edelman 等人(2017)的数据集。每一行是 2015 年 7 月 Airbnb 的一处物业。样本由巴尔的摩、达拉斯、洛杉矶、圣路丨易斯和华丨盛丨顿特区的所有物业组成。

import numpy as np
import pandas as pd
pd.set_option('precision', 3)

# Data from Edelman et al. (2017)
path = "https://github.com/causal-methods/Data/raw/master/" 
df = pd.read_csv(path + "Airbnb.csv")
df.head(5) 
主人回应回应日期消息数量自动编码纬度经度床类型物业类型取消政策客人数量洛杉矶圣路丨易斯华丨盛丨顿特区总客人原始黑人物业黑人任何黑人过去客人合并九月填充pr 填充
02015-07-19 08:26:172.01.034.081-118.270真正的床房子灵活3.010011.00.00.00.0匹配(3)10.412
1否或不可用2015-07-14 14:13:39NaN1.038.911-77.020NaN房子中等2.0001167.00.00.00.0匹配(3)10.686
2请求更多信息(你能验证吗?有多少…2015-07-20 16:24:082.00.034.005-118.481拉出沙发公寓严格1.010019.00.00.00.0匹配(3)00.331
3我会回复你2015-07-20 06:47:38NaN0.034.092-118.282NaN房子严格8.010041.00.00.00.0匹配(3)00.536
4未发送消息.NaN1.038.830-76.897真正的床房子严格2.000128.00.00.00.0匹配(3)10.555

5 行×104 列

下面的图表显示,黑人客人收到的“是”的回应比白人客人少。有人可能会争辩说 Edelman 等人(2017)的结果是由主人回应的差异驱动的,比如有条件的或非回应。例如,你可以争辩说黑人更有可能有被归类为垃丨圾邮件的假账户。然而,请注意,歧视结果是由“是”和“否”驱动的,而不是由中间回应驱动的。

# Data for bar chart
count = pd.crosstab(df["graph_bins"], df["guest_black"])

import plotly.graph_objects as go

node = ['Conditional No', 'Conditional Yes', 'No',
        'No Response', 'Yes']
fig = go.Figure(data=[
    go.Bar(name='Guest is white', x=node, y=count[0]),
    go.Bar(name='Guest is African American', x=node, y=count[1]) ])

fig.update_layout(barmode='group',
  title_text = 'Host Responses by Race',
  font=dict(size=18) )

fig.show() 

让我们复制 Edelman 等人(2017)的主要结果。

import statsmodels.api as sm

df['const'] = 1 

# Column 1
#  The default missing ='drop' of statsmodels doesn't apply
# to the cluster variable. Therefore, it is necessary to drop
# the missing values like below to get the clustered standard 
# errors.
df1 = df.dropna(subset=['yes', 'guest_black', 'name_by_city'])
reg1 = sm.OLS(df1['yes'], df1[['const', 'guest_black']])
res1 = reg1.fit(cov_type='cluster',
                cov_kwds={'groups': df1['name_by_city']})

# Column 2
vars2 = ['yes', 'guest_black', 'name_by_city', 
        'host_race_black', 'host_gender_M']
df2 = df.dropna(subset = vars2)
reg2 = sm.OLS(df2['yes'], df2[['const', 'guest_black',
                    'host_race_black', 'host_gender_M']])
res2 = reg2.fit(cov_type='cluster',
                cov_kwds={'groups': df2['name_by_city']})

# Column 3
vars3 = ['yes', 'guest_black', 'name_by_city', 
         'host_race_black', 'host_gender_M',
         'multiple_listings', 'shared_property',
         'ten_reviews', 'log_price']
df3 = df.dropna(subset = vars3)
reg3 = sm.OLS(df3['yes'], df3[['const', 'guest_black',
                    'host_race_black', 'host_gender_M',
                    'multiple_listings', 'shared_property',
                    'ten_reviews', 'log_price']])
res3 = reg3.fit(cov_type='cluster',
                cov_kwds={'groups': df3['name_by_city']})

columns =[res1, res2, res3] 
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\tools\_testing.py:19: FutureWarning:

pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead. 
#  Library to print professional publication
# tables in Latex, HTML, etc.
!pip install stargazer 
Requirement already satisfied: stargazer in c:\anaconda\envs\textbook\lib\site-packages (0.0.5) 
WARNING: Error parsing requirements for numpy: [Errno 2] No such file or directory: 'c:\\anaconda\\envs\\textbook\\lib\\site-packages\\numpy-1.19.2.dist-info\\METADATA' 

在第一列中,听起来像白人的名字被接受的概率为 49%;而听起来像黑人的名字被接受的概率大约为 41%。因此,黑人名字带来了 8%的惩罚。这个结果在第 2 列和第 3 列的一组控制变量中非常稳健。

# Settings for a nice table
from stargazer.stargazer import Stargazer
stargazer = Stargazer(columns)
stargazer.title('The Impact of Race on Likelihood of Acceptance')
stargazer 

种族对接受可能性的影响

常数
黑人客人
主人性别 M
主人种族黑人
对数价丨格
多个列表
共享物业
十次评论
观察
调整后的 R²
残差标准误差
F 统计量
注:

下表显示了有关主人和房产的摘要统计信息。在实验中,控制变量的平均值与分组实验和对照组的平均值相同。

control = ['host_race_white', 'host_race_black', 'host_gender_F', 
	'host_gender_M', 'price', 'bedrooms', 'bathrooms', 'number_of_reviews', 
	'multiple_listings', 'any_black', 'tract_listings', 'black_proportion']

df.describe()[control].T 
计数平均值标准差最小值25%50%75%最大值
host_race_white6392.00.6340.4820.00.001.001.0001.000
host_race_black6392.00.0780.2690.00.000.000.0001.000
host_gender_F6392.00.3760.4850.00.000.001.0001.000
host_gender_M6392.00.2980.4570.00.000.001.0001.000
价丨格6302.0181.1081280.22810.075.00109.00175.000100000.000
卧室6242.03.1772.2651.02.002.004.00016.000
浴室6285.03.1692.2641.02.002.004.00016.000
评论数量6390.030.86972.5050.02.009.0029.0001208.000
多个列表6392.00.3260.4690.00.000.001.0001.000
任何黑人6390.00.2820.4500.00.000.001.0001.000
地域列表6392.09.5149.2771.02.006.0014.00053.000
黑人比例6378.00.1400.2030.00.030.050.1420.984

平衡处理测丨试(t 检验)显示黑人和白人客人是相同的。

result = []

for var in control:
    # Do the T-test and save the p-value
    pvalue = sm.OLS(df[var], df[['const', 'guest_black']],
               missing = 'drop').fit().pvalues[1]
    result.append(pvalue) 
ttest = df.groupby('guest_black').agg([np.mean])[control].T
ttest['p-value'] = result
ttest 
黑人客人0.01.0p 值
host_race_white平均值0.6430.6260.154
host_race_black平均值0.0780.0780.972
host_gender_F平均值0.3810.3720.439
host_gender_M平均值0.2980.2990.896
价丨格平均值166.429195.8150.362
卧室平均值3.1783.1760.962
浴室平均值3.1723.1670.927
评论数量平均值30.70931.0300.860
多个列表平均值0.3210.3300.451
任何黑人平均值0.2870.2770.382
地域列表平均值9.4949.5380.848
黑人比例平均值0.1410.1400.919

练习

1)据我所知,关于种族歧视的文献中最重要的三篇实证论文是 Bertrand & Mullainathan (2004), Oreopoulos (2011), 和 Edelman et al. (2017)。这三篇论文都使用了实地实验来捕捉因果关系并排除混杂因素。在互联网上搜索并返回一份关于种族歧视的实验论文的参考列表。

2)告诉我一个你热衷的话题。返回一个关于你的话题的实验论文的参考列表。

3)有人认为特定的名字驱动了 Edelman 等人(2017)的结果。在下面的表格中,你可以看到代表黑人和白人的名字并不多。如何反驳这个批评?你可以做什么来证明结果不是由特定的名字驱动的?

female = df['guest_gender']=='female'
df[female].groupby(['guest_race', 'guest_first_name'])['yes'].mean() 
guest_race  guest_first_name
black       Lakisha             0.433
            Latonya             0.370
            Latoya              0.442
            Tamika              0.482
            Tanisha             0.413
white       Allison             0.500
            Anne                0.567
            Kristen             0.486
            Laurie              0.508
            Meredith            0.498
Name: yes, dtype: float64 
male = df['guest_gender']=='male'
df[male].groupby(['guest_race', 'guest_first_name'])['yes'].mean() 
guest_race  guest_first_name
black       Darnell             0.412
            Jamal               0.354
            Jermaine            0.379
            Kareem              0.436
            Leroy               0.371
            Rasheed             0.409
            Tyrone              0.377
white       Brad                0.419
            Brent               0.494
            Brett               0.466
            Greg                0.467
            Jay                 0.581
            Todd                0.448
Name: yes, dtype: float64 

4)根据下表,是否有任何潜在的研究问题可以探讨?请证明。

pd.crosstab(index= [df['host_gender_F'], df['host_race']],
            columns=[df['guest_gender'], df['guest_race']], 
            values=df['yes'], aggfunc='mean') 
客人性别女性男性
客人种族黑人白人
host_gender_Fhost_race
0UU0.4000.542
亚裔0.3190.3780.474
黑人0.4440.6430.419
西班牙裔0.4640.5710.375
0.5680.7270.408
不明确0.4440.5000.444
不明确的三票0.4760.3920.368
白人0.3830.5140.386
1UU0.4440.250
亚裔0.4290.6070.436
黑人0.6030.5370.397
西班牙裔0.3910.6670.292
不明确0.6000.5560.125
不明确的三票0.3870.5830.312
白人0.4500.4940.370

5)在 Edelman 等人(2017 年)中,变量“name_by_city”被用来对标准误差进行聚类。变量“name_by_city”是如何基于其丨他变量创建的?展示代码。

6)使用 Edelman 等人(2017 年)的数据来测丨试同族偏好假设,即主人可能更喜欢相同种族的客人。使用 Stargazer 库生成一个漂亮的表格。解释结果。

7)总的来说,人们知道社丨会经济地位与种族有关。Fryer&Levitt(2004 年)表明,独特的非洲裔美丨国人名字与较低的社丨会经济地位相关。Edelman 等人(2017 年:17)明确表示:“我们的发现无法确定歧视是基于种族,社丨会经济地位,还是这两者的结合。”提出一个实验设计来分离种族和社丨会经济地位的影响。解释您的假设并详细描述程序。

参考

Bertrand,Marianne 和 Sendhil Mullainathan。 (2004)。艾米丽和格雷格比拉基莎和贾迈尔更受雇用吗?劳动市场歧视的实地实验。《美丨国经济评论》,94(4):991-1013。

Edelman,Benjamin,Michael Luca 和 Dan Svirsky。 (2017)。共享经济中的种族歧视:来自实地实验的证据。《美丨国经济学杂志:应用经济学》,9(2):1-22。

Fryer,Roland G. Jr.和 Steven D. Levitt。 (2004)。Distinctively Black Names 的原因和后果。《经济学季刊》,119(3):767–805。

Oreopoulos,Philip。 (2011)。为什么技术移民在劳动市场上挣扎?一项涉及一万三千份简历的实地实验。《美丨国经济学杂志:经济政策》,3(4):148-71。

九、股票市场如何缓解以巴冲突?

原文:causal-methods.github.io/Book/9%29_How_Can_Stock_Market_Mitigate_the_Israeli_Palestinian_Conflict.html

译者:飞龙

协议:CC BY-NC-SA 4.0

Vitor Kamada

电子邮件:econometrics.methods@gmail.com

最近更新:11-5-2020

“商业是最具破丨坏性偏见的良药。”(孟德斯鸠,1748 年:第 II 卷,第一章)

Jha & Shayo(2019)随机将 1345 名犹太以色列选民分为金融资产治疗组和对照组。他们报告称,接触股票市场会增加 4-6%的可能性,投票支持主张和平解决冲突的政党。让我们打开 Jha & Shayo(2019)的数据集。每一行都是以色列公民。

import numpy as np
import pandas as pd
pd.set_option('precision', 3)

# Data from Jha & Shayo (2019)
path = "https://github.com/causal-methods/Data/raw/master/" 
df = pd.read_stata(path + "replicationdata.dta")
df.head(5) 
C:\Anaconda\envs\textbook\lib\site-packages\pandas\io\stata.py:1433: UnicodeWarning: 
One or more strings in the dta file could not be decoded using utf-8, and
so the fallback encoding of latin-1 is being used.  This can happen when a file
has been incorrectly encoded by Stata or some other software. You should verify
the string values returned are correct.
  warnings.warn(msg, UnicodeWarning) 
统计tradestock6愿意承担 1 到 10 的风险用户 ID男性关系关系 IDnafa教育sestradetot_m4pricechange_m4bought_bm4sold_bm4active_bm4资产类型上周过去 3 年下周facts_0_m4
0完成NaN360814.00.0犹太教世俗耶路撒冷硕士平均以下3.0-0.6730.00.00.01.00.00.01.02.0
1完成1.0260824.00.0犹太教世俗特拉维夫文学士平均以上3.05.3232.00.02.01.01.01.00.03.0
2完成0.0361067.01.0犹太教世俗中心博士平均以上3.00.0002.01.03.00.00.00.00.00.0
3完成NaN461095.01.0犹太教世俗海法文学士学生平均以下3.05.3233.02.03.00.00.01.00.01.0
4完成0.0461198.01.0犹太教世俗北部硕士平均以下3.00.0000.00.00.01.00.00.00.01.0

5 行×526 列

# Drop missing values
df = df.dropna(subset=['left_s3']) 

图 1 显示,2013 年选举中,对照组和治疗组的投票情况相似。但在 2015 年,左翼党派在对照组中获得了 24.8%的选票,而在治疗组中获得了 30.9%。相反,右翼党派在对照组中获得了 35.8%的选票,而在治疗组中获得了 31.2%。根据 Jha & Shayo(2019)的说法,右翼和左翼党派在经济政策方面是相似的。主要区别在于左翼党派支持和平进程,而右翼党派认为任何为和平做出的让步都会对以色列国家构成风险。

# Data: Vote Share by year
v2013 = df.groupby('assettreat')['left_2013', 'right_2013'].mean().T
v2015 = df.groupby('assettreat')['left_s3', 'right_s3'].mean().T
prop = v2013.append(v2015)

# Plot Bar Chart
import plotly.graph_objects as go
node = ['Left 2013', 'Right 2013', 'Left 2015', 'Right 2015']

fig = go.Figure(data=[             
    go.Bar(name='Control', x=node, y = prop[0]),
    go.Bar(name='Treatment', x=node, y = prop[1]) ])

fig.update_layout(barmode='group',
  title_text = 'Graphic 1 - Elections: 2013 vs 2015 ',
  font=dict(size=18) )

fig.update_yaxes(title_text = "Vote Share")

fig.show() 
C:\Anaconda\envs\textbook\lib\site-packages\ipykernel_launcher.py:2: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.

C:\Anaconda\envs\textbook\lib\site-packages\ipykernel_launcher.py:3: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
  This is separate from the ipykernel package so we can avoid doing imports until 

下表显示,治疗组与对照组相似。例外情况是年龄和愿意承担风险。治疗组的以色列人比对照组年轻(39.3 岁对 41.5 岁)。治疗组在愿意承担风险方面也更偏好,评估指数从 1 到 10 变化(4.7 对 4.3)。

我们根据 OLS 回归和分层固定效应计算 p 值。

control = ['right_2013', 'left_2013', 'p_index_s1', 'e_index_init',
    'tradestock6all', 'male', 'age', 'postsecondary', 'BA_student',
	  'college_grad', 'married', 'r_sec',  'r_trad', 'r_relig', 'r_ultra', 
		'g_jerusalem', 'g_north', 'g_haifa', 'g_center', 'g_telaviv', 'g_south',
    'g_wb', 'faminc', 'willingrisk1to10', 'patient', 'plitscore'] 
import statsmodels.formula.api as smf

result = []
for var in control:
    # OLS with 104 randomization strata fixed effects
    reg = smf.ols(var + "~ 1 + assettreat + C(block13)", df)
    # 104 is the last variable: the coefficient of assettreat
    pvalue = reg.fit().pvalues[104]
    result.append(pvalue) 
C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\tools\_testing.py:19: FutureWarning:

pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead. 
table = df.groupby('assettreat')[control].mean().T  
table['p-value'] = result
table 
资产治疗0.01.0p 值
right_20130.2450.2410.964
left_20130.1260.1370.213
p_index_s10.0040.0510.399
e_index_init-0.0050.0070.752
tradestock6all0.3680.3550.290
男性0.5130.5210.470
年龄41.53039.2890.011
高中后教育0.2320.2300.953
文学士学生0.1520.1480.834
大学毕业0.4270.4260.860
已婚0.6290.5980.295
r_sec0.6360.6270.582
r_trad0.1720.1640.823
r_relig0.1190.1240.780
r_ultra0.0730.0850.222
g_jerusalem0.0960.0910.800
g_north0.0890.0970.595
g_haifa0.1230.1420.290
g_center0.2980.2900.766
g_telaviv0.2120.1940.276
g_south0.1160.1040.596
g_wb0.0660.0810.341
家庭收入11162.16210996.9700.511
愿意承担风险 1 到 104.3444.7160.009
患者0.6420.6570.645
plitscore69.72670.6640.550
#  Library to print professional publication
# tables in Latex, HTML, etc.
!pip install stargazer 
Requirement already satisfied: stargazer in c:\anaconda\envs\textbook\lib\site-packages (0.0.5) 
WARNING: Error parsing requirements for numpy: [Errno 2] No such file or directory: 'c:\\anaconda\\envs\\textbook\\lib\\site-packages\\numpy-1.19.2.dist-info\\METADATA' 

表 1 的第 1 列显示了意向治疗(ITT)的估计值为 6.1%。值得一提的是,这种类型的实验很少有完全的遵从。通常,在需要随时间跟踪个体时,控制组和治疗组都会有一定的流失率。

第 2 列显示 ITT 效应对控制变量和分层固定效应的鲁棒性。

第 3 列使用变量“vote_wgt”作为权重呈现了加权最小二乘法(WLS)。Jha & Shayo(2019)提取了一个随机样本,其中非正统中心选民被过度抽样。逻辑是增加对最有趣的群体:摇摆选民的精度。使用权重可以在不过度抽样的情况下重现结果。

第 4 列显示结果是由接受以色列股票(“isrstock”)和投资券(“cash”)的治疗组个体驱动的。要小心得出巴勒斯坦股票没有影响的结论。在实验期间,以色列股票价丨格上涨,但巴勒斯坦股票下跌。

ITT1 = smf.ols("left_s3 ~ 1 + assettreat",
                 df).fit()

Xs = ['right_2013', 'left_2013', 'male', 'age', 'age2',
      'postsecondary', 'BA_student', 'college_grad',
      'married', 'tradestock6all', 'r_trad', 'r_relig',
      'r_ultra', 'g_jerusalem', 'g_north', 'g_haifa',
      'g_telaviv', 'g_south', 'g_wb', 'C(newses)',
      'willingrisk1to10', 'patient', 'plitscore']

controls = ""
for X in Xs:
    controls = controls + '+' + X      

ITT2 = smf.ols("left_s3 ~ 1 + assettreat" + controls +
                 "+C(block13)", df).fit()

WLS = smf.wls("left_s3 ~ 1 + assettreat" + controls +
       "+C(block13)", df, weights=df['vote_wgt']).fit()

treatments = "+ isrstock + palstock + cash"    
WLS2 = smf.wls("left_s3 ~ 1" + treatments + controls +
       "+C(block13)", df, weights=df['vote_wgt']).fit() 
# Settings for a nice table
from stargazer.stargazer import Stargazer
stargazer = Stargazer([ITT1, ITT2, WLS, WLS2])

stargazer.title('Table 1 - Intent to Treat Estimates of Stock'
   + ' Exposure on Voting for a Left Party')

names = ['ITT', 'ITT', 'WLS', 'WLS']
stargazer.custom_columns(names, [1, 1, 1, 1])

stargazer.covariate_order(['assettreat', 'isrstock',
                           'palstock', 'cash'])

stargazer.add_line('Strata Fixed Effects', ['No', 'Yes',
                                            'Yes', 'Yes'])
stargazer.add_line('Covariates', ['No', 'Yes', 'Yes', 'Yes'])

stargazer 

表 1 - 对左翼党投票的意向治疗估计股票暴露

资产处理
isrstock
palstock
现金
分层固定效应
协变量
观察
调整后的 R²
残差标准误差
F 统计量
注:

表 2 的第 1 列呈现了第一阶段回归。ITT(“资产处理”)是符合分配(“资产 _comp”)的工具变量(IV)。变量“资产 _comp”表示谁实际完成了实验。在控制了几个协变量和分层固定效应之后,ITT 的系数在统计上是显著的。变量“资产处理”是一个完美的 IV。这个变量是随机的。因此,它与误差项不相关。

第 2 列显示了控制函数方法(CF)的结果。对待处理的治疗效应(TOT)估计为 7.3%。接受治疗的个体投票给左翼党的概率增加了 7.3%。在这个框架中,CF 等同于 2SLS。在 CF 中,我们使用第一阶段的残差( u ^ \hat{u} u^)来控制第二阶段的内生性。注意残差在统计上是显著的。因此,需要进行修正。我们可以得出结论,表 1 低估了金融资产暴露对左翼党投票的影响。

# Fist Stage
FS = smf.ols("asset_comp ~ 1 + assettreat" + controls +
                 "+C(block13)", df).fit()

# Control Function Approach
df['resid'] = FS.resid
CF = smf.ols("left_s3 ~ 1 + asset_comp + resid" + controls +
                 "+C(block13)", df).fit() 
# Settings for a nice table
stargazer = Stargazer([FS, CF])

stargazer.title('Table 2 - Impact of Stock Exposure'
 ' on Voting for a Left Party')

names = ['First Stage', 'Control Function']
stargazer.custom_columns(names, [1, 1])

stargazer.covariate_order(['assettreat', 'asset_comp', 'resid'])

stargazer.add_line('Strata Fixed Effects', ['Yes', 'Yes'])
stargazer.add_line('Covariates', ['Yes', 'Yes'])

stargazer 

表 2 - 股票暴露对左翼党投票的影响

资产处理
资产 _comp
残差
分层固定效应
协变量
观察
调整后的 R²
残差标准误差
F 统计量
注:

练习

1)Jha&Shayo(2019)的样本由以色列选民组成。推测在巴勒斯坦选民的情况下,结果是否会在质量上相同。证明你的理由。

2)从 Jha&Shayo(2019)出发,有什么有前途的研究问题?

3)什么是社丨会期望偏差?描述 Jha&Shayo(2019)为减轻社丨会期望偏差所做的工作。

4)使用 2SLS 而不是控制函数方法复制表 2 的结果。不要使用库“linearmodels”。使用库“statsmodels”手动进行 2SLS。

5)暴露于巴勒斯坦股票是否会降低投票右翼政党的概率?运行一些回归来证明你的立场。

参考

Jha,S.和 Shayo,M.(2019)。估价和平:金融市场暴露对选票和政丨治态度的影响。计量经济学,87:1561-1588。

蒙特斯基耶,C.(1748)。法律精神。伦敦:T. Evans,1777 年,4 卷。第 2 卷。在线自由图书馆。

参考书目

原文:causal-methods.github.io/Book/Bibliography.html

译者:飞龙

协议:CC BY-NC-SA 4.0

作者:Vitor Kamada

电子邮件:econometrics.methods@gmail.com

最后更新日期 11-6-2020

书中使用的论文和数据Python 因果推断

巴斯滕,克里斯托夫和弗兰克贝茨(2013)。超越职业道德:宗丨教,个人和政丨治偏好。《美丨国经济学杂志:经济政策》,5(3):67-91。在线附录finaldata.dta

贝克尔,萨沙 O.,和 Ludger Woessmann。 (2009)。韦伯错了吗?新教经济史的人力资本理论。《季度经济学杂志》124(2):531-96。

Bertrand,Marianne 和 Sendhil Mullainathan。 (2004)。艾米丽和格雷格比拉基莎和贾迈尔更受雇用吗?。劳动力市场歧视的实地实验。《美丨国经济评论》,94(4):991-1013。lakisha_aer.dta

Bisschop,Paul,Stephen Kastoryano 和 Bas van der Klaauw。 (2017)。街头卖丨淫区和犯罪。《美丨国经济学杂志:经济政策》,9(4):28-63。CBSregist2015.dta

Edelman,Benjamin,Michael Luca 和 Dan Svirsky。 (2017)。共享经济中的种族歧视:来自实地实验的证据。《美丨国经济学杂志:应用经济学》,9(2):1-22。Airbnb.csv

Fey,Mark,Richard D. McKelvey 和 Thomas R. Palfrey。 (1996)。恒定总和蜈蚣游戏的实验研究。《国际博弈理论杂志》,25(3):269-87。

弗莱尔,罗兰 G.,朱尼尔和史蒂文 D.莱维特。 (2004)。独特的黑人名字的原因和后果。《季度经济学杂志》119(3):767-805。

Imbens,G.,& Kalyanaraman,K.(2012)。回归断点估计器的最佳带宽选择。《经济研究评论》,79(3),933-959。

Jha,S.和 Shayo,M.(2019)。和平的价值:金融市场暴露对选票和政丨治态度的影响。计量经济学,87:1561-1588。replicationdata.dta

凯恩斯,约翰梅纳德。 (1936)。就业,利息和货币的一般理论。美丨国哈考特,布雷斯和公司出版,并由美丨国纽约波利图形公司印刷。

梅耶森,埃里克。 (2014)。伊丨斯丨兰统治与穷人和虔诚者的赋权。计量经济学,82(1),229-269。regdata0.dta

Montesquieu,C.(1748)。法的精神。伦敦:T. Evans,1777 年,4 卷。第 2 卷。在线自由图书馆。

Oreopoulos, Philip. (2011). 为什么技术移民在劳动市场上遇到困难?一项涉及一万三千份简历的实地实验. 美丨国经济学杂志:经济政策, 3 (4): 148-71. oreopoulos.dta

Palacios-Huerta, Ignacio, and Oscar Volij. (2009). 野外蜈蚣. 美丨国经济评论, 99 (4): 1619-35. Chess.xls

Richardson, Gary, and William Troost. (2009). 货币干预缓解了大萧条期间的银行恐慌:来自联邦储备区域边界的准实验证据,1929-1933. 政丨治经济学杂志 117 (6): 1031-73。

Weber, Max. (1930). 《新教伦理与资本主丨义精神》。纽约:斯克里布纳,(原始出版于 1905 年)。

Ziebarth, Nicolas L. (2013). 从密西西比州大萧条期间的自然实验中识别银行倒闭的影响. 美丨国经济学杂志:宏观经济学, 5 (1): 81-101. MS_data_all_years_regs.dta


版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐