Sløjfer (foreach- og forvalues)

Find imellem skal et trin i dit arbejde (en datatransformation, en analyse) udføres gentagne gange, med en lille variation. Forestil dig, at du f.eks. ønsker at foretage flere regressionsanalyser med et givet sæt af uafhængige variabler for at undersøge disse variablers virkning på en række resultater. (Bemærk, at for en fuldt ud samtidig analyse af flere resultater kunne man måske anvende procedure sureg; lad os blot antage, at det ikke er det, vi ønsker at gøre her). Selvfølgelig kan du skrive den første kommando, kopiere kommandolinjen, udskifte navnet på den afhængige variabel osv. Men sløjfer gør nogle gange tingene lettere.

Der er to måder at definere sløjfer på: foreach henviser til en liste af elementer, der skal opregnes, mensforvalues henviser til en række tal med den virkning, at det, der følger, udføres på hvert af disse tal. De følgende eksempler vil forhåbentlig skabe klarhed.

Sløjfer med foreach

Lad os bruge det eksempel, som jeg startede dette indlæg med. Lad os antage, at du ønsker at undersøge virkningerne af indkomst, familiestatus og køn på en række afhængige variabler (dette eksempel er naturligvis groft forenklet). Ved hjælp af foreach kan dette opnås på følgende måde:

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

Dette vil køre regressionsanalyser af variablerne “excl”, “depr” og så videre på sættet af uafhængige variabler. Variabelnavnene på listen, der følger efter “foreach x”, vil successivt erstatte x’et i den linje, der starter med regression. I stedet for x kan der anvendes et hvilket som helst andet tegn eller en hvilken som helst tegnstreng.

Sørg for at bemærke to ting: For det første, parenteserne og deres placering. Listen af elementer på listen er efterfulgt af en indledende parentes (på samme linje!). Den eller de kommandoer, der skal udføres, følger på den eller de næste linjer – faktisk kan der følge flere kommandoer, som alle vil blive gentaget, mens Stata arbejder sig igennem listen af elementer på listen. Den lukkende parentes følger på en ekstra linje til sidst.

For det andet er x (eller hvad du nu måtte bruge i stedet) inden for parenteserne omgivet af en gravaccent, eller gravis, til venstre og en apostrof til højre. (Jeg har lige lært, at programmører kalder det backquote, backtick eller backgrave – ikke at forveksle med backstop ). Bemærk, at Stata-håndbogen (og andre Stata-kilder) omtaler grave-accent under navnet “single left quote”, men i det mindste på tyske QUWERTZ-tastaturer (og for tyske brugere, der bruger kommaer til single left quotes) mener jeg, at det er mere korrekt at tale om grave-accent (eller gravis, på fransk: accent grave). Uanset hvad, så se på glyffen i kommandoen ovenfor – det, du ser her, er korrekt, mens det i Stata-håndbogen ofte ser misvisende ud (for tyske brugere!).

Listen af elementer, der følger efter foreach in, behøver ikke at være en liste af variabler; det kan være en hvilken som helst liste af elementer. Se på det næste eksempel, som er et specialtilfælde, hvor disse elementer er en række tal. Hvis dette ikke er tilfældet, skal du holde dig til foreach, men ellers skal du fortsætte på samme måde.

Loops med forværdier

Sommetider har du en situation, hvor noget, f.eks. en liste af variabler, er relateret til en liste af på hinanden følgende tal. Her er et reelt eksempel fra mit seneste arbejde (nogle ret akavede variabelnavne er blevet forenklet her). I undersøgelsesdata finder man ofte oplysninger om de medlemmer af den husstand, som respondenten bor i. I dette tilfælde blev oplysninger om medlemmernes aktuelle status gemt i variablerne “hhms_2” til “hhms_10” (det første husstandsmedlem er respondenten selv!). Jeg ønskede for hvert husstandsmedlem at oprette en dummy-variabel, der angiver, om de var i beskæftigelse eller ej (med forskellige typer beskæftigelse kodet som 1 til 4). En af flere måder at gøre dette på var:

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

Tallene 2 til 10 omtales med indekset “i” i dette eksempel, men i stedet for “i” kan man bruge et hvilket som helst tegn eller en tegnstreng (som f.eks. “number”) eller endda tal. Inden for løkken er indekset omgivet af gravaccent (eller gravis) til venstre og apostrof til højre. Vær opmærksom: Den første gravaccent, dvs. den, der følger efter “emp”, ligner en apostrof her på grund af nogle tekniske problemer, jeg stødte på, men i virkeligheden bør det altid være en gravaccent.

Resultatet er en række nye variabler, kaldet “emp2” til “emp10”, med værdierne 1, hvis det pågældende husstandsmedlem er ansat, og 0 ellers.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.