1

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

每个作物观察属于一个特定的田地,每个田地属于一个特定的农场。(田地和农场识别变量包含在数据集中。)

在Stata中,我想将作物级别的数据聚合到田间级别,然后将田间级别的数据聚合到农场级别。

所以对于变量 x,从作物到田间聚合的基本命令是:

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

然后聚合到农场级别:

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

我有很多变量需要聚合,所以我想使用 foreach 循环来执行此操作,而不是为每个后缀“_field”、“_farm”重复相同的代码。如果有人可以在这里帮助我,我将不胜感激。

4

3 回答 3

2

假设你的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)
}

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

编辑:字段中不应有逗号by()(感谢尼克)。

于 2012-12-02T10:19:55.100 回答
0

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

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

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)
于 2012-12-02T21:25:20.923 回答
0

如果我正确理解这一点,则无需将聚合分为两个阶段。您只需要根据农场标识符汇总每种作物。

类似的情况是对美国各州县内人们的观察。如果你想要状态总数,你只需要 work by(state)。要看到这一点,假设您丢弃了县标识符。您没有丢弃任何您需要的信息。

在任何情况下,请注意旨在标记组中的一个且仅一个观察的功能egentag()

于 2012-12-03T00:26:50.383 回答