我想为具有相同ID的观测值计算Stata中的增长率。我的数据以简化的方式看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
现在,我想根据2010年到2011年的变量af为每个ID增长率计算:
例如对于ID 10和变量a,它将是:(3-2)/ 2,对于变量b:(5-4)/ 4等,并将结果存储在新变量中(例如,growth_a,growth_b等)。
由于我有超过12万个观测值和约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]
}
Run Code Online (Sandbox Code Playgroud)
仅供参考:变量af是数字。
但是Stata说:“找不到本地”,我不确定代码是否正确。我还必须先排序一年吗?
具体错误
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]
}
Run Code Online (Sandbox Code Playgroud)
是的语法中的错误,在您先前使用本地宏的情况下foreach,此处的语法类似于foreach x of local variables。使用关键字in,从字面上看foreach单词,local然后在其中查找具有该名称的变量:因此出现错误消息。这是基本foreach语法:请参见其帮助。
由于其他原因,此代码有问题。
排序ID不保证正确的排序顺序,这里year是每个不同的时间顺序ID。如果观察ID结果混杂在中,结果将是垃圾。
该代码假定所有时间值都存在。否则,观察之间的时间间隔可能不相等。
获得增长率的一种更清洁的方法是
tsset ID year
foreach x in a b c d e f {
gen `x'_gr = D.`x'/L.`x'
}
Run Code Online (Sandbox Code Playgroud)
一旦有了tsset(或xtset)时间序列运算符,就可以不用担心:正确的排序是自动进行的,并且运算符对数据中的空白很聪明(例如,年度数据从1982年跳到1984年)。
对于更多变量,循环可能是
foreach x of var <whatever> {
gen `x'_gr = D.`x'/L.`x'
}
Run Code Online (Sandbox Code Playgroud)
那里<whatever>可能是一个普通的(数字)变量列表。
编辑:自首次发布以来,问题已经改变,并且仅在计算2010年至2011年的增长率时才宣布有兴趣,这暗示着仅存在那些年份的示例。上面更通用的代码自然仍然可以计算这些增长率。