我正在使用marginsplot在两个不同的组之间绘制一些错误栏。虽然误差线重叠,所以我试图彼此之间稍微左移或右移。

这是从marginsplot帮助中略作编辑的示例,它说明了该问题:

use http://www.stata-press.com/data/r13/nhanes2
quietly regress bpsystol agegrp##sex
quietly margins agegrp#sex
marginsplot, recast(scatter) ciopts(recast(rspike))

graphics - 在Stata的marginsplot中躲避误差线-LMLPHP

有什么简单的方法可以将蓝色Male点和条稍微移到左侧,而将红色Female点和条稍微移到右侧(反之亦然)?就像做的是躲避的条形图。

在这里,可以很好地将置信区间重绘到一个区域,并使它稍微透明,如在帮助示例中更进一步。但是,对于我的实际使用,我想保留要点和峰值。

最佳答案

这是使用社区贡献的命令parmesteclplot的方法。

技巧是调整组变量的值,例如0.1,然后使用subbyeclplot选项:

** a short version
use http://www.stata-press.com/data/r13/nhanes2
qui reg bpsystol agegrp##sex
qui margins agegrp#sex
qui parmest , bmat(r(b)) vmat(r(V)) level( `cilevel' ) fast
qui split parm, parse( . # )
qui destring parm*, replace
replace parm1 = parm1 - ( 0.05 )
eclplot estimate min95 max95 parm1, eplot(sc) rplottype(rspike) supby(parm3, spaceby(0.1))

graphics - 在Stata的marginsplot中躲避误差线-LMLPHP

但是,这种方法的问题是所有标签都丢失了,但是除了蛮力之外,我不知道一种检索它们的好方法。

以下是代码的扩展版本,在该版本中,我尝试通过蛮力方法自动重新应用所有值标签:
use http://www.stata-press.com/data/r13/nhanes2, clear

** specify parameters and variables
local cilevel = 95
local groupvar agegrp
local typevar sex
local ytitle "Linear Prediction"
local title "Adjust Predictions of `groupvar'#`typevar' with `cilevel'% CIs"
local eplot scatter
local rplottype rspike
local spaceby 0.1 /* use this param to control the dodge */

** store labels of groupvar ("agegrp") and typevar ("sex")
local varlist `groupvar' `typevar'
foreach vv of var `varlist' {
    local `vv'_varlab : var lab `vv'
    qui levelsof `vv', local( `vv'_vals )
    foreach vl of local `vv'_vals {
        local `vv'_`vl'lab : lab `vv' `vl'
        lab def `vv'_vallab `vl' "``vv'_`vl'lab'", add
    }
}

** run analysis
qui reg bpsystol `groupvar'##`typevar'
margins `groupvar'#`typevar'

** use parmest to store estimates
preserve
parmest , bmat(r(b)) vmat(r(V)) level( `cilevel' ) fast
lab var estimate "`ytitle'"

split parm, parse( . # )
qui destring parm*, replace
rename parm1 `groupvar'
rename parm3 `typevar'

** reaply stored labels
foreach vv of var `varlist' {
    lab var `vv' "``vv'_varlab'"
    lab val `vv' `vv'_vallab
}

** dodge and plot
replace agegrp = agegrp - ( `spaceby' / 2 )
eclplot estimate min95 max95 agegrp ///
    , eplot( `eplot' ) rplottype( `rplottype' ) ///
    supby( sex, spaceby( `spaceby' ) ) ///
    estopts1( mcolor( navy ) ) estopts2( mcolor( maroon ) ) ///
    ciopts1( lcolor( navy ) ) ciopts2( lcolor( maroon ) ) ///
    title( "`title'" )

restore

关于graphics - 在Stata的marginsplot中躲避误差线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37168964/

10-10 13:11