实证论文复刻|stata安慰剂检验

news2024/11/28 6:52:39

文章及代码来源:中国工业经济《税收征管数字化与企业内部薪酬差距》

目录

随机抽取对照组和实验组

随机设定政策时点

先po完整代码

*随机抽取对照组和控制组
forvalue i=1/500{
    sysuse 数据1.dta, clear 
    g obs_id= _n //初始样本序号
    gen random_digit= runiform() //生成随机数
    sort random_digit  //按新生成的随机数排序
    g random_id= _n  //产生随机序号
    preserve
        keep random_id gtp //保留虚拟的gtp
        rename gtp random_gtp
        rename random_id id //重命名为id,以备与其他变量合并(merge)
        label var id 原数据与虚拟处理变量的唯一匹配码
        save random_gtp, replace
    restore 
        drop random_digit random_id gtp //删除原来的gtp
        rename obs_id id //重命名为id,以备与random_rd合并(merge)
        label var id 原数据与虚拟处理变量的唯一匹配码
        save rawdata, replace 
    *- 合并,回归,提取系数
        use rawdata, clear
        merge 1:1 id using random_gtp,nogen
        xtreg gap random_gtp size lev roa labor age cash indratio top1 soe olddep avgwage lnpgdp i.year i.ind i.prov,fe vce(cluster code)
         g _b_random_gtp= _b[random_gtp]  //提取x的回归系数
        g _se_random_gtp= _se[random_gtp] //提取x的标准误
		gen pvalue=2*ttail(e(df_r), abs(_b[random_gtp]/_se[random_gtp]))
        keep _b_random_gtp _se_random_gtp pvalue
        duplicates drop _b_random_gtp, force
		drop if pvalue ==.
        save placebo`i', replace  //把第i次placebo检验的系数和标准误存起来				
}
*- 纵向合并500次的系数和标准误 
use placebo1, clear
forvalue i=2/500{
    append using placebo`i' //纵向合并500次回归的系数及标准误
    }
