Joskus jokin työvaihe (datan muunnos, jokin analyysi) on suoritettava toistuvasti, pienin vaihteluin. Kuvittele, että haluat esimerkiksi tehdä useita regressioanalyysejä tietyllä joukolla riippumattomia muuttujia tutkiaksesi näiden muuttujien vaikutusta joihinkin tuloksiin. (Huomaa, että useiden lopputulosten täysin samanaikaiseen analyysiin voitaisiin ehkä käyttää menettelyä sureg
; oletetaan vain, että emme halua tehdä tätä tässä). Voit tietysti kirjoittaa ensimmäisen komennon, kopioida komentorivin, vaihtaa riippuvan muuttujan nimen ja niin edelleen. Mutta silmukat helpottavat joskus asioita.
Silmukoita voidaan määritellä kahdella tavalla: foreach
viittaa luetteloitavien elementtien luetteloon, kun taas forvalues
viittaa lukualueeseen, jonka vaikutuksesta seuraava suoritetaan jokaiselle näistä luvuista. Seuraavat esimerkit toivottavasti selventävät asiaa.
Silmukat foreachin avulla
Käytetään esimerkkiä, jolla aloitin tämän kirjoituksen. Oletetaan, että halutaan tutkia tulojen, perheaseman ja sukupuolen vaikutuksia useisiin riippuviin muuttujiin (tämä esimerkki on tietysti karkeasti yksinkertaistettu). Käyttämällä foreach
tämä onnistuu näin:
foreach x in excl depr satisf happy activ {
regressio `x’ tulot i.famstat sukupuoli
}
Tällöin ajetaan regressioanalyysit muuttujista ”excl”, ”depr” ja niin edelleen riippumattomien muuttujien joukosta. Muuttujien nimet luettelossa, joka seuraa ”foreach x”, korvaavat peräkkäin x:n rivillä, joka alkaa regression
. x:n sijasta voidaan käyttää mitä tahansa muuta merkkiä tai merkkijonoa.
Huomaa kaksi asiaa: Ensinnäkin hakasulkeet ja niiden sijoittelu. Luettelon elementtien luetteloa seuraa avaava aaltosulku (samalla rivillä!). Seuraavalla rivillä (seuraavilla riveillä) seuraa (seuraavat) suoritettava(t) komento(t) – itse asiassa sen jälkeen voi seurata useita komentoja, jotka kaikki toistuvat, kun Stata käy läpi listan elementtien luetteloa. Sulkevat hakasulkeet seuraavat ylimääräisellä rivillä lopussa.
Toiseksi, hakasulkeiden sisällä x (tai mitä ikinä käytätkin sen tilalla) on ympäröity vasemmalla puolella painavalla aksentilla eli gravisilla ja oikealla puolella apostrofilla. (Opin juuri, että ohjelmoijat kutsuvat sitä backquote, backtick tai backgrave – ei pidä sekoittaa backstopiin ). Huomaa, että Statan käsikirjassa (ja muissa Stata-lähteissä) viitataan haudan korostukseen nimellä ”yksittäinen vasen lainausmerkki”, mutta ainakin saksalaisilla QUWERTZ-näppäimistöillä (ja saksalaisille käyttäjille, jotka käyttävät pilkkuja yksittäisiin vasempiin lainausmerkkeihin) on mielestäni oikeampaa puhua haudan korostuksesta (tai gravisista, ranskaksi: accent grave). Oli miten oli, katso yllä olevan komennon glyfonia – se, mitä näet tässä, on oikein, kun taas Statan käsikirja näyttää usein harhaanjohtavalta (saksalaisille käyttäjille!).
Luettelo elementeistä, joka seuraa foreach in
, ei tarvitse olla muuttujien luettelo; se voi olla mikä tahansa luettelo elementeistä. Katso seuraavaa esimerkkiä, joka on erikoistapaus, jossa nämä elementit ovat numerosarja. Jos näin ei ole, pitäydy foreach-menetelmässä, mutta muuten etene samalla tavalla.
Silmukat for-arvojen kanssa
Joskus on tilanne, jossa jokin asia, esimerkiksi muuttujien luettelo, liittyy peräkkäisten numeroiden luetteloon. Tässä on todellinen esimerkki viimeaikaisesta työstäni (joitakin melko hankalia muuttujien nimiä on yksinkertaistettu tässä). Kyselyaineistoissa on usein tietoa siitä, missä kotitaloudessa vastaaja asuu. Tässä tapauksessa muuttujiin ”hhms_2” – ”hhms_10” tallennettiin tietoa jäsenten tämänhetkisestä tilasta (ensimmäinen kotitalouden jäsen on vastaaja itse!). Halusin luoda kullekin kotitalouden jäsenelle dummy-muuttujan, joka osoitti, olivatko he työllisiä vai eivät (erityyppiset työsuhteet koodattuina 1-4). Yksi monista tavoista tehdä tämä oli:
forvalues i= 2/10 {
gen emp’i’ = inrange(hhms_`i’,1,4)
}
Lukuihin 2-10 viitataan tässä esimerkissä indeksillä ”i”, mutta ”i”:n sijasta voi käyttää mitä tahansa merkkiä tai merkkijonoa (kuten esim. ”number”) tai jopa numeroita. Silmukan sisällä indeksiä ympäröi vasemmalla puolella grave aksentti (tai gravis) ja oikealla puolella apostrofi. Huomio: Ensimmäinen graavi-aksentti, eli se, joka seuraa sanaa ”emp”, näyttää tässä apostrofilta joidenkin kohtaamieni teknisten ongelmien vuoksi, mutta tosielämässä sen pitäisi aina olla graavi-aksentti.
Tuloksena on joukko uusia muuttujia, joita kutsutaan nimillä ”emp2” – ”emp10” ja joiden arvot ovat 1, jos kyseinen kotitalouden jäsen on työllinen, ja muuten 0.