2016-05-06 26 views
1

ich einige Panel-Daten des Formulars habe ...Dropping ganzes Thema, wenn einzelne Beobachtungskriterien in Paneldaten erfüllen

id | amount 
----------- 
1 | 10 
1 | 10 
1 | 100 
2 | 10 
2 | 15 
2 | 10 
3 | 100 

Was ich suche scheint zu tun, wie es ziemlich einfach sein sollte, aber meine Erfahrung mit Stata ist begrenzt und ich bin es gewohnt, in C/Java ähnlichen Sprachen zu programmieren. Im Wesentlichen möchte ich eine ganze Person (id) fallen lassen, wenn eine ihrer individuellen Beobachtungen jemals eine bestimmte Menge überschreitet. Also lassen Sie uns sagen, dass ich gesetzt, diesen Betrag auf 50, ich will alle Beobachtungen fallen aus id 1 und id 3, so dass die Daten dann nur Beobachtungen enthalten id 2.

Der Pseudo-Code in Java wäre ziemlich einfach ...

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 
     } 
     } 
    } 
} 

Was wäre das Stata-Äquivalent von etwas Ähnlichem? Ich vermisse sicherlich etwas und mache es komplizierter, als es sein sollte, aber ich kann es nicht herausfinden.

Antwort

0

Wenn es keine Missings auf amount sind, ist dies nur

bysort id (amount) : drop if amount[_N] > 50 

Wenn es Missings sind, dann

gen ismissing = -missing(amount) 
bysort id (ismissing amount): drop if amount[_N] > 50 & amount[_N] < . 

eine Art von Kontrolle sein würde, auch wenn es schwer zu sehen ist, wie die Missings konnte interessant oder nützlich sein.

Die Maschine hier (für eine Einführung siehe here) in der Tat baut in einer Schleife über Identifikatoren und über die Beobachtungen für jede Kennung. Eine wörtliche Übersetzung mit Hilfe von Modellen aus gängigen Programmiersprachen könnte nur zu einem längeren und weniger effizienten Code führen.

+0

Super, das hat perfekt funktioniert. Danke auch für das pdf, es hilft mir auf jeden Fall, STATA besser zu verstehen. –