sungmoo 发表于 2009-12-10 20:14 
*命令格式是 gsca v1 v2 v3|v4-vn if in,即m f r对应的变量与其他变量以“|”分开。
cap pr drop gsca
pr gsca
syntax anything [if] [in]
marksample cond
qui keep if `cond'
tempvar vv1 vv2 vv3
loc varlist1=substr("`anything'",1,strpos("`anything'","|")-1)
loc varlist2=substr("`anything'",strpos("`anything'","|")+1,.)
foreach ui of var `varlist1'{
loc i=`i'+1
qui g `vv`i''=`ui'
}
foreach vi of var `varlist2' {
qui egen `vi'std=std(`vi')
qui bys `vv1' `vv2' (`vv3'):egen `vi'e=mean(`vi'std)
qui bys `vv1' (`vv2'):egen `vi'mg=mean(`vi'e)
qui bys `vv2' (`vv3'):egen `vi'fg=mean(`vi'e)
qui g `vi'sca=`vi'e-`vi'mg-`vi'fg
qui drop `vi' `vi'std
}
qui keep if `vv3'==1
end
将sungmoo提供的程序修饰的更简洁和条理化,请sungmoo指导,
cap pr drop gsca
pr gsca
syntax varlist [if] [in],MCode(string) FCode(string) Rep(string)
marksample cond
qui keep if `cond'
foreach vi of var `varlist' {
qui egen `vi'std=std(`vi')
qui bys `mcode' `fcode' (`rep'):egen `vi'e=mean(`vi'std)
qui bys `mcode' (`fcode'):egen `vi'mg=mean(`vi'e)
qui bys `fcode' (`mcode'):egen `vi'fg=mean(`vi'e)
qui g `vi'sca=`vi'e-`vi'mg-`vi'fg
qui drop `vi' `vi'std
}
qui keep if `rep'==1
qui drop `rep'
end