Графики соединенных линий, отображающие среднее значение групп, разбитых по категориям - PullRequest
0 голосов
/ 10 мая 2019

У меня есть данные, где есть много наблюдений по двум переменным, скажем rep78 и headroom.

Я хочу взять среднее значение третьей переменной, скажем weight в каждой ячейке rep78 + headroom.Для каждой категории headroom я отдельно хочу изобразить (связанный точечный график) эти средние значения с rep78 на оси x.Я предполагаю, что более интуитивный способ думать об этом - заменить rep78 на year и headroom на state.

Мне удалось получить то, что я хочу, с помощью кода ниже:

sysuse auto2, clear
bys rep78 headroom: egen mean_w=mean(weight)
twoway  (scatter mean_w rep78 if headroom==1.5, connect(l)) ///
        (scatter mean_w rep78 if headroom==2.0, connect(l)) ///
        (scatter mean_w rep78 if headroom==2.5, connect(l)) ///
        (scatter mean_w rep78 if headroom==3.0, connect(l)) ///
        (scatter mean_w rep78 if headroom==3.5, connect(l)) ///
        (scatter mean_w rep78 if headroom==4.0, connect(l)) ///
        (scatter mean_w rep78 if headroom==4.5, connect(l)) ///
        (scatter mean_w rep78 if headroom==5.0, connect(l)), ///
        legend(label(1 "1.5") label(2 "2.0") label(3 "2.5") ///
              label(4 "3.0") label(5 "3.5") label(6 "4.0") ///
              label(7 "4.5") label(8 "5.0"))

Однако есть ли более простой (то есть более короткий) способ сделать это?

Я согласен с упрощением любой части этого кода.

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Спасибо за MCVE!

Вы правы. Вот одно более короткое решение для получения того же графика, по модулю мелких деталей, которые вы также можете настроить:

sepscatter mean_w rep78, sep(headroom) recast(connected) name(G2, replace) 

с использованием sepscatter от SSC, как объявлено в Statalist . Дополнительные примеры можно найти, используя sepscatter в качестве поискового запроса в Statalist.

2 голосов
/ 10 мая 2019

Я не вижу здесь ничего сложного.

Команда , предоставленная сообществом sepscatter - это хорошая оболочка, но если проблема заключается в краткости кода, вы также можете сделать следующее, не устанавливая ничего:

sysuse auto2, clear
bysort rep78 headroom: egen mean_w=mean(weight)

levelsof headroom, local(head)

foreach x of local head {
    local scatterlist `scatterlist' (scatter mean_w rep78 if headroom == `x', connect(l))
}

twoway `scatterlist'

Чтобы устранить любые проблемы с точностью, можно использовать float(), если переменная не сгенерирована как double:

(scatter mean_w rep78 if headroom == float(`x'), connect(l))
...