欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何优雅的批量输出psmatch2结果

程序员文章站 2024-03-25 18:25:10
...

最近需要使用PSM-DID,要跑40多个psmatch2。

由于psmatch2输出结果不太方便,一个个复制粘贴比较费眼(也就复制200多下??)

黄河泉老师给出了一个解决办法,但他的代码需要个人适配。索性写了个小程序,欢迎尝试反馈。

原理:

  • 使用scalar取出内存中保存的psmatch2运行结果
  • 将前面取出的scalars依次输入到矩阵matrix内
  • 将matrix用logout命令导出到excel

相信能用上这个程序一定是要跑大量循环的,一般不会是小白了,就不详细注释程序了…(手动狗头)

老规矩,先上效果图
如何优雅的批量输出psmatch2结果

代码

  1. 数据导入
clear all
use "data.dta"
set seed 10101
gen ranorder=runiform()
sort ranorder
  1. 定义全局变量
global PS "x1 x2 x3 x4 x5" //定义匹配变量
global Y "dif_y1 dif_y2 dif_y3" //定义多个结果变量
global Y_out "dif_y1, dif_y2, dif_y3" //定义想要输出到表格的结果变量,注意中间要加上逗号
  1. 自定义函数attout
cap program drop attout
program define attout
version 1.0 //2020.03.04
args var name //输入两个参数分别为var和name,比如结果输出为var,该列标题为name
	sca `var'_1 = r(att)
	sca `var'_2 = r(seatt)
	count if (_treat==1)&(_support==1)
	sca `var'_3 = r(N)
	count if (_treat==0)&(_support==1)
	sca `var'_4 = r(N)
	count if _support==1
	sca `var'_5 = r(N)
	sca `var'_6 = `var'_1/`var'_2 //计算t值
	mat `var' = (`var'_1 \ `var'_2 \ `var'_3 \ `var'_4 \ `var'_5 \ `var'_6)
	mat colnames `var' = `name'
	mat rownames `var' = ATT SE Treated Untreated N T-stat
end
  1. psmatch2循环
foreach v of varlist $Y{
psmatch2 treat $PS, kernel com quiet outcome(`v')
attout `v' `v'
}
  1. 结果输出
logout, save(myfile) dec(3) excel replace: matlist [$Y_out] ,nohalf

一些说明

  • 环境:Win10.0.18363.592; Stata 16(低版本亦能运行)
  • 改善:暂时未解决自动加显著性星星(matrix不能输入文本),不过提供了t值,可以自己后期手动加
  • 联系:公众号(dm2fyq)后台留言即可。
如何优雅的批量输出psmatch2结果
丢张图,你随意~
相关标签: stata