【发布时间】:2015-09-14 17:55:34
【问题描述】:
您好,我正在尝试使用引导权重和 SE 进行 DFL 风格的重新加权。我有一个超过 5 轮的 2 阶段分层样本(重复横截面)。
我们的想法是为参考人群创建反事实权重,然后找出两组平均结果的差异。这种差异可以分为三个部分 总差异(第 1 组 - 第 2 组,均使用调查权重) 解释差异(第 2 组使用反事实权重 - 第 2 组使用调查权重) 无法解释的差异(第 1 组使用调查权重 - 第 2 组使用反事实权重)
我已经为此编写了以下程序
代码:
///to make sure there is no singleton strata
egen cluster_id= group(sector state region strat fsu)
egen stratum_id= group(sector state region strat)
foreach r in 1 2 3 4 5 {
preserve
qui keep if round==`r'
qui svyset cluster_id [pw=hhwt] , strata (startum_id)
qui unique cluster_id, by (startum_id) gen (dup)
qui by startum_id, sort: egen temp= total(dup)
count if temp==1
drop if temp==1
drop temp dup
save "C:\Users\Round 2 Data\bs_round`r'", replace
restore
}
代码:
///final data we will use
use "C:\Users\Round 2 Data\bs_round1"
foreach r in 2 3 4 5 {
qui merge m:m round using "C:\Users\Round 2 Data\bs_round`r'"
drop _merge
sort round
tab round
}
save "C:\Users\Round 2 Data\bs_all"
代码:
///constructing bootstrap weights
egen pooled_cid= group (cluster_id round)
egen pooled_sid= group (stratum_id round)
svyset pooled_cid [pw=hhwt], strata( pooled_sid)
bsweights bsw, reps(100) n(-1)
svyset pooled_cid [pw=hhwt], strata( pooled_sid) bsrweight(bsw*) vce(bootstrap)
代码:
///writing the program
#delimit ;
capture program drop mydfl;
program define mydfl, eclass properties (svyb);
version 13;
args wgtname xvars outcome;
gen groupref=(group==1);
egen countg1=sum(group==1);
egen countg2=sum(group==2);
logit groupref `xvars';
predict phatref;
gen `wgtname'2=(phatref/(1-phatref))*(countg2/countg1) if group==2;
replace `wgtname'2=1 if group==1;
gen `wgtname'1=((1-phatref)/phatref)*(countg1/countg2) if group==1;
replace `wgtname'1=1 if group==2;
drop phatref groupref countg*;
forvalues i=1/2 {;
sum `wgtname'`i' if group==`i';
replace `wgtname'`i' = `wgtname'`i' / r(mean) if group==`i';
};
mean `outcome' if group==1 ;
mat diff_1=e(b) ;
mean `outcome' if group==2 ;
mat diff_2=e(b) ;
mean `outcome' if group==2 [pw=`wgtname'2] ;
mat diff_3=e(b) ;
mat dd_t = diff_1-diff_2 ;
mat dd_e= diff_3-diff_2 ;
mat dd_u= diff_1-diff_3 ;
ereturn scalar dd_tot=e1(dd_t,1,1) ;
ereturn scalar dd_exp=e1(dd_e,1,1) ;
ereturn scalar dd_unex=e1(dd_u,1,1) ;
end;
代码:
///running the program
local xvars age i.state fhead yrs_ed marital rural
local outcome wage
svy bootstrap e(dd_tot) e(dd_exp) e(dd_unex): mydfl wtid "`xvars'" `outcome'
我想找到结果中平均差距、解释的平均差距和无法解释的平均差距的标准误——在这种情况下是两组的工资。
我不断收到以下错误(在程序创建 wtid1 和 wtid2 之后)
Bootstrap replications (100)
----+--- 1 ---+--- 2 ---+--- 3 ---+--- 4 ---+--- 5
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 50
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 100
insufficient observations to compute bootstrap standard errors
no results will be saved
我做错了什么?
【问题讨论】:
-
当你调用
mydfl时,为什么wgtname用双引号括起来?另外,我认为通过将包含多个元素的本地作为参数传递给使用args的程序,您会遇到更大的问题(尽管我可能是错的)。我怀疑这不会按照您的意愿将参数传递给程序。 -
wgtname是我想给程序将创建的变量的名称。这不是预定义的变量,而是将要创建的变量。 -
好吧,不管怎样,我认为当你执行
mydfl "'wgtname'" 'xvars' 'outcome'Stata 将通过mydfl wtid age i.state2 ... rural wage。而你的程序只需要 3 个args,所以只有wtidage和i.state2会被使用。所以在程序中当你运行logit groupref 'xvars'时,实际执行的命令将是logit groupref age。 -
当您调用
mydfl时,您需要将'xvars'括在双引号中,以便xvars的所有元素作为单个参数传递给程序。 -
谢谢。这确实是问题之一。然而,即使是现在,该程序仍在产生错误。我已经更新了问题以反映它产生的新错误。
标签: stata statistics-bootstrap