在Stata中随机输入缺失的协变量

在Stata中随机输入缺失的协变量,stata,Stata,我正试图使用Stata随机估算几个协变量的缺失数据。我从未这样做过,我试图使用一位前员工的代码: local covarall calc_age educcat ipovcat_bl US_born alc_yn2 drug_yn lnlpcbsum tot_iod local num = 0 foreach j of local covarall { gen iflag_`j'=0 replace iflag_`j'=1 if `j'==. local num = `

我正试图使用Stata随机估算几个协变量的缺失数据。我从未这样做过,我试图使用一位前员工的代码:

local covarall calc_age educcat ipovcat_bl US_born alc_yn2 drug_yn lnlpcbsum tot_iod
local num = 0 
foreach j of local covarall {
    gen iflag_`j'=0
    replace iflag_`j'=1 if `j'==.
    local num = `num'+1000
    forvalues i = 1/476 { 
        sort `j' 
        count if `j'==. 
        di r(N)
        local num2 = `num'+`i'
        set seed `num2'
        replace `j' in `i'=`j'[1+int((400-r(N))*runiform())] if iflag_`j'[`i']==1  
    }
 }
当我运行这个时,Stata会一遍又一遍地给我这个:

(0 real changes made)
  0
0

我做错了什么

这三条信息似乎可以解释如下:

replace iflag_`j' = 1 if `j' == .
当出现这种情况时,将产生一条信息
(0实际更改)
,这意味着所讨论的变量永远不等于系统缺失,即更换要求

count if `j' == . 
将导致在相同情况下显示
0

di r(N)
同上<代码>计数默认显示结果,然后代码坚持再次显示。奇怪的风格,但不是一个错误

所有这些都说明了这一点

replace `j' in `i'=`j'[1+int((400-r(N))*runiform())] if iflag_`j'[`i'] == 1  
这是相当违法的。我最好的猜测是,不知何故,你把它复制错了,它本应该被复制的

replace `j' =`j'[1+int((400-r(N))*runiform())] in `i' if iflag_`j'[`i'] == 1  
但是,如果没有丢失值,那么这也应该产生与第一个相同的消息

我补充说,如果变量中没有缺失值,那么进入最里面的循环是毫无意义的:这样就没有什么可插补的了


每次更换种子都很奇怪,但这在一定程度上取决于口味

试着从一些小的开始。现在稍微扩展一下,检查结果。重复这些步骤,直到实现完全正常工作为止。大多数情况下,软件开发不是一门精确的科学,而是反复试验,特别是如果您对语言/库/框架不熟悉。如果您要分析这些插补数据,我建议您使用Stata的多重插补(MI)命令。如果你想得到正确反映插补间和插补内变异性的标准误差,你就需要它们。