Friday, 10 March 2017

Anzeige Lokal In Stata Forex

Stata Programming Essentials Ever benötigt, um die gleiche Sache, um zehn verschiedene Variablen und wünschte, dass Sie didnt haben, um es zu schreiben zehn Mal Wenn ja, dann ist dieser Artikel für Sie. Wenn nicht, irgendwann werden Sie8212so Sie vielleicht auch lesen weiterlesen. Stata hat alle Werkzeuge erforderlich, um sehr anspruchsvolle Programme schreiben, aber das Wissen nur ein paar von ihnen ermöglicht es Ihnen, jeden Tag machen Dateien kürzer und effizienter zu machen. Dieser Artikel konzentriert sich auf die Programmierung Werkzeuge, die in unserer Erfahrung, wer Stata schwer verwendet wird schließlich lernen wollen. Um von diesem Artikel profitieren youll brauchen ein solides Verständnis der grundlegenden Stata-Syntax, wie Sie von unserer Stata for Researchers-Serie erhalten können. Die primäre Zielgruppe ist Stata Benutzer ohne andere Programmierkenntnisse. Wenn Sie eine Menge von Stata-Programmierung bereits getan haben und suchen, um Ihre Quotebag von Tricksquot auschecken Stata Programming Tools erweitern. Dieser Artikel ist am besten am Computer mit Stata laufen zu lesen. Wenn Sie die Befehle in den Beispielen selbst eingeben, können Sie alle Details merken und beibehalten und sich darauf vorbereiten, Ihren eigenen Code zu schreiben. Ein Stata-Makro ist ein Feld, in dem Sie Text eingegeben haben. Anschließend verwenden Sie in den folgenden Befehlen was in der Box steht. (Der reale Trick erhält einen einzelnen Befehl, um mehrfach mit einem anderen Bit des Textes in der Kiste jedes Mal laufen zu lassen - gut erhalten dort). Die Makros gut verwenden sind quotlocalquot Makros. Wenn Sie mit globalen und lokalen Variablen aus anderen Sprachen vertraut sind, sind lokale lokale Makros lokal auf die gleiche Weise lokal. Wenn nicht, vertrauen Sie uns nur, dass lokale Makros die richtigen sind zu verwenden. Der Befehl zum Definieren eines lokalen Makros lautet: local name value Hier wird ein lokales Makro mit dem Namen x erstellt und das Zeichen 1 eingefügt (nicht der Wert 1 wie in der Quotoneinheit rechts von null auf der Zahl linequot). Um einen Makro zu verwenden, setzen Sie seinen Namen in einen Befehl, der von einem bestimmten Satz von Anführungszeichen umgeben ist: Das Zitat vor dem x ist das linke einfache Zitat. Es befindet sich in der oberen linken Ecke der Tastatur, unter der Tilde (). Das Zitat nach dem x ist das richtige einfache Anführungszeichen. Er befindet sich unter dem doppelten Anführungszeichen (auf der rechten Seite der Tastatur). Makros werden von einem Makroprozessor behandelt, der Befehle prüft, bevor sie an die eigentliche Stata übergeben werden. Wenn es ein Makro sieht (gekennzeichnet durch diese bestimmte Menge von Anführungszeichen), ersetzt es das Makro mit seiner Tabelle. Also, was Stata richtig sah, war: Jetzt versuchen Sie ein etwas komplizierter Makro: lokales x 22 display x Das Ergebnis ist 4. aber das ist, weil die Anzeige Befehl wie ein Taschenrechner wirkt. Der Befehl Stata sah war: so beurteilte er 22 und gab Ihnen die Antwort. Wenn Sie wollen, dass die Anzeige etwas auf dem Bildschirm ohne es zu bewerten, legen Sie es in Anführungszeichen. Dann Display behandelt es wie eine Zeichenfolge. Gibt das Ergebnis 22. Aber was geschehen, bevor Sie es in Anführungszeichen: Ihr Makro enthielt eine Arbeitsgruppe von Stata-Code, die Stata glücklich ausgeführt, wenn Sie es verwendet. In der Tat Stata richtige didnt wissen oder Pflege, dass 22 aus einem Makro kam. Mit dieser Funktion können Sie Makros absolut überall verwenden, sogar in Makrodefinitionen. Speichern von Ergebnissen in Makros Wenn Sie das Ergebnis einer Berechnung in einen Makro einfügen möchten, setzen Sie ein Gleichheitszeichen nach dem Makronamen: local x22 display quotxquot Wenn der lokale Befehl ein Gleichheitszeichen enthält, bewertet Stata, was folgt, bevor er es in den Makro. Nun x enthält wirklich 4 und nicht 22, egal wie Sie es anzeigen. Makroausdrücke Statas-Makroprozessor kann Stata-Ausdrücke auswerten, d. h. jede Formel, die Sie nach dem Gleichheitszeichen in einem Generierungs - oder Ersetzungsbefehl (aber nicht in egen) eintragen können. Die Syntax lautet: wobei expression der auszuwertende Ausdruck ist. Versuchen Sie: Das Ergebnis ist 4. aber Anzeige didnt es berechnen (die Anführungszeichen verhindern, dass). Stattdessen sagte das Gleichheitszeichen vor 22, dass der Makroprozessor diesen Ausdruck auswertet und das Ergebnis in den Code einfügte, also was Stata richtig sah, war display4quot. Eine andere allgemeine Verwendung ist N., die die Anzahl der Beobachtungen in dem aktuellen Datensatz sein wird (und kann an Orten verwendet werden, bei denen N von selbst nicht geeignet ist). Makroausdrücke - und Makros im Allgemeinen - können andere Makros enthalten. Versuchen: Dies teilt dem Makroprozessor mit, dass er vom Wert des Makros x subtrahiert und dann das Ergebnis in den Code platziert. Das kann sehr nützlich sein: Wenn Sie beispielsweise ein Makrojahr mit dem aktuellen Jahr hatten, wäre das Jahr-1 das Jahr vor dem laufenden Jahr. Undefinierte Makros Leider wird mit Hilfe eines Makros, die Sie nicht definiert haben, eine Fehlermeldung generiert. Statas Makro-Prozessor ersetzt es nur mit nichts: Gibt das gleiche Ergebnis wie: Dies kann Kopfschmerzen verursachen: Wenn Sie einen Makro-Namen falsch youll wahrscheinlich erhalten einen generischen Syntaxfehler ohne Angabe, dass ein Makro die Ursache des Problems ist. Noch schlimmer, in einigen Fällen wird der Befehl noch funktionieren, aber geben falsche Ergebnisse. Seien Sie sehr vorsichtig, um die Namen der Makros richtig. Einige Verwendungen für Makros Außerhalb der Schleifen Der Hauptgrund für das Erlernen von Makros ist, so dass Sie sie in Schleifen verwenden können. Aber es gibt Zeiten, wenn mit ihnen alle von ihnen können komplexe Code leichter zu lesen. Angenommen, Sie müssen eine große Anzahl von Regressionen verschiedener Typen ausführen, aber alle enthalten einen festen Satz von Steuervariablen. Betrachten Sie die Liste der Steuervariablen in einem Makro: local controlVars Alter Geschlecht Besetzung Standort maritalStatus hasChildren Dies wird die Regressionsbefehle kürzer machen: reg Einkommen Bildung controlVars Logit verwendet Bildung controlVars Nun nehmen Sie an, dass Sie häufig mit Teilproben Ihres Datensatzes arbeiten. Sie können auch Makros für sie zu definieren: lokale blackWoman race1 amp weiblichen lokalen hispMan race2 amp weiblichen reg Einkommen Ausbildung controlVars wenn blackWoman logit eingesetzt Bildung controlVars wenn hispMan Der Punkt hier ist nicht, Tastenanschläge zu speichern, sondern um den Code klarer. Mit Makros versteckt sich die Details dessen, was die Kontrollvariablen sind oder wie eine schwarze Frau in diesem Datensatz identifiziert werden kann und hilft Ihnen konzentrieren, was Sie versuchen zu tun. Nicht mit der Eingabe dieser Details jedes Mal entfernt auch eine Chance für Fehler. Sie können auch Änderungen schneller vornehmen: Wenn Sie eine Steuervariable hinzufügen müssen, müssen Sie sie nur der Definition des controlVars-Makros hinzufügen, anstatt sie jedem Regressionsbefehl hinzuzufügen. Saving Tastatureingaben ist ein schöner Nebeneffekt, aber widerstehen Sie der Versuchung, um Ihren Code weniger klar in den Namen machen es kürzer. Ein paar Minuten, um klaren Code eingeben ist viel effizienter als stundenlang zu debuggen Code, der kurz aber schwer zu verstehen ist. Eine foreach-Schleife nimmt eine Liste und führt dann einen Befehl oder Satz von Befehlen für jedes Element der Liste aus. Das Element, das gerade bearbeitet wird, wird in einem Makro gespeichert, so dass Sie es in den Befehlen verweisen können. Die Liste, die durchlaufen werden soll, kann eine generische Liste sein, die Text enthält, oder es gibt mehrere Arten von strukturierten Listen (gut nur diskutieren, varlists). Die Syntax für eine foreach-Schleife mit einer generischen Liste ist: foreach-Makro in Listenbefehl (en) Als ein sehr einfaches Beispiel: foreach-Farbe in rot-blau-grünes display quotcolorquot Hier ist color der Name des Makros, das die Listenelemente enthält. Rot blau grün ist die Liste selbst. Stata bricht die Liste in Elemente, wo sie Räume sieht, so dass diese Liste drei Elemente enthält: rot. Blau und Grün. Die linke lockige Klammer () markiert das Ende der Schleife und muss auf ihre eigene Linie gehen. Wenn Sie dies in interaktiven Stata eingeben, fügt das Ergebnisfenster Zeilennummern für die Befehle in der Schleife hinzu, aber Sie müssen sie nicht eingeben. Beachten Sie, wie nichts tatsächlich ausgeführt wird, bis Sie die richtige geschweifte Klammer eingeben, und dann führt Stata die ganze Sache. Wenn es youll erhalten die folgende Ausgabe: Stata beginnt mit der Analyse Ihrer Liste und die Identifizierung der Elemente enthält. Es setzt dann das erste Element (rot) in das Schleifen-Makro (Farbe) und führt den Befehl in der Schleife aus. Angesichts der Tabellen der Farbe. Wird der Befehl zur Anzeige quotredquot und rot auf dem Bildschirm gedruckt. Stata stellt dann das zweite Element in das Makro und führt den Befehl erneut aus und druckt blau auf dem Bildschirm. Es wiederholt dann den Prozess für grün. Und wenn dies der Fall ist, erkennt Stata, dass die Liste aus Elementen besteht und die foreach-Schleife abgeschlossen ist. In diesem Artikel youll sehen, dass Befehle, die innerhalb einer Schleife sind eingerückt. Dies macht die Schleifen Struktur visuell offensichtlich und wir empfehlen Ihnen das gleiche tun, wenn Sie schreiben Dateien. Alles, was Sie tun müssen, ist, drücken Sie Tab, bevor Sie die erste Zeile der Schleife beginnen. Statas do-Datei-Editor und alle anderen Texteditor für die Programmierung indent nachfolgenden Zeilen automatisch. (Sie brauchen keine Sorgen um Einrückungen, wenn Sie interaktiv arbeiten, aber in echter Arbeit ist es sehr selten, Schleifen interaktiv zu benutzen.) Sie können eine generische Liste verwenden, um viele verschiedene Arten von Dingen zu durchlaufen: Variablen, Werte, Dateien, Unterabtastungen, Alles, was Sie mit Text beschreiben können. Wenn ein Element Leerzeichen enthalten muss, muss es in Anführungszeichen gesetzt werden. Looping über Variablen Die häufigste Sache zu loop over ist Variablen. Angenommen, Sie wollten mehrere abhängige Variablen auf dieselben unabhängigen Variablen zurückrechnen. Der folgende Code tut dies, mit dem Automobil-Beispiel-Datensatz, der mit Stata kommt: sysuse auto foreach yvar in mpg Preisverschiebung reg yvar Fremdgewicht Looping über Teile von variablen Namen Betrachten Sie den folgenden Datensatz: Es enthält eine fiktive (und nicht schrecklich plausibel ) Datensatz von Personen und deren Einkommen über zwölf Monate. Dies sind Panel-Daten in der breiten Form, so gibt es zwölf Einkommen Variablen: incJan. IncFeb. IncMar Etc. Angenommen, Sie möchten einen entsprechenden Satz von Indikatorvariablen für die Person, die Einkommen in diesem Monat hatte. Das Erstellen einer von ihnen ist einfach: gen hadIncJan (incJangt0), wenn incJanlt. Aber die Schaffung aller zwölf in der gleichen Weise wäre mühsam. (Wenn Sie überprüft haben, finden Sie, dass dieser Datensatz keine fehlenden Werte enthält, so dass sie ausgeschlossen sind, wenn incJanlt nicht unbedingt erforderlich ist.) Es ist eine Erinnerung, immer über fehlende Werte beim Erstellen solcher Indikatorvariablen nachzudenken.) Sie können alle erstellen Zwölf Indikatorvariablen schnell und einfach mit einer foreach-Schleife: foreach month in Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez Gen hadIncmonth (incmonthgt0) if incmonthlt. Dies richtet eine generische Liste mit den Monaten ein und verwendet dann diese Monate als Teile von Variablennamen. Beachten Sie den Prozess, mit dem wir diese Schleife erstellt haben: Zuerst haben wir den Befehl wed für ein einzelnes Element der Liste herausgefunden und dann geändert, um Makros zu verwenden. Dies ist eine gute Angewohnheit, wenn Sie brauchen, um nicht-trivialen Code mit Makros zu schreiben. Looping über Varlists Während generische Listen Variablennamen enthalten können, müssen Sie alle Namen einzeln eingeben. Wenn Sie sagen, dass die Liste, die Sie umschleifen möchten, eine offizielle Stata-Liste ist, können Sie Standard-Variablenkürzel verwenden, wie zB x für alle Variablen, die mit x und x-z für alle Variablen von x bis z beginnen. Um die varlist-Syntax zu überprüfen, lesen Sie den entsprechenden Abschnitt in Stata for Researchers. Die Syntax für eine foreach-Schleife über eine varlist lautet wie folgt: foreach - Makro von varlist vars Beachten Sie, dass während die foreach-Syntax für eine generische Liste in enthält, die die Syntax für eine strukturierte Liste hat. Stata verwendet die in oder von zu bestimmen, ob das nächste Wort das erste Element der Liste oder eine Art von Liste ist. Forscher erhalten gelegentlich Datensätze, die in anderen Programmen erstellt wurden, wobei die Variablennamen in Großbuchstaben geschrieben sind. Da sich Stata tatsächlich um den Fall kümmert, können Variablennamen für Großbuchstaben mühsam sein. Stata hat vor kurzem den Umbenennungsbefehl die Möglichkeit gegeben, Namen in Kleinbuchstaben umzuwandeln: Aber das ist ein großartiges Beispiel, das es mit einer foreach-Schleife über eine Varliste tun kann: foreach oldname von varlist lokales newnamelower (quotoldnamequot) umbenennen oldname newname Das asterisk () Alle von selbst übereinstimmt alle Variablen, so dass die Liste foreach ist, um Schleife enthält alle Variablen in den aktuellen Datensatz. Die Funktion lower () nimmt einen String, in diesem Fall die Tabellen des Makro-alten Namens. Und wandelt es in Kleinbuchstaben um. Beachten Sie die Verwendung des Gleichheitszeichens im lokalen Befehl, der newname definiert. So dass der untere (quototnamequot) ausgewertet und das Ergebnis gespeichert wird. Looping over Numbers Eine forvalues ​​Schleife (häufig abgekürzt forval) Schleifen über Zahlen. Anstatt eine Liste zu definieren, definieren Sie einen Bereich von Zahlen. Der mit Abstand am weitesten verbreitete Bereich besteht aus einer Startnummer und einer Endnummer, und Stata geht davon aus, dass sie von einer zwischen ihnen zählen sollte. Die Syntax ist einfach: forvalues ​​macro start end forvalues ​​i15 display i gibt die Ausgabe an: Wenn Sie auf andere Weise zählen müssen, geben Sie help forvalues ​​ein, um weitere Optionen anzuzeigen. Betrachten Sie den folgenden Datensatz: Dieser Datensatz ist sehr ähnlich zu den Datensätzen der monatlichen Einnahmen, die wir früher untersucht haben, aber es enthält jährliche Einkommen von 1990 bis 2010. Ihre Aufgabe ist es wieder, einen Indikator für die Frage, ob eine Person Einkommen in einer Jahr. Das Verwenden von forvalues ​​ist sehr einfach: forvalues ​​Jahr19902010 gen hadIncyear (incyeargt0) wenn incyearlt. Dies wäre schwieriger, wenn die Jahre nicht das Jahrhundert (dh 90 statt 1990) enthalten, weil Stata denkt, 100 sollte nach 99 und nicht 00 kommen. Wenn Ihre Daten solche Jahre beinhalten, erwägen, das Jahrhundert hinzufügen, bevor Sie irgendwelche ernsthafte Arbeit mit ihm . Looping über Werte und Pegel von Manchmal müssen Sie Schleife über die Werte, die eine bestimmte Variable übernimmt. Betrachten Sie den folgenden Datensatz: Dieser enthält Daten über die Rasse, Einkommen, Alter und Bildung Kategorie einer Reihe von fiktiven Menschen. Angenommen, Sie wollen das Einkommen auf Alter und Bildung zurückrechnen. Aber glauben, dass die Auswirkungen von Alter und Bildung für Menschen unterschiedlicher Rassen unterschiedlich sein können. Ein Ansatz (wahrscheinlich nicht der beste) wäre, eine separate Regression für die Menschen in jedem Rennen laufen. Normalerweise können Sie dies tun mit: nach Rasse: Regress Einkommen Alter i. education (Die Konstruktion i. education erzählt Stata, dass Bildung ein Faktor oder kategorische Variable ist und sollte in eine Reihe von Indikatoren umgewandelt werden. Siehe Abschnitt über Faktor-Variablen in Stata Für Forscher, wenn youd gerne Faktor variable Syntax zu überprüfen.) Dies ist jedoch fiktive Umfrage Daten und Sie müssen für die Umfrage Design in laufenden Regressionen zu korrigieren. Wenn Sie mit Statas-Befragungsbefehlen nicht vertraut sind, bedeutet dies: Das Übersichtsdesign wird mit dem Befehl svyset (survey set) beschrieben. Dieser Datensatz hat primäre Abtasteinheiten, die durch die variablen psu und Wahrscheinlichkeitsgewichte gegeben werden, die durch das variable Gewicht gegeben werden. Der entsprechende Befehl svyset Befehl (der bereits ausgeführt wurde, so dass Sie nicht brauchen) ist: svyset psu pweightweight Um Stata für diese Gewichte in Schätzung Befehle korrigieren, fügen Sie die svy: Präfix, zum Beispiel: svy: Regress Einkommen Alter i. education Sie können den Standard nicht verwenden, wenn Syntax mit Umfragedaten oder die Gewichte nicht korrekt angewendet werden. Verwenden Sie stattdessen die Option subpop () von svy. Zum Beispiel: svy, subpop (wenn race1): regress Einkommen Alter i. education durch: kann nicht mit svy verwendet werden: Punkt 4 bedeutet, dass Sie nicht Ihre Rückbildung für alle Rennen mit verwenden können. Aber Sie können es mit einer Schleife tun. Alle von: tut ist die Werte der Rasse zu identifizieren und dann Schleife über sie, und an dieser Stelle wissen Sie, wie Sie das selbst tun (obwohl durch: ist schneller, wenn Sie es verwenden können). Die Rennvariable nimmt die Werte eins, zwei und drei an, so dass eine geeignete Schleife ist: forvalues ​​race13 svy, subpop (wenn racerace): reg Einkommen Alter i. education Was wäre, wenn Sie hatten ein viertes Rennen, und seine Zahl waren neun (quotOtherquot ) Anstatt vier Sie konnten es einfach recode und machen es vier. Aber wenn das nicht eine gute Idee für Ihr Projekt ist, müssen Sie auf die weniger strukturierte foreach Schleife umschalten: foreach Rennen in 1 2 3 9 svy, subpop (wenn racerace): Reg Einkommen Alter i. education Auf der anderen Seite ist es nicht Ungewöhnlich, um über Dutzende oder sogar Hunderte von Werten Schleife, oder nicht vor der Zeit wissen, welche Werte eine Variable übernimmt. In diesem Fall können Sie die Ebenen des Befehls identifizieren sie für Sie und legte sie in einem Makro. Die Syntax ist: levelsof Variable. Lokal (Rennen) werden alle Werte des variablen Rennens aufgelistet und in einem Makro namens Rassen gespeichert. Sie können dann alle Schleifen über: foreach Rennen in Rennen svy, subpop (wenn racerace): Reg Einkommen Alter i. education Allerdings ist diese Situation häufig genug, dass Stata spezielle Code für das Parsen von Makros in Listen für Looping. Die Syntax ist: foreach Rennen der lokalen Rennen svy, subpop (wenn Rennfahrer): Reg Einkommen Alter i. education Beachten Sie, dass Rennen nicht in den üblichen Makro-Anführungszeichen: der ganze Punkt dieser Konstruktion ist, den regulären Makroprozessor zu Gunsten von zu umgehen Code, der im Rahmen von Schleifen schneller ist. Es macht einen sehr kleinen Unterschied, aber wenn Sie genug Looping wird es addieren. Eine Funktion youll vermissen von durch: ist der Text in der Ausgabe, die Ihnen erklärt, welche durch Gruppe zurzeit bearbeitet wird, aber Sie können es selbst addieren. Die folgende Version der Schleife fügt einen Anzeigebefehl hinzu, der zwei leere Zeilen einfügt und dann den aktuellen Wert des Race-Makros druckt, bevor die Regression ausgeführt wird: foreach Rennen der lokalen Rassen display newline (2) quotRaceracequot svy, subpop (wenn racerace): reg Einkommen Alter i. education Mit Display, um den Wert eines Makros an einem bestimmten Punkt in Ihrem Programm ausdrucken ist auch ein sehr nützliches Werkzeug für das Debuggen. Denken Sie daran, dass dies nur ein Beispiel war. Ein besserer Weg, um den Effekt der Rasse zu untersuchen, wäre wahrscheinlich das Zusammenspiel von Rasse mit den anderen Variablen. Die neue Syntax für Faktorvariablen und Interaktionen macht dies sehr einfach: svy: regress income i. race (c. age i. education) Dieses Modell enthält alle Vorgängermodelle - wenn Sie neu in Regressionen sind, die Interaktionen beinhalten und herausgefunden haben, warum das so ist Ist vielleicht eine gute Übung. Verschachtelte Schleifen Die Befehle, die in einer Schleife enthalten sind, können andere Schleifen enthalten: Dieser Code erzeugt die folgende Ausgabe: Die innere Schleife (diejenige, die j verwendet) wird dreimal einmal für jeden Wert von i ausgeführt. Somit läuft der Anzeigebefehl insgesamt neunmal. Beachten Sie, wie der Anzeigebefehl zweimal eingerückt wird: einmal, weil er Teil der i-Schleife ist und einmal, weil er Teil der Schleife ist. Wenn Sie mit verschachtelten Schleifen arbeiten, ist es noch wichtiger, dass Sie leicht sagen, was jede Schleife enthält. Betrachten Sie einen endgültigen Datensatz: Dieser enthält monatliche Einkommensdaten, aber für den Zeitraum 1990-2010. Die Variablennamen sind in der Form incJan1990. IncFeb1990. Etc. Um einen Satz von entsprechenden Indikatoren zu erzeugen, müssen Sie sowohl die Monate als auch die Jahre durchschleifen: forval Jahr19902010 foreach month in Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez Gen hadIncmonthyear (incmonthyeargt0) if incmonthyearlt. Dies ist sicherlich praktikabel, aber etwas umständlich. Es wäre besonders umständlich, wenn Sie Interesse an Verzögerungen, Leads oder Änderungen im Laufe der Zeit: youd benötigen Code zu sagen, Stata, dass der Monat vor Januar 1991 Dezember 1990. Für die meisten Zwecke ist es einfacher, wenn Zeiträume sind einfach nummeriert sequentiell. In diesem Fall Januar 1990 wäre Zeitraum 1, Dezember 1990 wäre Zeitraum 12 und Januar 1991 Zeitraum 13. Glücklicherweise ist es ziemlich einfach zu wechseln: lokaler Zeitraum 1 forval Jahr19902010 foreach Monat in Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez umbenennen Incmonthyear incperiod umbenennung hadIncmonthyear hadIncperiod local periodperiod1 Die Makroperiode wird als Zähler verwendet. Es beginnt auf 1 gesetzt und damit, wie die verschachtelten Schleifen beginnen incJan1990 wird umbenannt inc1 (und ähnlich hadIncJan1990 zu hadInc1). Der Befehl Lokalperiodenperiode 1 erhöht die Periode um Eins: Sobald der Makroprozessor damit fertig ist, sieht Stata die lokale Periode11. Das vervollständigt die innere Schleife, also wird der Monat zu Feb. geändert und incFeb1990 wird in inc2 umbenannt. Das Periodenmakro wird wieder erhöht (die eigentliche Stata sieht nun die lokale Periode21), der Monat wird auf Mar gesetzt. IncMar1990 wird in inc3 umbenannt. Und so weiter, bis alle 252 Monate konvertiert werden. (Beachten Sie, dass 1990 bis 2010 einschließlich ist 21 Jahre.) Bei dieser Konvertierung verlieren Sie die Fähigkeit, eine Variable zu sehen und wissen sofort, was Kalendermonat es beschreibt. Aber es ist viel einfacher zu schleifen. Die verschachtelten Schleifen können ersetzt werden durch: Die Bedeutung von Namenskonventionen Der Variablenname incJan1990 enthält drei Komponenten: das Ding (Einkommen) und den Monat und das Jahr, in dem es beobachtet wird. Die von uns geschriebenen Schleifen hängen von den Variablennamen ab, die alle drei in einer konsistenten Weise beschreiben: Sie würden fehlschlagen, wenn der Datensatz incJan1990 zusammen mit incomeJan1991 enthielt. Incjan1992. IncJanuary1993 oder incJan94. In der realen Welt sind solche Dinge nicht ungewöhnlich. Datensätze aus Erhebungen sind eine besondere Herausforderung, weil ihre Variablennamen oft aus der Form des Fragebogens und nicht aus den darin enthaltenen Informationen stammen. Die Zeit zu nehmen, um Ihre Variablen in einer Weise umzubenennen, die sinnvoll zu Ihnen ist, ist eine gute Idee am Anfang jedes mögliches Projektes, aber, wenn youll unter Verwendung der Schleifen sein lebenswichtig ist, die Sie verursachen und eine konsistente Benennungskonvention für Variablen anwenden. Vorteile von Statas Automatische Loops Nun, da youve gelernt, wie man Loops verwenden, kann es verlockend sein, sie für alles zu verwenden. Denken Sie daran, dass die meisten Stata-Befehle bereits Loops (etwas zur Beobachtung ein, dann tun es zur Beobachtung zwei, etc.) und diese Schleifen sind viel schneller als jede foreach oder forvalues ​​Schleife. Beispielsweise verwenden die folgenden Werte für Werte, um alle Beobachtungen im Datensatz zu durchlaufen und den Wert von y für jede Beobachtung auf den Wert von x für diese Beobachtung zu setzen: gen y. Forvalues ​​i1N ersetzen yxi wenn ni aber youll erhalten die exakt gleiche Ergebnis weit schneller und einfach mit: Gelegentlich findet jemand eine Aufgabe, die wirklich erfordert explizite Schleife über Beobachtungen, aber seine seltene. Clever Programmierung kann manchmal andere Schleifen in die Standardschleife über Beobachtungen, machen foreach oder forvalues ​​unnötig. Beispielsweise wird die Neugestaltung von breiten Formpaneldaten in eine lange Form die Notwendigkeit für viele Schleifen eliminieren. Gehen Sie zurück zu den ursprünglichen 12 Monaten der Einkommensdaten: Erinnern Sie sich, dass wir hadInc Indikatorvariablen mit der folgenden Schleife erstellt haben: foreach month in Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez Gen hadIncmonth (incmonthgt0) if incmonthlt. Allerdings erhalten youll die gleichen Ergebnisse mit den folgenden: reshape lange inc, i (id) j (Monat) string gen hadInc (incgt0) if inclt. Umformung eines großen Datensatzes ist zeitaufwendig, also schalten Sie nicht zwischen breiter Form und langer Form leicht um. Aber wenn Sie einen Block von Dingen, die Sie tun müssen, die leichter in langer Form zu tun wäre zu identifizieren, kann es wert sein, Umgestaltung am Anfang und Ende dieses Blocks. Letzte Änderung: 2272012Stata Programming Tools Dieser Artikel stellt Ihnen viele Stata-Programmierungstools vor, die nicht von allen benötigt werden, aber unter bestimmten Umständen sehr nützlich sind. Die Zielgruppe sind Stata-Veteranen, die mit Stata-Syntax und fundamentalen Programmierwerkzeugen wie Makros, foreach und forvalues ​​bereits vertraut und komfortabel vertraut sind. Wenn Sie neu in Stata sind, wird unsere Stata for Researchers Ihnen grundlegende Stata-Syntax, und Stata Programming Essentials lehren Sie die grundlegenden Programmierungstools. Im Gegensatz zu diesem Artikel, sie nicht davon ausgehen, alle Stata oder allgemeine Programmierkenntnisse. Themen, die in diesem Artikel behandelt werden, sind: Wenn Sie über ein bestimmtes Thema lernen müssen, fühlen Sie sich frei, es zu überspringen. Einige der Beispiele verwenden das zuvor abgedeckte Material (d. h. ein Programm, das eine Verzweigung enthält), aber die Erläuterungen sind in sich abgeschlossen. Zusammengesetzte doppelte Anführungszeichen Der Anfang und das Ende einer Zeichenfolge werden normalerweise durch doppelte Anführungszeichen (quotstringquot) gekennzeichnet. Dies führt zu Problemen, wenn die Zeichenfolge selbst doppelte Anführungszeichen enthält. Wenn Sie zum Beispiel die Zeichenfolge Hamlet anzeigen wollten, die quotTo sein oder nicht be. quot, konnten Sie den Code nicht verwenden: display quotHamlet sagte quotTo sein oder nicht be. quotquot Die Lösung ist, was Stata zusammengesetzte doppelte Anführungszeichen nennt. Wenn Stata Zitat (linke Anführungszeichen, gefolgt von einem doppelten Anführungszeichen) sieht, behandelt es das, was als Zeichenfolge folgt, bis es "(doppeltes Anführungszeichen, gefolgt von einem rechten einfachen Anführungszeichen) sieht. So: display quotHamlet sagte quotTo be, oder nicht be. quotquot Bei Gelegenheit kann man erwarten, dass ein Befehl, um einen Fehler zu generieren, unter bestimmten Umständen aber wählen, es zu ignorieren. Beispielsweise verhindert das Setzen der Protokolldatei am Anfang einer do-Datei, dass ein zuvor geöffnetes Protokoll Ihre Do-Datei beeinträchtigt, aber es wird ein Fehler generiert, wenn kein Protokoll geöffnet ist - obwohl das Protokoll nicht geöffnet ist, genau die Situation, die Sie möchten erstellen. Das Capture-Präfix verhindert, dass Stata Ihre do-Datei anhält, wenn der nachfolgende Befehl einen Fehler erzeugt. Der Fehler wird zuerst eingegeben. Also: Capture-Protokoll schließen schließt jedes offene Protokoll, aber nicht abstürzen eine do-Datei, wenn keine Protokolldatei geöffnet ist. Das Capture-Präfix sollte nur verwendet werden, wenn Sie den Fehler verstehen, den der Befehl manchmal generiert und warum es das tut - und Sie sind sehr zuversichtlich, dass dieser Fehler ignoriert werden kann. Wenn ein Befehl vollständig ist, speichert er einen Quotret-Codequot in rc. Ein Returncode von Null bedeutet generell den erfolgreich ausgeführten Befehl. Sie können Capture verwenden, gefolgt von einer Verzweigung, wenn Sie auf dem Rückgabecode basieren, damit Stata verschiedene Dinge abhängig davon, ob ein Fehler aufgetreten ist oder nicht. Variablen in skalaren Kontexten Eine Variable von Stata ist ein Vektor: sie hat viele Werte. Wenn Sie list x eingeben, erhalten Sie eine Liste aller Werte von x. Einige Kontexte fordern jedoch einen Skalar. Beispielsweise zeigt der Anzeigebefehl nur eine Sache an. Wenn eine Variable in einem skalaren Kontext verwendet wird, wird der Wert der Variablen für die erste Beobachtung verwendet. Wenn Sie also: youll erhalten nur den ersten Wert von x, als ob youd typed: Wir schlagen vor, nicht nutzen dieses Verhalten, weil es für verwirrenden Code macht. Wenn ein Befehl einen Skalar aufruft und der Skalar der erste Wert von x sein soll. Typ x1 und nicht nur x. Dieses Verhalten kann zu wirklichen Problemen führen, wenn Sie nicht erkennen, einen bestimmten Kontext fordert einen Skalar, wie youll sehen Sie in den Abschnitt auf Verzweigung, wenn. Erweiterte Makros In diesem Abschnitt werden viele Tricks diskutiert, mit denen Sie Makros definieren können. Geben Sie help local für noch mehr ein. Speichern von Listen mit Werten mit den Pegeln von Befehl listet die gültigen Werte einer Variablen auf und speichert sie in einem lokalen Makro. Die Syntax ist: levelsof Variable. Local (Makro) Wird häufig mit einer if-Bedingung verwendet, um jene Werte einer Variablen zu speichern, die in einem gegebenen Teilbeispiel erscheinen. Das folgende Beispiel (genommen von Stata Programming Essentials) verwendet Levels und eine foreach-Schleife, um eine umfragegewichtete Regression getrennt für jedes Rennen auszuführen. Dies schafft die Funktionalität von by: auch wenn: nicht mit svy verwendet werden: Rennen, lokale (Rennen) foreach Rasse der lokalen Rassen Display newline (2) quotRaceracequot svy, subpop (wenn Rennfahrer): reg Einkommen Alter i. education Seit Levelsof nicht enthalten fehlende Werte in seiner Liste, wird der obige Code nicht eine Regression für Beobachtungen mit einem fehlenden Wert für Rennen. Dies ist anders als von. Die Beobachtungen mit einem fehlenden Wert der durch Variable als nur eine andere Gruppe zu handeln behandelt. Angenommen, Sie haben Personen gefragt, welche sozialen Gruppen sie angehören. Die Gruppen werden als Zahlen codiert und in der Variablengruppe i gespeichert, wobei i eine ganze Zahl ist. So, wenn eine Person sagte, sie gehört zu Gruppe fünf und Gruppe drei (in dieser Reihenfolge) ihr Wert von group1 wäre 5 und ihr Wert von group2 wäre 3. (Wenn sie Listen weniger Gruppen als die maximale Anzahl erlaubt, wird sie fehlen Werte für einige Gruppen-i-Variablen.) Sie wollen dann eine Indikatorvariable für jede Gruppe erstellen, die den Wert 1 hat, wenn die Person gesagt hat, sie sei ein Mitglied dieser Gruppe und null sonst: foreach groupvar von varlist group levelsvon groupvar, Group) foreach Gruppe von lokalen Gruppen capture Gen memgroup0 ersetzen memgroup1 if groupvargroup Diese Schleifen über die Gruppen-i-Variablen, herauszufinden, welche Gruppen in jedem einzelnen aufgeführt wurden, Schleifen über sie, erstellt eine Indikatorvariable für jede Gruppe und setzt das Kennzeichen auf 1 Wenn die Person, die Gruppe aufgelistet. Beachten Sie, dass Sie nicht vor der Zeit wissen, wie viele Gruppen eine Person Liste oder die Zahlen der Gruppen, die angezeigt werden können wissen können. Der Gen-Befehl hat eine Aufnahme vor sich, da das Kennzeichen für eine bestimmte Gruppe bereits erstellt wurde: Wenn jemand die Gruppe 5 als seine erste Gruppe aufzählt und jemand andere Gruppe 5 als zweite Gruppe aufgelistet hat, wird mem5 bei der Verarbeitung von group1 und erstellt Versucht, mem5 erneut erstellen, wenn die Verarbeitung group2 gibt einen Fehler - aber Sie wissen, seine ein Fehler, den Sie ignorieren können. Erweitern von Variablenlisten mit unab Der Unab-Befehl quotunabbreviatesquot eine varlist (quotexpandquot wurde genommen) und stellt die Ergebnisse in ein Makro. Die Syntax lautet: unab makro. Varlist Beispiel: wenn Sie Variablen x1 hatten. X2 und x3. Dann: würde ein lokales Makro namens vars und Platz in ihr x1 x2 x3 erstellen. Dies kann für Befehle nützlich sein, die eine Liste von Variablen erfordern, aber nicht die varlist-Syntax verwenden können, wie etwa die Umformung, wenn sie von weit zu breit ist. Listen von Dateien Sie können eine Liste von Dateien in einem Makro platzieren, indem Sie local die Ausgabe eines dir-Befehls senden. Die Syntax ist: lokaler Makroname. Verzeichnisdateien, die das Muster haben müssen, müssen sie übereinstimmen. Hier ist macroname der Name des Makros, das Sie erstellen möchten. Das Verzeichnis ist das Verzeichnis, in dem sich die Dateien befinden, und das Muster, das sie übereinstimmen müssen, ist etwas wie quotquot für alle Dateien oder quot. dtaquot für alle Stata Datensätze. Zum Beispiel würde das folgende eine Liste aller Stata-Datensätze in das aktuelle Arbeitsverzeichnis in einem Makro namens Datendateien setzen: local datafiles: dir. Files quot. dtaquot Eine Komplikation ist, dass die Dateinamen in Anführungszeichen gesetzt werden (so kann es Dateinamen mit Leerzeichen in ihnen behandeln). So, um sie anzuzeigen, müssen Sie zusammengesetzte doppelte Anführungszeichen verwenden: Jedoch verursacht dieses nicht Probleme, wenn Sie über die Liste der Akten schleifen möchten: foreach Akte der lokalen Datendateien benutzen Akte, löschen Sie etwas mit der Akte, die den Inhalt eines Makros Sie formatiert Kann ein Format auf eine Zahl anwenden, bevor es in einem Makro gespeichert wird, indem lokal die Ausgabe eines Anzeigebefehls gesendet wird, der ein Format enthält. Beispielsweise speichert der folgende Befehl das R-Quadrat der zuletzt ausgeführten Regression, e (r2). In einem Makro namens r2. Aber mit dem Format 5.4f so hat es vier Ziffern anstelle von sechzehn. Lokal r2: Anzeige 5.4f e (r2) Makros inkrementieren und dekrementieren Makros müssen häufig um ein und seltener um eins erhöht werden. Sie können dies mit den Betreibern tun. Diese gehen innerhalb der Makro-Anführungszeichen vor oder nach dem Makronamen. Wenn sie vorher platziert werden, wird das Makro inkrementiert (oder dekrementiert) und dann das Ergebnis in dem Befehl platziert. Wenn sie nachher platziert werden, wird der aktuelle Wert des Makros in dem Befehl platziert und dann wird das Makro inkrementiert (oder dekrementiert). Versuchen Sie folgendes: lokales x 1 display x display x-- display x Sie können die Inkrement - oder Dekrementoperatoren in einem lokalen Befehl verwenden, um ein Makro zu ändern, ohne etwas anderes zu tun, aber stellen Sie sicher, dass der Operator vor dem Makronamen steht. For example the following does not increase x : The macro processor replaces the macro x with 1. It then increases x to 2. but then when Stata proper executes the command it sees local x 1 and sets x back to 1. The following does increase x : Branching If Youre familiar with if conditions at the end of commands, meaning quotonly carry out this command for the observations where this condition is true. quot This is a subsetting if . When if starts a command, it is a branching if and has a very different meaning: quotdont execute the following command or commands at all unless this condition is true. quot The syntax is for a single command is: if condition command For a block of commands, its: if condition commands An if block can be followed by an else block, meaning quotcommands to be executed if the condition is not true. quot The else can precede another if. allowing for else if chains of any length: if condition1 commands to execute if condition1 is true else if condition2 commands to execute if condition one is false and condition2 is true else commands to execute if both condition1 and condition2 are false Consider trying to demean a list of variables, where the list is contained in a macro called varlist which was generated elsewhere and could contain string variables: foreach var of local varlist capture confirm numeric variable var if rc0 sum var, meanonly replace varvar-r(mean) else display as error quotvar is not a numeric variable and cannot be demeaned. quot The command confirm numeric variable var checks that var is a numeric variable, but when preceded by capture it does not crash the program if the variable is a string. Instead, if rc0 The condition for a branching if is only evaluated once, so a branching if is a scalar context and the rule that only the first value of a variable will be used applies. In particular, a branching if cannot be used for subsetting. Imagine a data set made up of observations from multiple census years where the data from 1960 is coded in a different way and thus has to be handled differently. What you should not write is something like: if year1960 code for handling observations from 1960 else code for handling observations from other year s Since this is a scalar context, the condition year1960 is only evaluated once, and the only value of year Stata will look at is that of the first observation. Thus if the first observation happens to be from 1960, the entire data set will be coded as if it came from 1960. If not, the entire data set will be coded as if it came from other years. This is not a job for branching if . it is a job for a standard subsetting if at the end of each command. The above code might make sense if it were embedded in a loop that processed multiple data sets, where each data set came from a single year. Then year would be the same for all the observations in a given data set, and the first observation could stand in for all of them. But in that case wed suggest writing something like: if year11960 Conditions for branching if frequently involve macros. If the macros contain text rather than numbers, the values on both sides of the equals sign need to be placed in quotes: foreach school in West East Memorial if quotschoolquotquotWestquot commands that should only be carried out for West High School commands that should be carried out for all schools While Loops foreach and forvalues loops repeat a block of commands a set number of times, but while loops repeat them until a given condition is no longer true. For example: local i 1 while ilt5 display i is equivalent to: forval i15 display i Note that i is increased by 1 each time through the while loop--if you left out that step the loop would never end. The following code is a more typical use of while: local xnew 1 local xold 0 local iteration 1 while abs(xnew-xold)gt.001 amp iterationlt100 local xold xnew local xnewxold-(3-xold3)(-3xold2) display quotIteration: iteration, x: xnewquot The above uses the Newton-Raphson method to solve the equation 3-x30. The algorithm proceeds until the result from the current iteration differs from that of the last iteration by less than .001, or it completes 100 iterations. The second condition acts as a failsafe in case the algorithm does not converge. Note that the initial value of xold is not used, but if it were the same as the initial value of xnew then the while condition would be false immediately and the loop would never be executed. A Stata program is a block of code which can be executed at any time by invoking the programs name. They are useful when you need to perform a task repeatedly, but not all at once. To begin defining a program, type: program define name where name is replaced by the name of the program to be defined. Subsequent commands are considered part of the program, until you type Thus a basic quotHello Worldquot program is: program define hello display quotHello Worldquot end To run this program, type hello . A program cannot be modified after it is defined to change it you must first drop the existing version with program drop and then define it again. Since a do file run in an interactive session cant be sure whats been defined previously, its best to capture program drop a program before you define it: capture program drop hello program define hello display quotHello World Againquot end Programs can be controlled by passing in arguments . An argument can be anything you can put in a macro: numbers, text, names of variables, etc. You pass arguments into a program by typing them after its program name. Thus: hello Russell Dimond runs the hello program with two arguments: Russell and Dimond. But arguments only matter if the program does something with them--the current version of hello will completely ignore them. Programs that use arguments should first use the args command to assign them to local macros. The command: args fname lname puts the first argument the program received in the macro fname and the second in the macro lname. You can then use those macros in subsequent commands: capture program drop hello program define hello args fname lname display quotHello fname lname quot end If you then type: hello Russell Dimond the output will be: Hello Russell Dimond Of course if you type: hello Dimond Russell the output will be: Hello Dimond Russell Its up to you to make sure the arguments you pass in match what the program is expecting. The macro 0 is always defined, and contains a list of all the arguments that were passed into the program. This is useful for handling lists of unknown length. For example, you could take the code you wrote earlier for demeaning lists of variables and turn it into a program: program define demean foreach var of local 0 capture confirm numeric variable var if rc0 sum var, meanonly replace varvar-r(mean) else display as error quotvar is not a numeric variable and cannot be demeaned. quot end To run this program, youd type demean and then a list of variables to be demeaned: You might also want to look at the syntax command, which makes it relatively easy to write a program that understands standard Stata syntax, but syntax is beyond the scope of this article. Returning Values Your program can return values in the r() or e() vectors, just like official Stata commands. This is critical if your program is intended for use with bootstrap or simulate. To do so, first declare in your program define command that the program is either rclass (puts results in the r() vector) or eclass (puts results in the e() vector): program define myprogram, rclass When you have a result to return, use the return command. The general syntax is: return type name value where type can be scalar. local or matrix. value is what you want to return, and name is what you want it to be called. As a trivial example: return scalar x3 When the program is complete, you can refer to the result as r( name ) or e( name ). Thus if youve just run a program containing the above return command, typing: creates a variable var with the value 3 . For a more realistic example, see the last section of Bootstrapping in Stata . Last Revised: 12142010


No comments:

Post a Comment