美文网首页
如何利用stata做placebo test?

如何利用stata做placebo test?

作者: 虚童 | 来源:发表于2018-10-18 13:32 被阅读0次

【更新于2019.04.27】

本文已有更新版,请朋友们移步到:https://www.jianshu.com/p/bad7471ab73b

------------------------下为原文-------------------------------------

〇、概念讲解

安慰剂检验来源于医学,简单地说:

前期步骤:给实验组吃药,对照组不吃药。结果实验组症状改善,这个结果来源于两种可能性。第一种:药物有疗效。第二种:病人的心理因素的作用,药物本身没有效果。

如何排除第二种可能性的干扰?

此时需要做安慰剂检验(placebo test)。就是给实验组的测试对象吃药,给对照组的测试对象吃和药一模一样的糖,看看对照组是否有疗效。若实验组有疗效而对照组无疗效,则可以用来作为支持药物有疗效的依据。

(参见:https://en.wikipedia.org/wiki/Placebo-controlled_study)

一、问题描述

    数据为公司年度面板

    y为因变量,x为自变量,控制变量集为cv

    要验证当x的取值随机时,x对y的处理效应不存在

二、stata代码

  /*-思路:产生两个观测序号,初始序号与随机序号,从数据集中拆分出变量随机

序号与x,按规则“obs_id=random_id”进行匹配,从而将变量x随机赋值到

某个obs*/

下面为1000次place test的代码:

forvalue i=1/1000{

use $dta\tp, clear  //调入数据

xtset stkcd year //按公司年排好序

g obs_id= _n //初始序号

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

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

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

save tt, replace //临时保存以备调用

keep  random_id x //保留随机序号与自变量x

save tt1,replace  //拆分出来

use tt, clear

drop random_id

rename obs_id random_id //匹配字段为obs_id,merge之前重命名

merge 1:1 random_id using  tt1 //实现随机赋值

qui reg y $cv  x, r  //进行回归,y为因变量,x为自变量,$cv为控制变量

g _b_x= _b[x]  //提取x的回归系数

g _se_x= _se[x] //提取x的标准误

keep _b_x _se_x 

duplicates drop _b_x, force

save _b_x`i', replace  //把系数和标准误存起来

}

use _b_x1, clear

    forvalue i=2/1000{

append using _b_x`i'

}  //合并1000次回归的系数及标准误

gen tvalue=coeff/serror

kdensity tvalue, xtitle("t值") ytitle("分布") ///

saving(placebo test:虚拟x变量的系数t值的分布)

//此时查看虚拟x的回归t值的分布是否以0为轴呈对称的倒U型,若是则表明虚拟x对y没有处理效应

相关文章

网友评论

      本文标题:如何利用stata做placebo test?

      本文链接:https://www.haomeiwen.com/subject/zewjzftx.html