0


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)的数据集。每一行是发送给多个多伦多和蒙特利尔地区职业的简历。

  1. import numpy as np
  2. import pandas as pd
  3. pd.set_option('precision',3)# Data from Oreopoulos (2011)
  4. path ="https://github.com/causal-methods/Data/raw/master/"
  5. df = pd.read_stata(path +"oreopoulos.dta")
  6. df.head(5)

公司 ID职业类型name_ethnicity额外证书名字语言技能资格认证参考法律列出的资格认证…说话技能社交能力写作能力秋季数据中国人印度人英国人巴基斯坦人中加人相同经验0-3行政加拿大0.0JillWilson0.00.00.00.00.0…70.050.067.02.0NaNNaNNaNNaNNaNNaN1-3行政印度0.0PanavSingh0.00.00.00.00.0…70.050.067.02.0NaNNaNNaNNaNNaNNaN2-3行政印度0.0RahulKaur0.00.00.01.01.0…70.050.067.02.0NaNNaNNaNNaNNaNNaN3-3行政中国0.0雷丽0.01.01.00.01.0…70.050.067.02.0NaNNaNNaNNaNNaNNaN4-4行政印度0.0MayaKumar1.00.00.00.00.0…80.070.065.02.0NaNNaNNaNNaNNaNNaN
5 行×31 列

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

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

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

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

  1. mean = df0.groupby('name_ethnicity').agg([np.mean, np.size])
  2. mean["callback"]

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

  1. prop = pd.crosstab(index= df0['name_ethnicity'], columns=df0['female'],
  2. values=df0['callback'], aggfunc='mean')
  3. prop

女性0.01.0name_ethnicity———加拿大15.55116.122中国9.0659.392印度9.4909.577
Oreopoulos(2011)收集的第三波实验数据是在 2009 年 2 月至 9 月之间进行的。这是大萧条的最糟糕时期。

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

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

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

  1. mean = df2.groupby('name_ethnicity').agg([np.mean, np.size])
  2. mean["callback"]

平均大小名字种族———加拿大14.0801044.0中国8.9561418.0中国-加拿大7.128491.0希腊10.109366.0印度7.8991937.0

  1. import plotly.express as px
  2. y = mean["callback"].values[:,0]
  3. x = mean["callback"].index
  4. fig = px.bar(df2, x, y, color = x,
  5. title="Callback Rate for Interview by Name Ethnicity",
  6. labels={"y":"Callback Rate (%)","x":"Name Ethnicity","color":""})
  7. fig.update_layout(font_size =17)
  8. fig.show()

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

  1. prop = pd.crosstab(index= df2['name_ethnicity'], columns=df2['female'],
  2. values=df2['callback'], aggfunc='mean')
  3. prop

女性0.01.0名字种族———加拿大10.16918.129中国8.7159.177中国-加拿大6.4107.782希腊10.7149.596印度7.2528.559

  1. import plotly.graph_objects as go
  2. ethnicity = prop.index
  3. male = prop.values[:,0]
  4. female = prop.values[:,1]
  5. fig = go.Figure(data=[
  6. go.Bar(name='Male', x = ethnicity, y = male),
  7. go.Bar(name='Female', x = ethnicity, y = female)])
  8. fig.update_layout(barmode='group', font_size =17,
  9. title ="Callback Rate for Interview by Gender",
  10. yaxis =dict(title='Callback Rate (%)'),
  11. xaxis =dict(title='Name Ethnicity'))
  12. fig.show()

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

  1. control =['additional_credential','ba_quality','extracurricular_skills','language_skills','certificate','ma','same_exp','exp_highquality','skillspeaking','skillsocialper','skillwriting']
  2. df2.groupby('female').agg([np.mean])[control]

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

  1. 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.5821.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

  1. y
  2. r
  3. j
  4. t
  5. y_{rjt}
  6. yrjt​是一个虚拟变量,如果简历
  7. r
  8. r
  9. r发送到工作
  10. j
  11. j
  12. j在时间
  13. t
  14. t
  15. t收到回电,则为 1;否则为 0。感兴趣的变量是“女性”虚拟变量和与“简历类型”的交互。

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

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

  1. y
  2. r
  3. j
  4. t
  5. =
  6. β
  7. F
  8. e
  9. m
  10. a
  11. l
  12. e
  13. r
  14. j
  15. t
  16. +
  17. γ
  18. R
  19. e
  20. s
  21. u
  22. m
  23. e
  24. T
  25. y
  26. p
  27. e
  28. s
  29. r
  30. j
  31. t
  32. +
  33. δ
  34. F
  35. e
  36. m
  37. a
  38. l
  39. e
  40. r
  41. j
  42. t
  43. R
  44. e
  45. s
  46. u
  47. m
  48. e
  49. T
  50. y
  51. p
  52. e
  53. s
  54. r
  55. j
  56. t
  57. +
  58. α
  59. X
  60. +
  61. ϵ
  62. r
  63. j
  64. t
  65. y_{rjt}= \beta Female_{rjt}+\gamma Resume\ Types_{rjt}+ \delta Female_{rjt} \cdot Resume\ Types_{rjt} + \alpha X + \epsilon_{rjt}
  66. yrjt​=βFemalerjt​+γResume Typesrjt​+δFemalerjt​⋅Resume Typesrjt​+αXrjt

