在Stata中随机估算缺失的协变量

时间:2015-10-28 21:07:24

标签: 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 = `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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

replace iflag_`j' = 1 if `j' == .
只要是这样,

将导致消息(0 real changes made),这意味着所讨论的变量永远不会等于系统缺失,即替换的要求。

count if `j' == . 

会导致在同一情况下显示0

di r(N)

同上。 count默认显示结果,然后代码会坚持再次显示。奇怪的风格,但不是一个错误。

所有这一切都说

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  

但如果没有丢失值,这也应该产生与第一个相同的消息。

我补充说,如果变量中没有缺失值,那么进入最内层循环是完全没有意义的:那么就没有任何可归因的东西了。

每次改变时更换种子都很奇怪,但这部分是品味问题。