Stata:计算具有相同ID的观察值的增长率

Stata: calculating growth rates for observations with same ID

我想在 Stata 中计算具有相同 ID 的观察值的增长率。我的数据以简化的方式看起来像这样:

ID    year   a   b   c   d   e   f
10    2010   2   4   9   8   4   2
10    2011   3   5   4   6   5   4
220   2010   1   6   11  14  2   5
220   2011   6   2   12  10  5   4    
334   2010   4   5   4   6   1   4
334   2011   5   5   4   4   3   2

现在我想从 2010 年到 2011 年的变量 a-f 计算每个 ID 的增长率:

例如 ID 10 和变量 a 它将是:(3-2)/2,对于变量 b: (5-4)/4 等并将结果存储在新变量中(例如 growth_a, growth_b等)。

由于我有超过 120k 个观察值和大约 300 个变量,是否有有效的方法(循环)?

我的代码如下所示(经过简化):

local variables "a b c d e f"
foreach x in local variables { 
bys ID: g `x'_gr = (`x'[_n]-`x'[_n-1])/`x'[_n-1]
}

仅供参考:变量 a-f 是数字。

但是 Stata 说:'local not found' 而且我不确定代码是否正确。我还必须先按年份排序吗?

具体错误在

local variables "a b c d e f"
foreach x in local variables { 
    bys ID: g `x'_gr = (`x'[_n]-`x'[_n-1])/`x'[_n-1]
}

foreach 语法中的一个错误,鉴于您之前使用了本地宏,此处应使用类似 foreach x of local variables 的语法。使用关键字 inforeach 按字面意思理解单词 local 并在此处查找具有该名称的变量:因此出现错误消息。这是基本的 foreach 语法:查看它的帮助。

由于其他原因,此代码存在问题。

  1. ID 上排序并不能保证正确的排序顺序,这里是按 year 对每个不同的 ID 进行时间排序。如果观察在 ID 内混乱,结果将是垃圾。

  2. 代码假定所有时间值都存在;否则观察之间的时间间隔可能不相等。

获得增长率的更简洁的方法是

tsset ID year 
foreach x in a b c d e f { 
    gen `x'_gr = D.`x'/L.`x' 
} 

一旦有了 tsset(或 xtset),就可以毫无顾虑地使用时间序列运算符:正确的排序是自动的,运算符对数据中的差距很聪明(例如从 1982 年开始跳跃到 1984 年的年度数据)。

对于更多变量,循环可以是

foreach x of var <whatever> { 
    gen `x'_gr = D.`x'/L.`x' 
} 

其中 <whatever> 可以是一般(数字)varlist。

编辑:自从第一次发布以来,问题发生了变化,并且仅在计算 2010 年至 2011 年的增长率时声明了兴趣,在示例中暗示只有那些年份存在。上面更通用的代码自然仍然适用于计算这些增长率。