其中

  1. X
  2. X
  3. X是控制变量的向量,
  4. ϵ
  5. r
  6. j
  7. t
  8. \epsilon_{rjt}
  9. ϵ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)报告的主要发现相匹配。

  1. import statsmodels.formula.api as smf
  2. # Sample Restriction based on name ethnicity
  3. Canada = df2.name_ethnicity =="Canada"
  4. Indian = df2[(Canada)|(df2.name_ethnicity =="Indian")]
  5. Chinese = df2[(Canada)|(df2.name_ethnicity =="Chinese")]
  6. Chn_Cdn = df2[(Canada)|(df2.name_ethnicity =="Chn-Cdn")]
  7. Greek = df2[(Canada)|(df2.name_ethnicity =="Greek")]
  8. sample =[Indian, Chinese, Chn_Cdn, Greek]# Run the simple model for each ethnicity# and save the results
  9. model1 ="callback ~ female + C(type)"
  10. result1 =[]for data in sample:
  11. ols = smf.ols(model1, data).fit(cov_type='HC1')
  12. result1.append(ols)
  1. C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\tools\_testing.py:19: FutureWarning:
  2. pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
  1. # Library to print professional publication# tables in Latex, HTML, etc.
  2. !pip install stargazer
  1. Requirement already satisfied: stargazer in c:\anaconda\envs\textbook\lib\site-packages (0.0.5)
  1. WARNING: Error parsing requirements for numpy:[Errno 2] No such fileor directory:'c:\\anaconda\\envs\\textbook\\lib\\site-packages\\numpy-1.19.2.dist-info\\METADATA'
  1. # Settings for a nice tablefrom stargazer.stargazer import Stargazer
  2. stargazer = Stargazer(result1)
  3. stargazer.title('Table 1 - Callback Rates by Resume Type')
  4. names =['Indian','Chinese','Chn_Cdn','Greek']
  5. stargazer.custom_columns(names,[1,1,1,1])
  6. order =['female','Intercept','C(type)[T.1.0]','C(type)[T.2.0]','C(type)[T.3.0]','C(type)[T.4.0]']
  7. stargazer.covariate_order(order)
  8. 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'}
  9. stargazer.rename_covariates(dict1)
  10. stargazer

表 1 - 简历类型的回电率
女性0) 英文名,加拿大教育和经验1) 外国名字,加拿大教育和经验2) 外国名字和教育,加拿大经验3) 外国名字和教育,混合经验4) 所有外国人(姓名,教育和经验)观察R²调整后的 R²残差标准误差F 统计量注:
表 2 添加了女性和简历类型的交互项。女性的系数仅捕捉了白人女性的影响,因为外国女性是由女性和类型之间的交互项捕捉的。与白人男性(10.17%的基线)相比,白人女性的回访率增加了 7.96%。

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

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

  1. model2 ="callback ~ female*C(type)"
  2. result2 =[]for data in sample:
  3. ols = smf.ols(model2, data).fit(cov_type='HC1')
  4. result2.append(ols)
  1. stargazer = Stargazer(result2)
  2. stargazer.title('Table 2 - Callback Rates by Resume Type and Gender')
  3. stargazer.custom_columns(names,[1,1,1,1])
  4. 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]'}
  5. list2 =list(dict2.keys())
  6. dict2.update(dict1)
  7. stargazer.rename_covariates(dict2)
  8. list2 = order + list2
  9. stargazer.covariate_order(list2)
  10. stargazer

