有没有办法在 Stata 的散点图中抖动置信区间?

Is there a way to jitter confidence intervals in a scatterplot in Stata?

我正在尝试使用 twoway scatter 为两组(foreign==0foreign==1)创建一个随时间变化的平均值和相关置信区间 (CI) 的图和 rcap。但是,即使我使用不同的颜色或线条样式,也很难区分重叠的 CI。

我尝试使用 jitter 选项随机偏移图上的点。虽然这适用于 scatter,但它似乎不适用于我用来绘制 CI 的 rcap。它接受选项,没有错误,但它不会抖动 CI。我曾希望通过使用具有相同种子的 jitterseed 选项,我能够将来自 scatter 的标记和来自 rcap 的 CI 偏移到图上的相同位置。

This post 关于 2005 年的 Statalist 表明 rcap 不支持 jitter。我在当前 rcap 文档中找不到对 jitter 选项的引用,所以我认为情况仍然如此。我对使用除 rcap 以外的绘图命令围绕均值绘制 CI 的解决方案持开放态度。 TIA.

可重现的例子:

sysuse auto, clear

* Generate required statistics by repair record and foreign
collapse (mean)     mean_price = price      ///
         (sd)       sd_price = price        ///
         (count)    n_price = price , by(foreign rep78)

* Compute confidence intervals
gen lb_price = mean_price - invttail(n_price-1,0.025)*(sd_price / sqrt(n_price))
gen ub_price = mean_price + invttail(n_price-1,0.025)*(sd_price / sqrt(n_price))

* No jitter
twoway  (scatter mean_price rep78 if foreign == 0, ///
        c(L) lcol(black) msym(O) mcol(black) ) ///
        ///
    (scatter mean_price rep78 if foreign == 1, ///
        c(L) lcol(black) msym(O) mcol(black) ) ///  
        ///
    (rcap lb_price ub_price rep78 if foreign == 0, ///
    lcol(black) ) ///
        ///
    (rcap lb_price ub_price rep78 if foreign == 1, ///
    lcol(black) )

* With jitter
twoway  (scatter mean_price rep78 if foreign == 0, ///
            c(L) lcol(black) msym(O) mcol(black) jitter(10) jitterseed(123)) ///
            ///
        (scatter mean_price rep78 if foreign == 1, ///
            c(L) lcol(black) msym(O) mcol(black) jitter(10) jitterseed(456)) ///
            ///
        (rcap lb_price ub_price rep78 if foreign == 0, ///
        lcol(black) jitter(10) jitterseed(123)) ///
            ///
        (rcap lb_price ub_price rep78 if foreign == 1, ///
        lcol(black) jitter(10) jitterseed(456))

感谢您提供可重现的示例。您从 2007 年引用的 post 并没有提出 twoway rcap 不允许使用 jitter() 的建议:它正确地说明了这一点。但据记载,jitter() 适用于使用 scattergraph matrix 的点,如果它适用于其他地方,则会明确记录。

但这不是遗憾的理由。置信区间的抖动尖峰或上限条看起来一团糟,也不能保证它们与点估计的抖动标记对齐。该图看起来太像 child 的小图了。即使在原则上使用相同的种子也无济于事。

Stata 不支持您在 twoway 图形中直接需要的内容,因此需要进行一些设置偏移的工作。对于成对的估计值和置信区间,我左右移动显示。在这个例子中,偏移量足够小,数据范围如此之大,我得到了自动有意义的 x 轴标签,尽管在其他问题中你可能需要直接拼出什么你要

我不喜欢同一命令行中不同图形命令的括号表示法,因为已经有足够多的括号了。我也不理解为什么您要坚持为两组使用相同的颜色和标记符号,但这可能反映了您对实际问题的一些不同逻辑或需求。

假设要比较三组,我会向左移动一个估计值,向右移动一个估计值,将第三个估计值留在中间。对于四个或更多组,您通常需要更加努力地思考。

毫无疑问,很多人都想到了抵消的想法,就像文学作品中经常做的那样,但它写在 this Stata Journal tip by James Cui 中。

sysuse auto, clear

* Generate required statistics by repair record and foreign
collapse (mean)     mean_price = price      ///
         (sd)       sd_price = price        ///
         (count)    n_price = price , by(foreign rep78)

* Compute confidence intervals
gen lb_price = mean_price - invttail(n_price-1,0.025)*(sd_price / sqrt(n_price))
gen ub_price = mean_price + invttail(n_price-1,0.025)*(sd_price / sqrt(n_price))

local offset 0.1 
gen rep78_L = rep78 - `offset'
gen rep78_R = rep78 + `offset'

* No jitter
twoway scatter mean_price rep78_L if foreign == 0, c(L) lcol(blue) msym(Oh) mcol(blue) ///
   || scatter mean_price rep78_R if foreign == 1, c(L) lcol(orange) msym(Th) mcol(orange)  ///  
   || rcap lb_price ub_price rep78_L if foreign == 0, lcol(blue)  ///
   || rcap lb_price ub_price rep78_R if foreign == 1, lcol(orange)  /// 
    xtitle("Repair record 1978") ytitle(Price (USD)) legend(order(1 "Domestic" 2 "Foreign"))

community-contributed 命令可能会支持类似的东西,例如 coefplot,一个我从未使用过的很棒的命令。