Статусная группа по среднему и первому наблюдению дает неправильное число

#stata

Вопрос:

У меня есть данные панели на уровне города за год, которые выглядят так:

 city        year    mayor   growth     
Orange      2001    A       9.599998    
Orange      2002    A       14.9    
Orange      2003    A       14.6    
Orange      2004    A       13  
Orange      2005    B       9
Orange      2006    B       12.7
Orange      2007    C       18.4
Orange      2008    D       20.7
Orange      2009    D       16.5
 

Я хочу рассчитать для каждого мэра в каждом городе:
(1) рост в его первый год на посту мэра
(2) скользящий средний рост с его первого года

Мой код таков:

 bysort city mayor (year) : gen rollavg = sum(growth) / sum(growth < .) if mayor != "" amp; growth != .
bysort city mayor (year) : gen year1growth = growth[1]
 

Это работает для большинства данных, но для некоторых городов/мэров Стата возвращает случайные числа:

 city        year    mayor   growth     year1growth  rollavg
Orange      2001    A       9.599998   10345.59     10345.59
Orange      2002    A       14.9       10345.59     5180.245
Orange      2003    A       14.6       10345.59     3458.363
Orange      2004    A       13         10345.59     . 
Orange      2005    B       9          9            9
Orange      2006    B       12.7       9            10.85
Orange      2007    C       18.4       18.4         18.4
Orange      2008    D       20.7       20.7         20.7
Orange      2009    D       16.5       20.7         18.6
Orange      2010    D       12.5       20.7         16.56667
 

Например, это работает для мэра D: рост за 1 год = 20,7, что соответствует темпам роста в его первый 2008 год. Скользящее среднее также работает, 18.6 = (20.7 16.5)/2 и 16.56 = (20.7 16.5 12.5)/3.

Однако цифры совершенно неверны для мэра А.

Кто-нибудь знает, как это исправить?

Комментарии:

1. См stata . вики-теги для получения рекомендаций по приведению примеров данных. В частности, нам нужно знать, видим ли мы метки значений для какой-либо из этих переменных.

Ответ №1:

Я не могу воспроизвести это. Я отмечаю, что ваш пример противоречив, так как имена переменных для вашего примера данных и для ваших результатов не идентичны. (Исправлено в правке исходного вопроса: мой пример данных и результаты совпадают по названиям, но отличаются.)

Мои единственные догадки заключаются в том, что

  1. Существует некоторая путаница в том, что находится в какой переменной в вашем реальном наборе данных.
  2. Хотя вы показываете нам, что выглядит как числовые переменные, некоторые или все эти переменные, возможно, были созданы encode исходной строковой переменной, содержащей числа. Это известный способ производить полный мусор. Совет всегда заключается в том , чтобы использовать destring , а не encode .

if Квалификатор не имеет отношения к данному примеру.

 * Example generated by -dataex-. For more info, type help dataex
clear
input str6 City int Year str1 Mayor double Growth
"Orange" 2001 "A" 9.599998
"Orange" 2002 "A"     14.9
"Orange" 2003 "A"     14.6
"Orange" 2004 "A"       13
"Orange" 2005 "B"        9
"Orange" 2006 "B"     12.7
"Orange" 2007 "C"     18.4
"Orange" 2008 "D"     20.7
"Orange" 2009 "D"     16.5
end

bysort City Mayor (Year) : gen rollavg = sum(Growth) / sum(Growth < .) 
bysort City Mayor (Year) : gen year1growth = Growth[1]


list, sepby(Mayor)

      -------------------------------------------------------- 
     |   City   Year   Mayor     Growth    rollavg   year1g~h |
     |--------------------------------------------------------|
  1. | Orange   2001       A   9.599998   9.599998   9.599998 |
  2. | Orange   2002       A       14.9      12.25   9.599998 |
  3. | Orange   2003       A       14.6   13.03333   9.599998 |
  4. | Orange   2004       A         13     13.025   9.599998 |
     |--------------------------------------------------------|
  5. | Orange   2005       B          9          9          9 |
  6. | Orange   2006       B       12.7      10.85          9 |
     |--------------------------------------------------------|
  7. | Orange   2007       C       18.4       18.4       18.4 |
     |--------------------------------------------------------|
  8. | Orange   2008       D       20.7       20.7       20.7 |
  9. | Orange   2009       D       16.5       18.6       20.7 |
      -------------------------------------------------------- 
 

Комментарии:

1. Извините за путаницу — я просто отредактировал имена переменных, чтобы они были согласованными. В реальном наборе данных мэры кодируются идентификаторами, а не именами, поскольку у некоторых людей одинаковые имена. Поэтому мы присвоили каждому человеку уникальный идентификатор, который является числовым (int). Чтобы использовать groupby, должен ли я преобразовать идентификатор в строку, если в этом проблема?

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

3. Большое спасибо за совет! Ошибка была исправлена… Оказывается, это была ошибка в необработанных данных…