表 2 - 简历类型和性别的回访率
女性0) 英文名,加拿大教育和经验1) 外国名字,加拿大教育和经验2) 外国名字和教育,加拿大经验3) 外国名字和教育,混合经验4) 所有外国人(姓名,教育和经验)[女性]x[1][女性]x[2][女性]x[3][女性]x[4]观察R²调整后的 R²残差标准误差F 统计量注:
表 3 添加了控制变量作为鲁棒性检查。总体结果与表 2 相似。与表 2 相比,白人女性的影响甚至略有增加。白人女性的巨大溢价仍然超过所有其丨他类别。白人女性的溢价优于来自世界排名前 200 的大学的学士学位,大型公司的经验,课外活动,流利的法语和其丨他语言以及加拿大硕士学位的累积影响。

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

  1. control1 ="+ ba_quality + extracurricular_skills + language_skills"
  2. control2 ="+ ma + exp_highquality"
  3. model3 ="callback ~ female*C(type)"+ control1 + control2
  4. result3 =[]for data in sample:
  5. ols = smf.ols(model3, data).fit(cov_type='HC1')
  6. result3.append(ols)
  1. stargazer = Stargazer(result3)
  2. stargazer.title('Table 3 - Callback Rates and Robustness Checks')
  3. stargazer.custom_columns(names,[1,1,1,1])
  4. 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'}
  5. list3 =list(dict3.keys())
  6. dict3.update(dict2)
  7. stargazer.rename_covariates(dict3)
  8. list3 = list2 + list3
  9. stargazer.covariate_order(list3)
  10. stargazer

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

练习

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

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

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

  1. pd.crosstab(index=[df2['name_ethnicity'], df2['female'],
  2. df2['name']], columns=df2['type'],
  3. values=df2['callback'], aggfunc='mean')

类型0.01.02.03.04.0名字 _ 种族女性名字————————加拿大0.0格雷格·约翰逊11.561NaNNaNNaNNaN约翰·马丁8.235NaNNaNNaNNaN马修·威尔逊10.638NaNNaNNaNNaN1.0艾莉森·约翰逊18.675NaNNaNNaNNaN凯丽·马丁20.455NaNNaNNaNNaN吉尔·威尔逊15.205NaNNaNNaNNaN中国人0.0刘东NaN10.8703.39013.1582.381李蕾NaN14.0629.7568.06511.364张勇NaN10.2277.4073.5098.3331.0刘敏NaN8.2355.35711.32115.556李娜NaN10.12712.6985.5562.703张秀英NaN11.9276.7809.0917.018中国-加拿大0.0王艾瑞克NaN9.6773.3908.8890.0001.0王美琪NaN12.5006.7804.3483.571希腊0.0鲁卡斯·米诺普洛斯NaN10.714NaNNaNNaN1.0NicoleMinsopoulosNaN9.596NaNNaNNaN印度人0.0阿尔琼·库马尔NaN8.6428.3333.1254.762帕纳夫·辛格NaN1.33315.9427.3172.500拉胡尔·考尔NaN8.57110.7695.4557.317萨米尔·夏尔马NaN5.8146.89710.2566.5221.0MayaKumarNaN14.2866.9443.4485.263PriyankaKaurNaN6.48114.8153.6365.128ShreyaSharmaNaN13.1588.7724.6515.128TaraSinghNaN14.2868.0659.0914.444
4)你能从下表推断出什么?你有什么见解要分享吗?

  1. pd.crosstab(index= df2['occupation_type'],
  2. columns=[df2['name_ethnicity'], df2['female']],
  3. 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 的结果。重点关注固定效应(职业,姓名和城市)的添加。

  1. FE ="+ C(occupation_type) + C(city) + C(name)"
  2. model4 ="callback ~ female*C(type) "+ control1 + control2 + FE
  3. result4 =[]for data in sample:
  4. ols = smf.ols(model4, data).fit(cov_type='HC1')
  5. result4.append(ols)
  1. stargazer = Stargazer(result4)
  2. stargazer.title('Table 4 - Callback Rates and Fixed Effects')
  3. stargazer.custom_columns(names,[1,1,1,1])
  4. stargazer.rename_covariates(dict3)
  5. stargazer.covariate_order(list3)
  6. stargazer.add_line('Fixed Effects',['','','',''])
  7. stargazer.add_line('Occupation',['Yes','Yes','Yes','Yes'])
  8. stargazer.add_line('Name',['Yes','Yes','Yes','Yes'])
  9. stargazer.add_line('City',['Yes','Yes','Yes','Yes'])
  10. stargazer
  1. C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning:
  2. covariance of constraints does not have full rank. The number of constraints is43, but rank is1
  3. C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning:
  4. covariance of constraints does not have full rank. The number of constraints is41, but rank is39
  5. C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning:
  6. covariance of constraints does not have full rank. The number of constraints is37, but rank is35
  7. C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\base\model.py:1752: ValueWarning:
  8. covariance of constraints does not have full rank. The number of constraints is31, but rank is29

表 4 - 回拨率和固定效应
印度女性0) 英文姓名,加拿大教育和经验1) 外国姓名,加拿大教育和经验2) 外国姓名和教育,加拿大经验3) 外国姓名和教育,混合经验4) 所有外国(姓名,教育和经验)[女性]x[1][女性]x[2][女性]x[3][女性]x[4]世界排名前 200 的大学高质量工作经验列出课外活动流利的法语和其丨他语言加拿大硕士学位固定效应职业名字城市观察R²调整后的 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 年之间被观察到。

  1. import numpy as np
  2. import pandas as pd
  3. pd.set_option('precision',3)# Data from Bisschop et al. (2017)
  4. path ="https://github.com/causal-methods/Data/raw/master/"
  5. df = pd.read_stata(path +"CBSregist2015.dta")
  6. df.head(5)

