了解本地命令在随机化检查中的使用

Understanding the use of local command in Randomization Check

我正在尝试 运行 一个 RCT 的 do-file。作者正在使用 local 命令。

他们创建了一个取值为 1 的本地宏。基于此,他们正在为 var 变量创建缺失值。但是,在那之后,我不明白为什么他们要加 1。此外,为什么 numvarnumvarse 用于 mean 和 sd?

任何解释都会很有帮助。

代码:

*RANDOMIZATION CHECK

local numvar=1

foreach var in T1_Client_Age T1_Client_Married T1_HH_Size T1_Client_Literate T1_Client_Education T1_muslim ///
                    T1_Hindu_SC_Kat T1_rest3    T1_Log_HH_Income T1_Household_Business     ///
                    T1_Client_Wage_Salaried_2 T1_Client_Bus_PR_Employed_2 T1_Client_Housewife_2 {
                    
        replace `var'=. if miss_`var'==1
        
        local numvarse = `numvar' + 1
        
        replace varname="`var'" in `numvar' 

        *MEAN AND SD FOR CONTROL
        quietly: sum `var' if  Treated_All==0
        replace Control=r(mean) in `numvar' 
        replace Control=r(sd) in `numvarse'  
        
        *MEAN AND SD FOR TREATED
        quietly:sum `var' if  Treated_All==1 
        replace Treat=r(mean) in `numvar' 
        replace Treat=r(sd) in `numvarse'  
        
        *MEAN AND SD FOR TREATED WITH FRIEND
        quietly:sum `var' if  Treatment_Peer==1
        replace Treat_Peer=r(mean) in `numvar' 
        replace Treat_Peer=r(sd) in `numvarse'  
        
        *MEAN DIFFERENCES BETWEEN TREATED AND CONTROL
         xi:reg `var' Treated_All i.sewa_center*i.baseline i.t_month  , cluster(t_group) 
        replace Diff_Control_Treat=_b[Treated_All] in `numvar' 
        replace Diff_Control_Treat=_se[Treated_All] in `numvarse'  

        *MEAN DIFFERENCES BETWEEN TREATED ALONE AND WITH FRIEND
        xi:reg `var' Treated_All Treatment_Peer i.sewa_center*i.baseline i.t_month   , cluster(t_group) 
        replace Diff_Alone_Peer=_b[Treatment_Peer] in `numvar' 
        replace Diff_Alone_Peer=_se[Treatment_Peer] in `numvarse'  

        
    local numvar = `numvarse' + 1   

        }

原理看几条命令就明白了

  local numvar=1

  foreach var in ...  {
                
    
    replace `var'=. if miss_`var'==1
    
    local numvarse = `numvar' + 1
    
    replace varname="`var'" in `numvar' 

    *MEAN AND SD FOR CONTROL
    quietly: sum `var' if  Treated_All==0
    replace Control=r(mean) in `numvar' 
    replace Control=r(sd) in `numvarse'  
    
    *MEAN AND SD FOR TREATED
    quietly:sum `var' if  Treated_All==1 
    replace Treat=r(mean) in `numvar' 
    replace Treat=r(sd) in `numvarse'  
    
    *MEAN AND SD FOR TREATED WITH FRIEND
    quietly:sum `var' if  Treatment_Peer==1
    replace Treat_Peer=r(mean) in `numvar' 
    replace Treat_Peer=r(sd) in `numvarse'  
    
    local numvar = `numvarse' + 1   

}

numvar 初始化为 1。在循环中,numvarsenumvar.

设置为 1

代码然后将一系列变量中的每一个的结果放入观察 numvarnumvarse 中,包括变量的名称及其平均值和各组的 SD。

重点在于

  replace ... in ...

其中 in 限定符仅在该观察中指定 replace

接近循环的末尾 numvar 再次发生碰撞。

简而言之,第一个名为 go 的变量在观察 1 和观察 2 中的结果;对于观察 3 和 4 中名为 go 的第二个变量;等等。

至少,这个过程取决于

  1. 有足够的观察结果证明这是可能的。我数了 13 个变量,所以数据集中至少有 26 个观测值,这似乎是极有可能的。

  2. 据了解,写入的变量与任何其他变量对齐。

有些人可能会发现#2 甚至#1 糟糕的工作方式。他们希望将结果写入新的数据集或新的 frame.

代码不是最先进的:使用 xixtreg 自 Stata 11 (2009) 以来已经过时了,但仍然适用于许多目的。

(详细信息:如果单独有一个变量 miss_X 表示变量 X 丢失,则代码会用 missing 覆盖变量 X 中的值。我认为任何远程观察者都无法解释这一点。)