首页 > 解决方案 > Stata groupby平均值和第一次观察给出错误的数字

问题描述

我有一个城市年级别的面板数据,如下所示:

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 != "" & growth != .
bysort city mayor (year) : gen year1growth = growth[1]

它适用于大多数数据,但对于某些城市/市长,Stata 返回随机数:

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:Year1Growth = 20.7,这是他 2008 年第一年的增长率。滚动平均值也适用,18.6 = (20.7+16.5)/2 和 16.56 = (20.7+16.5+12.5)/3。

然而,市长 A 的数字完全错误。

有谁知道如何解决这一问题?

标签: stata

解决方案


我无法重现这个。我注意到您的示例不一致,因为您的数据示例和结果的变量名称不相同。(在对原始问题的编辑中更正:我的数据示例和结果名称一致,但不同。)

我唯一的猜测是

  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 |
     +--------------------------------------------------------+

推荐阅读