Loops (foreach en forvalues)

Occidenteel moet een stap in je werk (een stuk gegevenstransformatie, een of andere analyse) herhaaldelijk worden uitgevoerd, met enige kleine variatie. Stel bijvoorbeeld dat u verschillende regressieanalyses wilt uitvoeren met een bepaalde reeks onafhankelijke variabelen, om het effect van deze variabelen op een reeks uitkomsten te onderzoeken. (Merk op dat voor een volledig gelijktijdige analyse van verschillende uitkomsten, misschien procedure sureg zou kunnen worden gebruikt; laten we aannemen dat dit niet is wat we hier willen doen). Natuurlijk zou je het eerste commando kunnen schrijven, de commandoregel kopiëren, de naam van de afhankelijke variabele verwisselen, enzovoort. Maar lussen maken de dingen soms gemakkelijker.

Er zijn twee manieren om lussen te definiëren: foreach verwijst naar een lijst van elementen die moeten worden opgesomd, terwijlforvalues verwijst naar een bereik van getallen met als gevolg dat wat volgt wordt uitgevoerd op elk van deze getallen. De volgende voorbeelden zullen dit hopelijk verduidelijken.

Lussen met foreach

Laten we het voorbeeld gebruiken waarmee ik dit artikel begon. Stel dat u de effecten van inkomen, gezinssituatie en geslacht op een reeks afhankelijke variabelen wilt onderzoeken (dit voorbeeld is natuurlijk sterk vereenvoudigd). Met foreach kan dit als volgt worden bereikt:

foreach x in excl depr satisf happy activ {
regress `x’ income i.famstat gender
}

Dit zal regressie-analyses uitvoeren van de variabelen “excl”, “depr” enzovoort op de verzameling van onafhankelijke variabelen. De namen van de variabelen in de lijst die volgt op “foreach x” zullen achtereenvolgens de x vervangen in de regel die begint met regression. In plaats van x kan elk ander teken of tekenreeks worden gebruikt.

Let op twee dingen: Ten eerste, de accolades en hun plaatsing. De lijst van elementen op de lijst wordt gevolgd door een accolade-opening (op dezelfde regel!). Het (de) uit te voeren commando(‘s) volgt (volgen) op de volgende regel(s) – in feite kunnen er meerdere commando’s volgen die allemaal herhaald zullen worden terwijl Stata door de lijst van elementen op de lijst werkt. De afsluitende accolade volgt op een extra regel aan het eind.

Ten tweede, binnen de accolades, wordt x (of wat u ook gebruikt in de plaats ervan) omgeven door een accent grave, of gravis, aan de linkerkant, en een apostrof aan de rechterkant. (Ik heb zojuist geleerd dat programmeurs dit backquote, backtick of backgrave noemen – niet te verwarren met backstop ). Merk op dat het Stata handboek (en andere Stata bronnen) verwijzen naar het grave accent onder de naam “single left quote”, maar in ieder geval op Duitse QUWERTZ toetsenborden (en voor Duitse gebruikers die komma’s gebruiken voor single left quotes) denk ik dat het correcter is om te spreken over het grave accent (of gravis, in het Frans: accent grave). Hoe het ook zij, kijk naar de glyph in het commando hierboven – wat u hier ziet is correct, terwijl het Stata handboek er vaak misleidend uitziet (voor Duitse gebruikers!).

De lijst van items die volgt op foreach in hoeft geen lijst van variabelen te zijn; het kan elke lijst van elementen zijn. Kijk naar het volgende voorbeeld, dat een speciaal geval is waarbij deze elementen een reeks getallen zijn. Als dit niet het geval is, blijf dan bij foreach, maar ga anders op dezelfde manier te werk.

Lussen met forvalues

Soms heb je een situatie waarin iets, b.v. een lijst van variabelen, gerelateerd is aan een lijst van opeenvolgende getallen. Hier is een echt voorbeeld uit mijn recente werk (sommige nogal onhandige variabelennamen zijn hier vereenvoudigd). In enquêtegegevens vindt u vaak informatie over de leden van het huishouden waarin de respondent woont. In dit geval werd informatie over de huidige status van de leden opgeslagen in variabelen “hhms_2” tot “hhms_10” (het eerste lid van het huishouden is de respondent zelf!). Ik wilde voor elk lid van het huishouden een dummy-variabele creëren die aangaf of het al dan niet een baan had (met verschillende soorten banen gecodeerd als 1 tot 4). Een van de verschillende manieren om dit te doen was:

forvalues i= 2/10 {
gen emp’i’ = inrange(hhms_`i’,1,4)
}

De getallen 2 tot en met 10 worden in dit voorbeeld aangeduid met de index “i”, maar in plaats van “i” kunt u elk teken of tekenreeks gebruiken (zoals bijvoorbeeld “number”), of zelfs getallen. Binnen de lus wordt de index omgeven door het grave accent (of gravis) aan de linkerkant en de apostrof aan de rechterkant. Let op: Het eerste accent grave, d.w.z. dat na “emp”, lijkt hier op een apostrof door wat technische problemen die ik tegenkwam, maar in het echt zou het altijd een accent grave moeten zijn.

Het resultaat is een aantal nieuwe variabelen, genaamd “emp2” tot “emp10”, met waarden van 1 als het betreffende huishoudlid werkzaam is en 0 anders.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.