如果单个观察符合面板数据中的标准,则放弃整个主题

Dropping entire subject if single observation meets criterion in panel data

我有一些表格的面板数据...

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 中与此类似的东西会是什么?我肯定遗漏了一些东西并使它比应该的更复杂,但我无法弄清楚。

如果 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)实际上构建在标识符循环和每个标识符的观察循环中。使用主流编程语言的模型进行直译只会导致代码更长、效率更低。