使用egen total(var)聚合变量的Stata foreach循环,按(级别)

时间:2012-12-02 03:33:25

标签: aggregation stata

假设我有一堆农场数据,以作物水平报告(即为每种作物提供数据)。

每个作物观察属于特定的领域,每个领域属于特定的农场。 (字段和服务器场标识变量包含在数据集中。)

在Stata中,我想将裁剪级别数据汇总到字段级别,然后将字段级别数据汇总到场级别。

因此,对于变量x,从作物到字段级别聚合的基本命令是:

egen x_field = total(x_crop),by(farm,field)

然后汇总到农场级别:

egen x_farm = total(x_field),by(farm)

我需要聚合很多变量,所以我想使用foreach循环,而不是为每个后缀“_field”,“_ farm”重复相同的代码。如果有人能帮助我,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

假设您的egen命令是执行所需操作的最佳方式:

foreach x of varlist var1-var99 {
  di "Processing variable `x'"
  egen `x'_field = total(`x'_crop), by(farm field)
  egen `x'_farm = total(`x'_field), by(farm)
}

循环将覆盖var1var99范围内的每个变量。如果您想以更复杂的方式定义varlist,请查看变量列表的Stata帮助。

编辑:by()字段中不应包含逗号(感谢Nick)。

答案 1 :(得分:0)

我认为Fr.的解决方案效果很好,但这是另一种解决方案。两者都可能非常快,但这种方法不需要显式循环,但内部Stata可能使用一个。

renvars来自SJ(即findit renvars),此功能是Stata 12 +中rename的一部分。

sysuse auto, clear
order rep78 foreign make price

* by one category
tempfile auto_r
preserve
collapse (sum) price-gear_ratio, by(rep78)
renvars price-gear_ratio, postfix(_r)
save `auto_r'
restore

* by two categories
tempfile auto_rf
preserve
collapse (sum) price-gear_ratio, by(rep78 foreign)
renvars price-gear_ratio, postfix(_rf)
save `auto_rf'
restore

* merge back
merge m:1 rep78 using `auto_r', generate(merge_r)
merge m:1 rep78 foreign using `auto_rf', generate(merge_rf)

答案 2 :(得分:0)

如果我理解正确,则无需聚合分为两个阶段。您只需根据服务器场标识符聚合每个裁剪。

类比将是对美国各州内县内人们的观察。如果您想要州总计,则只需要by(state)。要想看到这个,想象一下你扔掉县标识符。您没有丢弃任何所需的信息。

在任何情况下,请注意egen的{​​{1}}功能,该功能旨在标记组中的一个且仅一个观察。