rename  _b_random_gtp coef1
twoway (kdensity coef1,yaxis(1)) (scatter pvalue coef1, msymbol(smcircle_hollow) yaxis(2)  mcolor(blue)), ///
title(Placebo Test) ///
xlabel(-0.13(0.05)0.06) ylabel(,axis(1) angle(0)) ylabel(0(1)5,axis(2)) ///
xline(-0.1152, lwidth(vthin) lp(shortdash)) xtitle(估计系数) ///
xline(0,lwidth(vthin) lp(shortdash)) ///
yline(0.1,lwidth(vthin) lp(dash)) ytitle(p value) ///
legend(label(1 'kdensity of estimates') label( 2 'p value')) ///
plotregion(style(none)) ///无边框
graphregion(color(white)) //白底
*-删除临时文件
forvalue i=1/500{
    erase  placebo`i'.dta 
} 

*随机设定政策时点
mat b = J(500,1,0)
mat se = J(500,1,0)
mat p = J(500,1,0)
forvalues i = 1/500{
	use 数据1.dta, clear
	xtset code year
	bsample 1, strata(province) //根据**id**分组,每组随机抽取一个年份
	keep year
	save matchyear.dta, replace
	mkmat year, matrix(sampleyear)
	use 数据1.dta, clear
	xtset code year
	gen DID = 0
	foreach j of numlist 1/36 {
		replace DID = 1 if (province== `j' & year >= sampleyear[`j',1])
	}
	qui xtreg gap DID size lev roa labor age cash indratio top1 soe olddep avgwage lnpgdp i.year i.ind i.prov,fe vce(cluster code)
	mat b[`i',1] = _b[DID]
	mat se[`i',1] = _se[DID]
	scalar df_r = e(N) - e(df_m) -1
	mat p[`i',1] = 2*ttail(df_r,abs(_b[DID]/_se[DID]))
}
svmat b, names(coef)
svmat se, names(se)
svmat p, names(pvalue)

drop if pvalue1 == .
label var pvalue1 p值
label var coef1 估计系数
twoway (kdensity coef1,yaxis(1)) (scatter pvalue1 coef1, msymbol(smcircle_hollow) yaxis(2)  mcolor(blue)), ///
title(Placebo Test) ///
xlabel(-0.2(0.05)0.2) ylabel(,axis(1) angle(0)) ylabel(0(1)5,axis(2)) ///
xline(-0.1152, lwidth(vthin) lp(shortdash)) xtitle(估计系数) ///
xline(0,lwidth(vthin) lp(shortdash)) ///
yline(0.1,lwidth(vthin) lp(dash)) ytitle(p value) ///
legend(label(1 'kdensity of estimates') label( 2 'p value')) ///
plotregion(style(none)) ///无边框
graphregion(color(white)) //白底

随机抽取对照组和实验组

接下来逐一解读:

forvalue表示循环

sysuse表示使用xx数据,和use区别参考stata中 sysuse和use区别 - 知乎

简单来说use调用数据时,需要加上路径,而sysuse不用。

 g obs_id= _n //初始样本序号

 表示生成序号,按照列表依次递增,如图:

gen random_digit= runiform() //生成随机数

每一列随机生成,如图 

sort random_digit  //按新生成的随机数排序

 结果如图:

 g random_id= _n  //产生随机序号

 preserve
        keep random_id gtp //保留虚拟的gtp
        rename gtp random_gtp
        rename random_id id //重命名为id,以备与其他变量合并(merge)
        label var id 原数据与虚拟处理变量的唯一匹配码
        save random_gtp, replace
    restore

 preserve……restore

详细可参考:preserve restore——stata的起死回生之术

preserve 命令可以把之前的内容保存在一个临时内存空间中,这样保存的文件,无论 preserve 以后我们对文件进行什么操作,都可以随时通过restore将preserve命令之前的文件恢复到内存中,继续使用。

keep random_id gtp //保留虚拟的gtp

keep表示保留变量

merge 1:1 id using random_gtp,nogen

merge1:1(merge1:m或merge m:1或merge m:n) 变量 using 数据集2

如果两个数据中的某变量的数据都是唯一的,则用1:1,;

如果数据1中某变量的数据有多个,而数据2中某变量的数据是唯一的,则用merge m:1;

如果数据1中某变量的数据是唯一的,而数据2中某变量的数据有多个,则用merge 1:m;

如果数据1和2中某变量的数据均有多个,则用merge m:n

nogen的含义就是不生成 _merge这个变量

twoway (kdensity coef1,yaxis(1)) (scatter pvalue coef1, msymbol(smcircle_hollow) yaxis(2)  mcolor(blue)), ///
title("安慰剂检验") ///
xlabel(-0.13(0.05)0.06) ylabel(,axis(1) angle(0)) ylabel(0(1)5,axis(2)) ///
xline(-0.1152, lwidth(vthin) lp(shortdash)) xtitle(估计系数) ///
xline(0,lwidth(vthin) lp(shortdash)) ///
yline(0.1,lwidth(vthin) lp(dash)) ytitle(估计系数密度分布) ///
legend(label(1 "核密度") label( 2 "P值")) ///
plotregion(style(none)) ///无边框
graphregion(color(white)) //白底

Kdensity命令是对变量未知密度函数分布时的一种估计,不是一种标准的密度分布函数(比如t分布、正态分布)

msymbol() 调整标记符号的形状。msymbol(S)中的 S 是 square 的缩写,表示方块。msymbol(t) 对应的标记符号为小三角形;msymbol(sh) 对应的标记符号为小的空心方块,括号的的 h 对应 hollow,表示空心的意思;msymbol(X) 对应的标记符号为大的叉号;msymbol(+) 对应的标记符号为十字号;msymbol(p) 对应的标记符号为小点。

随机设定政策时点

mat b = J(500,1,0)//系数矩阵
mat se = J(500,1,0)//标准误矩阵
mat p = J(500,1,0)//P值矩阵

生成备用矩阵

使用mat list b可以查看矩阵,可以看出生成500行,一列,值为0的矩阵

bsample 1, strata(province) 

这里首先将数据按照省份分组,然后在每个省份组内的 year 变量中随机抽取一个年份作为其政策时间

   bsample [exp] [if] [in] [, options]

其中,if代表条件语句,in代表范围语句,options代表其他选项。exp为表达式,用于指定抽取的样本个数。

需要说明的是,对于样本容量exp,如果进行简单分层抽样,就要求样本规模小于等于数据的观测值个数;如果进行分层抽样,exp就不能超过各层中的观测值个数;如果设定选项cluster(),exp就不能超过组的个数;如果同时设定选项cluster()和strata(),exp就不能超过各层内组的个数。

mkmat:将数值型变量中的观测值转变为矩阵

foreach j of numlist 3/30 {
		replace DID = 1 if (prov== `j' & year >= sampleyear[`j',1])
	}

