我试图使用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
我做错了什么?
答案 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
但如果没有丢失值,这也应该产生与第一个相同的消息。
我补充说,如果变量中没有缺失值,那么进入最内层循环是完全没有意义的:那么就没有任何可归因的东西了。
每次改变时更换种子都很奇怪,但这部分是品味问题。