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
的语法。使用关键字 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'
}
一旦有了 tsset
(或 xtset
),就可以毫无顾虑地使用时间序列运算符:正确的排序是自动的,运算符对数据中的差距很聪明(例如从 1982 年开始跳跃到 1984 年的年度数据)。
对于更多变量,循环可以是
foreach x of var <whatever> {
gen `x'_gr = D.`x'/L.`x'
}
其中 <whatever>
可以是一般(数字)varlist。
编辑:自从第一次发布以来,问题发生了变化,并且仅在计算 2010 年至 2011 年的增长率时声明了兴趣,在示例中暗示只有那些年份存在。上面更通用的代码自然仍然适用于计算这些增长率。
我想在 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
的语法。使用关键字 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'
}
一旦有了 tsset
(或 xtset
),就可以毫无顾虑地使用时间序列运算符:正确的排序是自动的,运算符对数据中的差距很聪明(例如从 1982 年开始跳跃到 1984 年的年度数据)。
对于更多变量,循环可以是
foreach x of var <whatever> {
gen `x'_gr = D.`x'/L.`x'
}
其中 <whatever>
可以是一般(数字)varlist。
编辑:自从第一次发布以来,问题发生了变化,并且仅在计算 2010 年至 2011 年的增长率时声明了兴趣,在示例中暗示只有那些年份存在。上面更通用的代码自然仍然适用于计算这些增长率。