Python计算双重差分模型DID及其对应P值使用详解
作者:麦片加奶不加糖 发布时间:2022-08-06 21:07:53
1. DID(Differences-in-Differences)定义
双重差分法,其主要被用于社会学中的政策效果评估。这种方法需要两个「差异」数据。一个是干预前后的「差异」,这个是自身实验前后的差异。另外一个是干预组与对照组的「差异」。DID利用这两个「差异」的差异来推算干预的效果。因此,顾名思义叫做双重差分法。
其原理是基于一个反事实的框架来评估政策发生和不发生这两种情况下被观测因素y的变化。如果一个外生的政策冲击将样本分为两组:受政策干预的Treat组和未受政策干预的Control组(在政策冲击前,Treat组和Control组的y没有显著差异)。那么,可以将Control组在政策发生前后y的变化看作Treat组未受政策冲击时的状况(反事实的结果)。通过比较Treat组y的变化(D1)以及Control组y的变化(D2),就可以得到政策冲击的实际效果(DD=D1-D2)。
注意:只有在满足“政策冲击前Treat组和Control组的y
没有显著差异”(即平行性假定)的条件下,得到的双重差分估计量才是无偏的。
如下图所示:
干预组实验前为A1,实验后为A2。对照组实验前为B1,实验后为B2。对于干预组实验前后差异为A2-A1,对于对照组实验后为B2-B1。两者之差(A2-A1)-(B2-B1)即为DID结果,因果效应/处理效应。如下图处理效应所代表的部分。
2. DID模型形式
为分组虚拟变量(处理组=1,控制组=0);
为分期虚拟变量(政策实施后=1,政策实施前=0);
交互项 表示处理组在政策实施后的效应,其系数即为双重差分模型重点考察的处理效应。
3. OLS多项式拟合
根据DID公式,我们可以通过使用多项式拟合的方法来求得DID及其P值。以下为Pyhton方法:使用statsmodels库中ols方法,需要根据上述公式准备数据,t代表时间(干预前=0,干预后=1)、g代表分组(干预组=1,对照组=0)、还有一个是交叉项tg(计算其t*g即可)。
代码如下:
import statsmodels.formula.api as smf
import pandas as pd
v1 =[0.367730,0.377147,0.352539,0.341864,0.29276,0.393443,0.374697,0.346989,0.385783,0.307801]
t1 = [0,0,0,0,1,0,0,0,0,1]
g1 =[1,1,1,1,1,0,0,0,0,0]
tg1 = [0,0,0,0,1,0,0,0,0,0]
aa = pd.DataFrame({'t1':t1,'g1':g1,'tg1':tg1,'v1':v1})
X = aa[['t1', 'g1','tg1']]
y = aa['v1']
est = smf.ols(formula='v1 ~ t1 + g1 + tg1', data=aa).fit()
y_pred = est.predict(X)
aa['v1_pred'] = y_pred
print(aa)
print(est.summary())
print(est.params)
准备数据格式如下:
OLS结果Summary如下:
交叉项的系数就是DID结果,处理效应。P>| t |为其P值,小于0.05表示差异显著。
参考资料:
1. 双重差分法(DID)入门必看 - 知乎
2. 什么是双重差分模型(:difference-in-differences model)? - 知乎
3. Python 普通最小二乘法(OLS)进行多项式拟合的方法
来源:https://blog.csdn.net/sinat_23133783/article/details/120537346


猜你喜欢
- 代码如下所示:scole = input("input your scole:")if scole>90: &nb
- 在Web渗透流程的暴力登录场景和爬虫抓取场景中,经常会遇到一些登录表单用DES之类的加密方式来加密参数,也就是说,你不搞定这些前端加密,
- N久没有开始写博客了,总觉得要随便记点东西,岁月蹉跎,曾经搞得一些东西、技术、工具,说丢也就丢了,点点滴滴还是要记录一下吧。。。在windo
- 今天遇到下图这种问题,文字过长,显示不全。折腾了老半天,在网上搜了半天也找不到解决方案。于是问了下同事,同事提到了<optgroup&
- 在运维过程中,经常需要读取mysql的结果输出并进行响应的处理,这节介绍如何用Python读取mysql结果表并进行相应的整理。进行mysq
- np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等。np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等。具体见示
- setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。语法:setTimeout(code,millisec)参数:cod
- 前言最近在网上搜了许多关于pandas.DataFrame的操作说明,都是一些基础的操作,但是这些操作组合起来还是比较费时间去正确操作Dat
- function ResumeError() { return true; } window.onerror = ResumeError;
- 有时候,女神发来一条消息,说约你看电影,她考虑了一下,又撤回了,不约你了…而你又想知道她究竟发了什么,该怎么办?微信防撤回了解一下。环境要求
- 对于DBA来说,丢失超管用户root的密码是致命的,可以通过添加--ship-grant-tables参数来跳过权限表。1、忘记root密码
- 程序二:addforum.php <html> <head> <link&
- Vue 单页面应用 把公共组件放在 app.vue 但是我希望某个页面没有这些公共组件怎么办(比如登陆页面)每个页面都有 导航栏 但是我希望
- 前言本文主要给大家介绍了关于利用python 3.5检测路由器流量并写入txt的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看
- 最近安装了丘比特笔记本(jupyter notebook),各种快捷键和编辑模式用的非常舒服。但是我的默认浏览器是chrome每次回车换行都
- 首先来看一下代码:chars = "abcd"tmp = []for char in chars: tmp.append
- 两种方式:1.IP+SID方式 2.配置链接方式1..IP+SID方式DbHelperOracle.connectionString = s
- 对于每个程序开发者来说,调试几乎是必备技能。代码写到一半卡住了,不知道这个函数执行完的返回结果是怎样的?调试一下看看代码运行到一半报错了,什
- 利用numpy和scipy,我们可以很容易根据欧拉角求出旋转矩阵,这里的旋转轴我们你理解成四元数里面的旋转轴 import nu
- 首先需要注意的是,本文即将提到的 Druid,并非阿里巴巴的 Druid 数据库连接池,而是另一个大数据场景下的解决方案:Apache Dr