我有一些表格的面板数据......
id | amount
-----------
1 | 10
1 | 10
1 | 100
2 | 10
2 | 15
2 | 10
3 | 100
我期待做的事情似乎应该相当简单,但我对Stata的体验有限,而且我习惯于使用类似于C / Java的语言进行编程。基本上,如果他们的任何个人观察超过一定数量,我想放弃一个完整的人(id
)。因此,我要说我将此金额设置为50,我想删除id
1和id
3中的所有观察结果,这样数据就只会包含来自id
的观察结果2.
Java中的伪代码非常简单......
for(int i = 0; i < dataset_length; i++) {
if dataset[i].amount > 50 {
int drop_id = dataset[i].id;
for(int j = 0; j < dataset_length; j++) {
if dataset[j].id == drop_id {
delete observation
}
}
}
}
Stata相当于什么类似的东西?我肯定错过了一些东西并使它变得比它应该的更复杂,但我无法弄明白。
答案 0 :(得分:0)
如果amount
没有遗漏,这只是
bysort id (amount) : drop if amount[_N] > 50
如果有错过,那么
gen ismissing = -missing(amount)
bysort id (ismissing amount): drop if amount[_N] > 50 & amount[_N] < .
将是一种检查,虽然很难看出错失是如何有趣或有用的。
这里的机制(一个引言见here)实际上构建了一个循环标识符,以及每个标识符的观察结果。使用主流编程语言模型的直译可能只会导致代码更长,效率更低。