城市年份开放关闭城市 1logpopdensopeningRegmayorCDAmayorCUmayorD66…相似盗窃率聚合盗窃率相似盗窃率的自然对数聚合盗窃率的自然对数盗窃率盗窃率的自然对数职务侵犯率职务暴力率职务侵犯率的自然对数职务暴力率的自然对数0阿姆斯特丹1994-01-010.00.01.08.3810.00.00.00.0…59.24657.9348.3648.342117.1819.0467.5965.1106.3105.9141阿姆斯特丹1995-01-010.00.01.08.3790.00.00.00.0…50.81543.8238.2088.06094.6378.8307.0614.3616.2345.7532阿姆斯特丹1996-01-011.00.01.08.3730.00.00.00.0…42.33337.1118.0207.88879.4448.6497.5205.4316.2925.9663阿姆斯特丹1997-01-011.00.01.08.3690.00.00.00.0…46.84332.8608.1177.76279.7048.6486.8524.1956.1945.7044阿姆斯特丹1998-01-011.00.01.08.3730.00.00.00.0…45.25533.9078.0867.79879.1628.6466.1274.5956.0875.799
5 行×65 列

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

  1. big_cities =["Amsterdam","Rotterdam","Den Haag"]
  2. medium_cities =["Utrecht","Nijmegen","Groningen","Heerlen","Eindhoven","Arnhem"]# Classify citiesdefclassify(var):if var in big_cities:return"Big Cities"elif var in medium_cities:return"Medium Cities"else:return"No tippelzone"
  3. df['group']= df["city"].apply(classify)

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

  1. outcome =['sexassaultpcN','rapepcN','drugspcN','maltreatpcN','weaponspcN']
  2. df.groupby('group')[outcome].mean().T

组大城市中等城市无 tippelzone性丨侵犯率0.7750.6260.664强丨奸率1.0320.8460.691毒丨品犯罪率14.92115.59912.779maltreatpcN21.25918.66517.864weaponspcN5.6354.3854.207
tippelzones 城市的人口和人口密度比没有 tippelzones 的城市更多。平均家庭收入(以 1,000 欧元计)在 3 个组中相似。tippelzones 城市也有受过较高教育的个体。移民比例在大城市中更高(11.4%)。社丨会保险福利(“insurWWAO_pc”)的份额与 3 个组相似。

  1. demographics =['popul_100','pop_dens_100','popmale1565_100','inkhh','educhpc','nondutchpc','insurWWAO_pc']
  2. df.groupby('group')[demographics].mean().T

组大城市中等城市无 tippelzonepopul_1005974.8861724.1911131.138pop_dens_10043.25822.97719.560popmale1565_1002101.446617.019392.255inkhh29.05228.98930.502educhpc0.3000.3170.245非荷兰人比例0.1140.0590.052insurWWAO_pc0.0740.0810.078
基丨督丨教联盟在没有 tippelzone 的城市中拥有更多的市长(31%)。值得一提的是,该党反对开放 tippelzone。

  1. political_party =['mayorSoc','mayorLib','mayorChr']
  2. df.groupby('group')[political_party].mean().T

组大城市中等城市无 tippelzonemayorSoc0.4810.5560.410mayorLib0.2590.3240.278mayorChr0.2590.1200.312
数据集是平衡的面板数据。有必要按顺序声明指数:分析单位和时间单位。

  1. df['year']= pd.DatetimeIndex(df['year']).year
  2. df['Dyear']= pd.Categorical(df.year)# Set Panel Data# Set city as the unit of analysis
  3. df25 = df.set_index(['city1','year'])

  1. Y
  2. c
  3. t
  4. Y_{ct}
  5. Yct​为城市
  6. c
  7. c
  8. c在年份
  9. t
  10. t
  11. t的犯罪率。设
  12. D
  13. c
  14. t
  15. D_{ct}
  16. Dct = 1,如果城市
  17. c
  18. c
  19. c在年份
  20. t
  21. t
  22. t有开放的 tippelzone;否则为 0。让我们估计以下模型:
  23. l
  24. n
  25. (
  26. Y
  27. c
  28. t
  29. )
  30. =
  31. α
  32. c
  33. +
  34. ρ
  35. D
  36. c
  37. t
  38. +
  39. β
  40. X
  41. c
  42. t
  43. +
  44. γ
  45. t
  46. +
  47. ϵ
  48. c
  49. t
  50. ln(Y_{ct})=\alpha_c+\rho D_{ct}+\beta X_{ct}+\gamma_t + \epsilon_{ct}
  51. ln(Yct​)=αc​+ρDct​+βXct​+γt​+ϵct