foreach详细参考:foreach的五个小秘密

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1172579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读程序员的制胜技笔记04_有用的反模式(下)

1. 重新发明轮子 1.1. 发明家的特质就是要用质疑的心态对待所有事物,你从未停下质疑,那你将不可避免地成为一个发明家 1.2. 并非所有的事情都有现成的轮子可以拿来用 1.3. 自己重新写一个新的API,最终调用你使用的库 1.3.1. 你的API应该是…

C++二分查找算法的应用:最小好进制

本文涉及的基础知识点 二分查找 题目 以字符串的形式给出 n , 以字符串的形式返回 n 的最小 好进制 。 如果 n 的 k(k>2) 进制数的所有数位全为1,则称 k(k>2) 是 n 的一个 好进制 。 示例 1: 输入:n “13” 输出:“3” …

Canvas制作喷泉效果示例

Canvas能制作出很多动画效果&#xff0c;下面是一个制作喷泉效果的示例 效果图 源代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1 ,user-…

Kubernetes技术与架构-存储 3

如上所示&#xff0c;Kubernetes集群的存储层支持不同类型的存储资源&#xff0c;其提供Projected类型的存储功能整合多种存储资源&#xff0c;将secret、downwardAPI、configMap三种不同类型的存储资源整合成一个挂载到Pod的容器实例中 如上所示&#xff0c;整合两个secret类型…

给跪!我居然被封了!

起因 前两天不知道什么情况&#xff0c;突然收到一条违规信息&#xff0c;说我营销过度&#xff1f;&#xff1f;&#xff1f; 当时一看这个立马有点慌&#xff0c;我的Python爬虫群&#xff0c;付费社群等等不是都受到影响了&#xff1f; 啥我这个号朋友圈啥的都没发&#xff…

ChatGPT 的 Text Completion

该章节我们来学习一下 “Text Completion” &#xff0c;也就是 “文本完成” 。“Text Completion” 并不是一种模型&#xff0c;而是指模型能够根据上下文自动完成缺失的文本部分&#xff0c;生成完整的文本。 ⭐ Text Completion 的介绍 Text Completion 也称为文本自动补全…

项目管理之如何估算项目工作成本

在项目管理中&#xff0c;如何估算项目工作成本是一个关键问题。为了解决这个问题&#xff0c;我们可以采用自上而下的成本限额估算法和自下而上的成本汇总估算法。这两种方法各有优缺点&#xff0c;但都可以帮助我们准确地估算项目工作成本。 自上而下的成本限额估算法 自上…

运维知识点-Docker从小白到入土

Docker从小白到入土 安装问题-有podmanCentos8使用yum install docker -y时&#xff0c;默认安装的是podman-docker软件 安装docker启动dockeryum list installed | grep dockeryum -y remove xxxx安装Docker安装配置下载安装docker启动docker&#xff0c;并设置开机启动下载所…

MySQL 表的增删查改(CRUD)

