Hurok (foreach és forvalues)

Egyszer előfordul, hogy munkánk egy lépését (egy adattranszformáció, valamilyen elemzés) többször kell végrehajtani, némi eltéréssel. Képzeljük el, hogy például több regressziós elemzést szeretnénk végezni egy adott független változóhalmazzal, hogy megvizsgáljuk e változók hatását egy sor eredményre. (Megjegyezzük, hogy több kimenetel teljesen egyidejű elemzéséhez talán a sureg eljárást lehetne használni; tegyük fel, hogy mi itt nem ezt akarjuk csinálni). Természetesen megírhatnánk az első parancsot, másolhatnánk a parancssort, kicserélhetnénk a függő változó nevét, és így tovább. De a ciklusok néha megkönnyítik a dolgunkat.

A ciklusok definiálásának két módja van: foreach a felsorolandó elemek listájára utal, mígforvalues egy számtartományra utal, azzal a hatással, hogy ami ezután következik, az minden egyes számon végrehajtódik. A következő példák remélhetőleg tisztázzák a helyzetet.

Hurok foreach

Legyen az a példa, amellyel ezt a bejegyzést kezdtem. Tegyük fel, hogy a jövedelem, a családi állapot és a nem hatását szeretnénk vizsgálni egy sor függő változóra (természetesen ez a példa erősen leegyszerűsített). A foreach segítségével ezt a következőképpen érhetjük el:

foreach x in excl depr satisf happy activ {
regresszió `x’ jövedelem i.famstat gender
}

Ezáltal a “excl”, “depr” és így tovább változók regresszióelemzése a független változók halmazán fog lefutni. A “foreach x” utáni listában szereplő változónevek egymás után fogják helyettesíteni az x-et a regression-vel kezdődő sorban. Az x helyett bármilyen más karakter vagy karaktersorozat is használható.

Két dolgot mindenképpen vegyünk figyelembe: Először is, a zárójeleket és azok elhelyezését. A lista elemeinek felsorolását egy nyitó zárójel követi (ugyanabban a sorban!). A következő sor(ok)ban a végrehajtandó parancs(ok) következik(nek) – valójában több parancs is következhet, amelyek mindegyike megismétlődik, miközben a Stata a lista elemeinek listáján dolgozik. A záró zárójel a végén egy külön sorban következik.

Második, a zárójeleken belül az x-et (vagy bármit, amit helyette használhatsz) balra egy súlyos ékezet, vagy gravis, jobbra pedig egy aposztróf veszi körül. (Most tudtam meg, hogy a programozók ezt backquote-nak, backticknek vagy backgrave-nek hívják – nem tévesztendő össze a backstoppal ). Megjegyzendő, hogy a Stata kézikönyv (és más Stata-források) a grave ékezetet “szimpla baloldali idézőjel” néven említik, de legalábbis a német QUWERTZ billentyűzeteken (és a német felhasználók számára, akik a szimpla baloldali idézőjelekhez vesszőt használnak) szerintem helyesebb a grave ékezetről (vagy gravis, franciául: accent grave) beszélni. Akárhogy is van, nézze meg a fenti parancsban szereplő írásjelet – amit itt lát, az helyes, míg a Stata kézikönyv gyakran félrevezetőnek tűnik (német felhasználók számára!).

Az foreach in után következő elemlista nem feltétlenül változók listája; lehet bármilyen elemlista. Nézzük meg a következő példát, amely egy speciális eset, amikor ezek az elemek számsorozatok. Ha nem ez a helyzet, akkor maradjunk a foreach-nál, de egyébként ugyanígy járjunk el.

Hurok forértékekkel

Néha adódik olyan helyzet, amikor valami, például egy változókból álló lista, egymás után következő számok listájához kapcsolódik. Íme egy valós példa a közelmúltbeli munkámból (itt néhány meglehetősen kínos változónevet egyszerűsítettem). A felmérési adatokban gyakran találunk információt a háztartás tagjairól, amelyben a válaszadó él. Ebben az esetben a tagok aktuális állapotára vonatkozó információkat a “hhms_2” – “hhms_10” változókban tároltuk (az első háztartási tag maga a válaszadó!). Minden egyes háztartástaghoz létre kívántam hozni egy dummy változót, amely azt jelzi, hogy foglalkoztatottak-e vagy sem (a különböző típusú foglalkoztatási formák 1-4-ig kódolva). Ennek több módja közül az egyik:

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

A 2-től 10-ig terjedő számokra ebben a példában az “i” index utal, de az “i” helyett bármilyen karaktert vagy karakterláncot (mint pl. “szám”), vagy akár számokat is használhatunk. A cikluson belül az indexet a bal oldalon a grave accent (vagy gravis), a jobb oldalon pedig az aposztróf veszi körül. Figyelem! Az első, azaz az “emp” utáni ékezet itt aposztrófnak látszik néhány technikai probléma miatt, amivel találkoztam, de a való életben mindig ékezetnek kell lennie.

Az eredmény egy sor új változó, “emp2”-től “emp10”-ig, amelyek értéke 1, ha az adott háztartás tagja alkalmazott, és 0 egyébként.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.