其中

  1. α
  2. c
  3. \alpha_c
  4. αc​是城市固定效应,
  5. X
  6. c
  7. t
  8. X_{ct}
  9. Xct​是控制变量向量,
  10. γ
  11. t
  12. \gamma_t
  13. γt​是年固定效应,
  14. ϵ
  15. c
  16. t
  17. \epsilon_{ct}
  18. ϵct​是通常的误差项。
  1. import statsmodels.formula.api as smf
  2. Ys =["lnsexassaultN","lnrapeN","lndrugsN","lnweaponsN","lnmaltreatN"]
  3. base ="~ 1 + opening"
  4. fe ="+ C(city) + C(Dyear)"
  5. controls =['logpopmale1565','logpopdens','inkhh','educhpc','nondutchpc','insurWWAO','mayorCDA','mayorCU','mayorD66','mayorVVD']
  6. Xs =""for var in controls:
  7. Xs = Xs +'+'+ var
  8. columns =[]for Y in Ys:
  9. result = smf.ols(Y + base + fe + Xs, df25).fit(cov_type='cluster',
  10. cov_kwds={'groups': df25['city']})
  11. columns.append(result)
  1. 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
  1. # Library to print professional publication# tables in Latex, HTML, etc.
  2. !pip install stargazer
  1. Requirement already satisfied: stargazer in c:\anaconda\envs\textbook\lib\site-packages (0.0.5)
  1. WARNING: Error parsing requirements for numpy:[Errno 2] No such fileor directory:'c:\\anaconda\\envs\\textbook\\lib\\site-packages\\numpy-1.19.2.dist-info\\METADATA'

第 1 列表明开放 tippelzone 将性丨虐丨待减少 26%(

  1. e
  2. 0.302
  3. 1
  4. e^{-0.302}-1
  5. e0.3021)。在其丨他列中,tippelzone 的系数在统计上不显著。看起来合法化卖丨淫会减少性丨虐丨待,但不会减少其丨他犯罪,如强丨奸、攻击、非法武器和毒丨品相关犯罪。
  1. # Settings for a nice tablefrom stargazer.stargazer import Stargazer
  2. stargazer = Stargazer(columns)
  3. stargazer.title('The Impact of Tippelzone on Crime')
  4. names =['Sex Abuse','Rape','Drugs','Weapons','Assault']
  5. stargazer.custom_columns(names,[1,1,1,1,1])
  6. stargazer.covariate_order(['opening'])
  7. stargazer.add_line('Covariates',['Yes','Yes','Yes','Yes','Yes'])
  8. stargazer.add_line('City Fixed Effects',['Yes','Yes','Yes','Yes','Yes'])
  9. stargazer.add_line('Year Fixed Effects',['Yes','Yes','Yes','Yes','Yes'])
  10. stargazer
  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 is52, but rank is24'rank is %d'%(J, J_), ValueWarning)
  2. 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 is52, but rank is24'rank is %d'%(J, J_), ValueWarning)
  3. 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 is52, but rank is24'rank is %d'%(J, J_), ValueWarning)
  4. 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 is52, but rank is24'rank is %d'%(J, J_), ValueWarning)
  5. 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 is52, but rank is24'rank is %d'%(J, J_), ValueWarning)

Tippelzone 对犯罪的影响
开放协变量城市固定效应年固定效应观察R²调整 R²残差标准误差F 统计量注意:

  1. import math
  2. math.exp(-0.302)-1
  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)表示:“…时间趋势

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

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

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

i) “everopenNoReg”: 如果城市

  1. c
  2. c
  3. c在年份
  4. t
  5. t
  6. t之前曾开放过没有许可证的 tippelzone,则为 1,否则为 0

ii) “openingRegP”: 如果城市

  1. c
  2. c
  3. c在年份
  4. t
  5. t
  6. t之前开放了 tippelzone 并引入了事后许可证,则为 1,否则为 0

iii) “openingRegA”: 如果城市

  1. c
  2. c
  3. c在年份
  4. t
  5. t
  6. t之前曾开放过带有许可证的 tippelzone,则为 1,否则为 0

