Рассчитать среднее значение всех отдельных значений в группе - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть два столбца с данными.

Один имеет метки для группы, а второй отображает значения для элементов в каждой группе.Я хотел бы рассчитать для каждой группы среднее значение только для тех значений, которые отличаются.

Как я могу сделать это в Stata?


РЕДАКТИРОВАТЬ:

См. Мой набор данных и желаемый результат ниже:

Group_label   Value
   x            12
   x            12
   x            2
   x            1
   y            5
   y            5
   y            5
   y            2
   y            2

Я хочу получить следующее среднее значение:

Group_label   Value      Average
   x            12         5
   x            12         5
   x            2          5
   x            1          5
   y            5          3.5
   y            5          3.5
   y            5          3.5
   y            2          3.5
   y            2          3.5

Таким образом, среднее значение для x = (12 + 2 + 1) / 3 и для y = (5 + 2) / 2

Я пробовал команду egen(mean), но она выбирает все значения для каждой метки группы.

Я хочу выбрать только отдельные значения.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

У меня работает следующее:

clear

input str1 vlab   val
   "x"            12
   "x"            12
   "x"            2
   "x"            1
   "y"            5
   "y"            5
   "y"            5
   "y"            2
   "y"            2
end

bysort vlab: generate tag = val != val[_n-1]
bysort vlab: egen mean_val = mean(val) if tag == 1

list

     +-----------------------------+
     | vlab   val   tag   mean_val |
     |-----------------------------|
  1. |    x    12     1          5 |
  2. |    x    12     0          . |
  3. |    x     2     1          5 |
  4. |    x     1     1          5 |
  5. |    y     5     1        3.5 |
     |-----------------------------|
  6. |    y     5     0          . |
  7. |    y     5     0          . |
  8. |    y     2     1        3.5 |
  9. |    y     2     0          . |
     +-----------------------------+

РЕДАКТИРОВАТЬ:

Если вы также делаете:

bysort vlab: replace mean_val = mean_val[_n-1] if mean_val == .

Выполучит:

list

     +-----------------------------+
     | vlab   val   tag   mean_val |
     |-----------------------------|
  1. |    x    12     1          5 |
  2. |    x    12     0          5 |
  3. |    x     2     1          5 |
  4. |    x     1     1          5 |
  5. |    y     5     1        3.5 |
     |-----------------------------|
  6. |    y     5     0        3.5 |
  7. |    y     5     0        3.5 |
  8. |    y     2     1        3.5 |
  9. |    y     2     0        3.5 |
     +-----------------------------+
0 голосов
/ 21 сентября 2018

Это двухэтапное решение.Сначала вам нужно пометить различные значения, используя tag() в egen.Затем вы используете mean() в пределах egen.

Самым деликатным моментом является то, что что-то вроде ... if tag оставит пропущенные значения в результате для наблюдений, не выбранных.Как можно опустить дублированные значения в расчете, а также распространить результат на свои наблюдения?См. Раздел 9 этой статьи об использовании cond() вместе с mean(), что является одним из способов сделать это, примером которого является код, и, возможно, самым прозрачным способом.См. Раздел 10 этой же статьи о другом методе, который забавляет некоторых людей.

Для довольно подробного обзора отдельных наблюдений см. https://www.stata -journal.com / sjpdf.html? Articlenum = dm0042

clear 
input str1 Group_label   Value
   x            12
   x            12
   x            2
   x            1
   y            5
   y            5
   y            5
   y            2
   y            2
  end 

  egen tag = tag(Group_label Value)

  egen mean = mean(cond(tag, Value, .)), by(Group_label)

  list, sepby(Group_label)

     +-------------------------------+
     | Group_~l   Value   tag   mean |
     |-------------------------------|
  1. |        x      12     1      5 |
  2. |        x      12     0      5 |
  3. |        x       2     1      5 |
  4. |        x       1     1      5 |
     |-------------------------------|
  5. |        y       5     1    3.5 |
  6. |        y       5     0    3.5 |
  7. |        y       5     0    3.5 |
  8. |        y       2     1    3.5 |
  9. |        y       2     0    3.5 |
     +-------------------------------+
...