MySQL 表的增删查改(CRUD) 文章目录 MySQL 表的增删查改(CRUD)1. 新增(Create)2. 查询(Retrieve)2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 别名2.5 去重&#xff1a;DISTINCT2.6 排序&#xff1a;ORDER BY2.7 条件查询2.8 分页查询: LIMIT 3. 修改(Update)4. 删除(D…

Springboot3整合Mybatis-plus3.5.3报错

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 报错以及Bug ✨特色专栏&#xff1a; …

QT在线安装所有版本,可共存(下载速度飞快)

使用最新的QT在线安装器&#xff0c;安装QT版本时只能安装5.15以及之后的版本&#xff0c;安装QT5.15之前的版本只能通过离线安装的方式&#xff0c;离线安装后还要自己去配置QT&#xff0c;离线安装还有个问题的&#xff0c;后续维护比较麻烦&#xff0c;QT的维护工具还要自己…

ubuntu中如何设置中文输入

文章目录 1.找到设置&#xff08;settings&#xff09;2.找到keyboard3.点击Chinese&#xff0c;选择intelligent pinyin&#xff0c;并点击add4.打开浏览器测试一下 1.找到设置&#xff08;settings&#xff09; 2.找到keyboard 3.点击Chinese&#xff0c;选择intelligent pin…

1+2+4+7+11+16+..x(和不超过3000),求x与式子的和

我们不难发现&#xff1a;每一项的差值成等差数列 用一个for循环&#xff0c;再用一个变量n存储等差数列 for(int i0;i<300;iin) {sumsumi;n; } 完整代码&#xff1a; #include <stdio.h> int main() {int sum 0;int i 0;int n 0;for (i 1;i < 300;i i n){…

如何在React项目中,创建令人惊叹的动画翻转卡片效果

翻转卡片是一种在网站上展示内容的动态而引人入胜的方法。翻转卡片由正面和背面两个面构成。用户可以通过点击或鼠标悬停来翻转卡片以显示更多信息。本文将向您展示如何在React中轻松构建翻转卡片。 为什么翻转卡片是您网站的有价值的补充&#xff1f; 翻转卡片可以为您的网站用…

系列五、过滤器(一)#概述

一、概述 过滤器的作用是对客户端发送给Servlet的请求以及Servlet返回给客户端的响应做一些定制化的处理&#xff0c;例如&#xff1a; &#xff08;1&#xff09;校验请求的参数是否符合逻辑&#xff0c;符合逻辑则放行&#xff0c;不符合逻辑则不允许访问方法 &#xff08;2&…

顺序栈练习

顺序栈练习 相关内容&#xff1a; 1.判断顺序栈栈满的两种方式 2.一张图理解栈顶指针加加减减的问题 3.栈的顺序存储结构&#xff08;顺序栈&#xff09; //顺序栈的初始化、判空、入栈、出栈、读取栈顶元素 //顺序栈的结构&#xff1a;数组、栈顶指针(本质是下标) #include&…

大数据毕业设计选题推荐-旅游景点游客数据分析-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

使用脚手架创建项目,使用组件开发

单文件组件 单文件组件就是一个文件对应一个组件, 单文件组件的名字通常是xxx.vue(命名规范和组件名的命名规范相同),这个文件是Vue框架规定的只有它能够认识&#xff0c;浏览器无法直接打开运行 Vue框架可以将xxx.vue文件进行编译为浏览器能识别的html js css的代码 xxx.vu…

【Python基础知识一】基本语法、常用数据类型等

Python基础知识&#xff1a; 1 标识符&#xff08;Identifier&#xff09;2 关键字/保留字&#xff08;Keyword&#xff09;3 引号4 编码5 输入输出6 行与缩进7 多行语句8 注释9 数据类型9.1 数字(Number)类型9.2 变量&#xff08;variate&#xff09;9.3 字符串&#xff08;St…

【漏洞复现】Apache_HTTPD_多后缀解析漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞复现1、基础环境2、漏洞验证 1.3、深度利用GetShell 1.4、修复建议 1.1、漏洞描述 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执…