iv) “closing”: 如果城市

  1. c
  2. c
  3. c在年份
  4. t
  5. t
  6. 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 的一处物业。样本由巴尔的摩、达拉斯、洛杉矶、圣路丨易斯和华丨盛丨顿特区的所有物业组成。

  1. import numpy as np
  2. import pandas as pd
  3. pd.set_option('precision',3)# Data from Edelman et al. (2017)
  4. path ="https://github.com/causal-methods/Data/raw/master/"
  5. df = pd.read_csv(path +"Airbnb.csv")
  6. df.head(5)

主人回应回应日期消息数量自动编码纬度经度床类型物业类型取消政策客人数量…洛杉矶圣路丨易斯华丨盛丨顿特区总客人原始黑人物业黑人任何黑人过去客人合并九月填充pr 填充0是2015-07-19 08:26:172.01.034.081-118.270真正的床房子灵活3.0…10011.00.00.00.0匹配(3)10.4121否或不可用2015-07-14 14:13:39NaN1.038.911-77.020NaN房子中等2.0…001167.00.00.00.0匹配(3)10.6862请求更多信息(你能验证吗?有多少…2015-07-20 16:24:082.00.034.005-118.481拉出沙发公寓严格1.0…10019.00.00.00.0匹配(3)00.3313我会回复你2015-07-20 06:47:38NaN0.034.092-118.282NaN房子严格8.0…10041.00.00.00.0匹配(3)00.5364未发送消息.NaN1.038.830-76.897真正的床房子严格2.0…00128.00.00.00.0匹配(3)10.555
5 行×104 列

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

  1. # Data for bar chart
  2. count = pd.crosstab(df["graph_bins"], df["guest_black"])import plotly.graph_objects as go
  3. node =['Conditional No','Conditional Yes','No','No Response','Yes']
  4. fig = go.Figure(data=[
  5. go.Bar(name='Guest is white', x=node, y=count[0]),
  6. go.Bar(name='Guest is African American', x=node, y=count[1])])
  7. fig.update_layout(barmode='group',
  8. title_text ='Host Responses by Race',
  9. font=dict(size=18))
  10. fig.show()

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

  1. import statsmodels.api as sm
  2. 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.
  3. df1 = df.dropna(subset=['yes','guest_black','name_by_city'])
  4. reg1 = sm.OLS(df1['yes'], df1[['const','guest_black']])
  5. res1 = reg1.fit(cov_type='cluster',
  6. cov_kwds={'groups': df1['name_by_city']})# Column 2
  7. vars2 =['yes','guest_black','name_by_city','host_race_black','host_gender_M']
  8. df2 = df.dropna(subset = vars2)
  9. reg2 = sm.OLS(df2['yes'], df2[['const','guest_black','host_race_black','host_gender_M']])
  10. res2 = reg2.fit(cov_type='cluster',
  11. cov_kwds={'groups': df2['name_by_city']})# Column 3
  12. vars3 =['yes','guest_black','name_by_city','host_race_black','host_gender_M','multiple_listings','shared_property','ten_reviews','log_price']
  13. df3 = df.dropna(subset = vars3)
  14. reg3 = sm.OLS(df3['yes'], df3[['const','guest_black','host_race_black','host_gender_M','multiple_listings','shared_property','ten_reviews','log_price']])
  15. res3 = reg3.fit(cov_type='cluster',
  16. cov_kwds={'groups': df3['name_by_city']})
  17. columns =[res1, res2, res3]
  1. C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\tools\_testing.py:19: FutureWarning:
  2. pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
  1. # Library to print professional publication# tables in Latex, HTML, etc.
  2. !pip install stargazer
  1. Requirement already satisfied: stargazer in c:\anaconda\envs\textbook\lib\site-packages (0.0.5)
  1. WARNING: Error parsing requirements for numpy:[Errno 2] No such fileor directory:'c:\\anaconda\\envs\\textbook\\lib\\site-packages\\numpy-1.19.2.dist-info\\METADATA'

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

  1. # Settings for a nice tablefrom stargazer.stargazer import Stargazer
  2. stargazer = Stargazer(columns)
  3. stargazer.title('The Impact of Race on Likelihood of Acceptance')
  4. stargazer

种族对接受可能性的影响
常数黑人客人主人性别 M主人种族黑人对数价丨格多个列表共享物业十次评论观察R²调整后的 R²残差标准误差F 统计量注:
下表显示了有关主人和房产的摘要统计信息。在实验中,控制变量的平均值与分组实验和对照组的平均值相同。

  1. 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']
  2. df.describe()[control].T

计数平均值标准差最小值25%50%75%最大值host_race_white6392.00.6340.4820.00.001.001.0001.000host_race_black6392.00.0780.2690.00.000.000.0001.000host_gender_F6392.00.3760.4850.00.000.001.0001.000host_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 检验)显示黑人和白人客人是相同的。

  1. result =[]for var in control:# Do the T-test and save the p-value
  2. pvalue = sm.OLS(df[var], df[['const','guest_black']],
  3. missing ='drop').fit().pvalues[1]
  4. result.append(pvalue)
  1. ttest = df.groupby('guest_black').agg([np.mean])[control].T
  2. ttest['p-value']= result
  3. ttest

