2017-02-28 2 views
1

Ich möchte neue Vorkommen eines neuen agent_type Tag markieren. Ich verwende den folgenden Code, dies zu tun:Egen-Tag überspringt

clear 
input long patid float(how_many_drugs agent_type eventdate) byte tag4 
01 3 4 14962 1 
01 3 5 14962 1 
01 3 4 14997 0 
01 3 9 14997 0 
01 3 5 15025 0 
01 3 9 15040 1 
01 3 4 15040 0 
01 3 5 15082 0 
end 
format %td eventdate 
label values agent_type drugstypes1 
label def drugstypes1 4 "alpha blocker", modify 
label def drugstypes1 5 "ace_inhib", modify 
label def drugstypes1 9 "loop", modify 
label def drugstypes1 13 "CCB", modify 

egen tag4=tag (patid agent_type_new how_many_drugs) 

Der Code funktioniert gut, bis wir das erste Vorkommen von „Schleife“ erreichen, wo ein Tag nicht erzeugt wird. Vielmehr wird das Tag beim zweiten Auftreten von "loop" erzeugt.

Warum passiert das und wie kann ich dafür sorgen, dass beim ersten Auftreten ein Tag erstellt wird?

Ich habe sichergestellt, dass die Daten nach patid event_date vor dem Ausführen des Tags Code sortiert wurden.

Antwort

1

Als ursprüngliche Autor dieser egen Funktion tag(), kann ich auf seine Absicht Kommentar .

Die Absicht ist nicht, erste Vorkommen als solche zu kennzeichnen. Die Absicht ist, nur eines von mehreren Vorkommnissen zu markieren, was für den Benutzer gleichwertig ist.

Wie es passiert, gibt es nur zwei systematische Möglichkeiten, äquivalente Vorkommen zu markieren, um das erste oder das letzte zu markieren. Da Gruppen so klein wie eine Beobachtung sein können, muss jede Regel an so kleinen Gruppen arbeiten. Für Gruppen von eins ist die Auswahl der ersten die gleiche wie die Auswahl der letzten, aber ansonsten ist das nicht so. Ich entschied mich, das erste im ursprünglichen Code zu markieren (längst in offizielle Stata übernommen), aber das ist willkürlich.

Warum also passiert Ihnen das? Die Funktion fühlt sich völlig frei, die Daten vorübergehend neu zu sortieren, wie Blick auf den Code wird Ihnen zeigen:

viewsource _gtag.ado 

Dies ist, was beißt.

Sie möchten die ersten Vorkommen jedes einzelnen Werts für jeden Medikamententyp für jeden Patienten markieren. Das ist eine Zeile, wie unten. Ich verstehe nicht, warum in Ihrem Code verwendet wird.

clear 
input long patid float(how_many_drugs agent_type eventdate) byte tag4 
01 3 4 14962 1 
01 3 5 14962 1 
01 3 4 14997 0 
01 3 9 14997 0 
01 3 5 15025 0 
01 3 9 15040 1 
01 3 4 15040 0 
01 3 5 15082 0 
end 
format %td eventdate 
label values agent_type drugstypes1 
label def drugstypes1 4 "alpha blocker", modify 
label def drugstypes1 5 "ace_inhib", modify 
label def drugstypes1 9 "loop", modify 
label def drugstypes1 13 "CCB", modify 

bysort patid agent_type (eventdate) : gen first = _n == 1 
+0

Danke @NickCox. Du hast recht, das "how_many_drugs" war überflüssig. Vielen Dank für die Erklärung der Funktionsweise hinter dem Egen-Tag – user2363642

+0

Beachten Sie, dass weder die Hilfe für 'gen' noch der manuelle Eintrag erste Vorkommen erwähnt! Vielleicht hatten Sie empirisch beobachtet, dass erste Vorkommen in der Praxis oft solche waren. Die ursprüngliche Diskussion von 1999 in http://www.stata.com/products/stb/journals/stb50.pdf (siehe S.16) diskutiert die Code-Logik wie oben. Auf diesen Artikel wird im Handbuch verwiesen, aber er ist nicht entscheidend für das Verständnis von "esgen". –

+0

Ja, ich habe bemerkt, dass in den meisten Fällen das erste Vorkommen markiert wurde - und dann, als ich versuchte, es auf mehrere verschiedene Arten auszuführen, konnte ich die verschiedenen Tags, die zu unterschiedlichen Zeiten auftraten, nicht zurückverfolgen. Mein Fehler, wenn ich das erste Mal vermutete. Nochmals vielen Dank für den Hinweis auf meinen Fehler. Hoffe, dass jemand anderes auch davon lernt. – user2363642

0

Ich habe mit dieser für eine kleine Weile gespielt, und am Ende aufgegeben egen tag(). Ich konnte nicht verstehen, warum wäre es nicht das erste Vorkommen eines jeden agent_type abholen so stattdessen ich dafür entschieden haben:

bys patid agent_type (eventdate): gen n=_n 
sort patid eventdate 
replace n=0 if n!=1 
+0

Dies entspricht meiner (kürzeren) Lösung. –