黑人客人0.01.0p 值host_race_white平均值0.6430.6260.154host_race_black平均值0.0780.0780.972host_gender_F平均值0.3810.3720.439host_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)的结果。在下面的表格中,你可以看到代表黑人和白人的名字并不多。如何反驳这个批评?你可以做什么来证明结果不是由特定的名字驱动的?

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

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

  1. pd.crosstab(index=[df['host_gender_F'], df['host_race']],
  2. columns=[df['guest_gender'], df['guest_race']],
  3. 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.3861UU0.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)的数据集。每一行都是以色列公民。

  1. import numpy as np
  2. import pandas as pd
  3. pd.set_option('precision',3)# Data from Jha & Shayo (2019)
  4. path ="https://github.com/causal-methods/Data/raw/master/"
  5. df = pd.read_stata(path +"replicationdata.dta")
  6. df.head(5)
  1. C:\Anaconda\envs\textbook\lib\site-packages\pandas\io\stata.py:1433: UnicodeWarning:
  2. One or more strings in the dta file could not be decoded using utf-8,and
  3. so the fallback encoding of latin-1is being used. This can happen when a file
  4. has been incorrectly encoded by Stata or some other software. You should verify
  5. the string values returned are correct.
  6. warnings.warn(msg, UnicodeWarning)

统计tradestock6愿意承担 1 到 10 的风险用户 ID男性关系关系 IDnafa教育ses…tradetot_m4pricechange_m4bought_bm4sold_bm4active_bm4资产类型上周过去 3 年下周facts_0_m40完成NaN360814.00.0犹太教世俗耶路撒冷硕士平均以下…3.0-0.6730.00.00.01.00.00.01.02.01完成1.0260824.00.0犹太教世俗特拉维夫文学士平均以上…3.05.3232.00.02.01.01.01.00.03.02完成0.0361067.01.0犹太教世俗中心博士平均以上…3.00.0002.01.03.00.00.00.00.00.03完成NaN461095.01.0犹太教世俗海法文学士学生平均以下…3.05.3233.02.03.00.00.01.00.01.04完成0.0461198.01.0犹太教世俗北部硕士平均以下…3.00.0000.00.00.01.00.00.00.01.0
5 行×526 列

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

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

  1. # Data: Vote Share by year
  2. v2013 = df.groupby('assettreat')['left_2013','right_2013'].mean().T
  3. v2015 = df.groupby('assettreat')['left_s3','right_s3'].mean().T
  4. prop = v2013.append(v2015)# Plot Bar Chartimport plotly.graph_objects as go
  5. node =['Left 2013','Right 2013','Left 2015','Right 2015']
  6. fig = go.Figure(data=[
  7. go.Bar(name='Control', x=node, y = prop[0]),
  8. go.Bar(name='Treatment', x=node, y = prop[1])])
  9. fig.update_layout(barmode='group',
  10. title_text ='Graphic 1 - Elections: 2013 vs 2015 ',
  11. font=dict(size=18))
  12. fig.update_yaxes(title_text ="Vote Share")
  13. fig.show()
  1. 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.
  2. 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.
  3. 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 值。

  1. 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']
  1. import statsmodels.formula.api as smf
  2. result =[]for var in control:# OLS with 104 randomization strata fixed effects
  3. reg = smf.ols(var +"~ 1 + assettreat + C(block13)", df)# 104 is the last variable: the coefficient of assettreat
  4. pvalue = reg.fit().pvalues[104]
  5. result.append(pvalue)
  1. C:\Anaconda\envs\textbook\lib\site-packages\statsmodels\tools\_testing.py:19: FutureWarning:
  2. pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
  1. table = df.groupby('assettreat')[control].mean().T
  2. table['p-value']= result
  3. table

资产治疗0.01.0p 值right_20130.2450.2410.964left_20130.1260.1370.213p_index_s10.0040.0510.399e_index_init-0.0050.0070.752tradestock6all0.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.295r_sec0.6360.6270.582r_trad0.1720.1640.823r_relig0.1190.1240.780r_ultra0.0730.0850.222g_jerusalem0.0960.0910.800g_north0.0890.0970.595g_haifa0.1230.1420.290g_center0.2980.2900.766g_telaviv0.2120.1940.276g_south0.1160.1040.596g_wb0.0660.0810.341家庭收入11162.16210996.9700.511愿意承担风险 1 到 104.3444.7160.009患者0.6420.6570.645plitscore69.72670.6640.550

  1. # Library to print professional publication# tables in Latex, HTML, etc.
  2. !pip install stargazer
  1. Requirement already satisfied: stargazer in c:\anaconda\envs\textbook\lib\site-packages (0.0.5)
  1. WARNING: Error parsing requirements for numpy:[Errno 2] No such fileor 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”)的治疗组个体驱动的。要小心得出巴勒斯坦股票没有影响的结论。在实验期间,以色列股票价丨格上涨,但巴勒斯坦股票下跌。

  1. ITT1 = smf.ols("left_s3 ~ 1 + assettreat",
  2. df).fit()
  3. 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']
  4. controls =""for X in Xs:
  5. controls = controls +'+'+ X
  6. ITT2 = smf.ols("left_s3 ~ 1 + assettreat"+ controls +"+C(block13)", df).fit()
  7. WLS = smf.wls("left_s3 ~ 1 + assettreat"+ controls +"+C(block13)", df, weights=df['vote_wgt']).fit()
  8. treatments ="+ isrstock + palstock + cash"
  9. WLS2 = smf.wls("left_s3 ~ 1"+ treatments + controls +"+C(block13)", df, weights=df['vote_wgt']).fit()
  1. # Settings for a nice tablefrom stargazer.stargazer import Stargazer
  2. stargazer = Stargazer([ITT1, ITT2, WLS, WLS2])
  3. stargazer.title('Table 1 - Intent to Treat Estimates of Stock'+' Exposure on Voting for a Left Party')
  4. names =['ITT','ITT','WLS','WLS']
  5. stargazer.custom_columns(names,[1,1,1,1])
  6. stargazer.covariate_order(['assettreat','isrstock','palstock','cash'])
  7. stargazer.add_line('Strata Fixed Effects',['No','Yes','Yes','Yes'])
  8. stargazer.add_line('Covariates',['No','Yes','Yes','Yes'])
  9. stargazer

表 1 - 对左翼党投票的意向治疗估计股票暴露
资产处理isrstockpalstock现金分层固定效应协变量观察R²调整后的 R²残差标准误差F 统计量注:
表 2 的第 1 列呈现了第一阶段回归。ITT(“资产处理”)是符合分配(“资产 _comp”)的工具变量(IV)。变量“资产 _comp”表示谁实际完成了实验。在控制了几个协变量和分层固定效应之后,ITT 的系数在统计上是显著的。变量“资产处理”是一个完美的 IV。这个变量是随机的。因此,它与误差项不相关。

第 2 列显示了控制函数方法(CF)的结果。对待处理的治疗效应(TOT)估计为 7.3%。接受治疗的个体投票给左翼党的概率增加了 7.3%。在这个框架中,CF 等同于 2SLS。在 CF 中,我们使用第一阶段的残差(

  1. u
  2. ^
  3. \hat{u}
  4. u^)来控制第二阶段的内生性。注意残差在统计上是显著的。因此,需要进行修正。我们可以得出结论,表 1 低估了金融资产暴露对左翼党投票的影响。
  1. # Fist Stage
  2. FS = smf.ols("asset_comp ~ 1 + assettreat"+ controls +"+C(block13)", df).fit()# Control Function Approach
  3. df['resid']= FS.resid
  4. CF = smf.ols("left_s3 ~ 1 + asset_comp + resid"+ controls +"+C(block13)", df).fit()
  1. # Settings for a nice table
  2. stargazer = Stargazer([FS, CF])
  3. stargazer.title('Table 2 - Impact of Stock Exposure'' on Voting for a Left Party')
  4. names =['First Stage','Control Function']
  5. stargazer.custom_columns(names,[1,1])
  6. stargazer.covariate_order(['assettreat','asset_comp','resid'])
  7. stargazer.add_line('Strata Fixed Effects',['Yes','Yes'])
  8. stargazer.add_line('Covariates',['Yes','Yes'])
  9. stargazer

表 2 - 股票暴露对左翼党投票的影响
资产处理资产 _comp残差分层固定效应协变量观察R²调整后的 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

标签: python 开发语言

本文转载自: https://blog.csdn.net/wizardforcel/article/details/135943377
版权归原作者 绝不原创的飞龙 所有, 如有侵权,请联系我们删除。

“Python 因果推断(下)”的评论:

还没有评论