Smyčky (foreach a forvalues)

Občas se stane, že nějaký krok ve vaší práci (transformace dat, nějaká analýza) musí být proveden opakovaně, s drobnými odchylkami. Představte si například, že chcete provést několik regresních analýz s danou sadou nezávislých proměnných, abyste prozkoumali vliv těchto proměnných na řadu výsledků. (Všimněte si, že pro plně simultánní analýzu několika výsledků by se možná dala použít procedura sureg; předpokládejme jen, že to zde nechceme dělat). Samozřejmě můžete napsat první příkaz, zkopírovat příkazový řádek, vyměnit název závislé proměnné atd. Ale smyčky někdy usnadňují práci.

Existují dva způsoby definování smyček: foreach odkazuje na seznam prvků, které mají být vyčísleny, zatímcoforvalues odkazuje na rozsah čísel s tím, že to, co následuje, se provede na každém z těchto čísel. Následující příklady to snad objasní.

Smyčky s foreach

Použijeme příklad, kterým jsem tento zápis začal. Předpokládejme, že chcete zkoumat vliv příjmu, rodinného stavu a pohlaví na řadu závislých proměnných (tento příklad je samozřejmě značně zjednodušený). Pomocí foreach toho lze dosáhnout takto:

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

Tím se provede regresní analýza proměnných „excl“, „depr“ atd. na souboru nezávislých proměnných. Názvy proměnných v seznamu, který následuje za „foreach x“, postupně nahradí x v řádku, který začíná regression. Místo x lze použít jakýkoli jiný znak nebo řetězec znaků.

Ujistěte se, že jste si všimli dvou věcí: Zaprvé, závorky a jejich umístění. Za seznamem prvků seznamu následuje otevírací závorka (na stejném řádku!). Na dalším řádku (řádcích) následuje příkaz (příkazy), který má být proveden – ve skutečnosti může následovat několik příkazů, které se budou všechny opakovat, zatímco Stata bude pracovat se seznamem prvků v seznamu. Uzavírací závorka následuje na extra řádku na konci.

Druhé, uvnitř závorek je x (nebo cokoli, co můžete použít na jeho místě) obklopeno hrobovým přízvukem neboli gravis zleva a apostrofem zprava. (Právě jsem se dozvěděl, že programátoři tomu říkají backquote, backtick nebo backgrave – neplést s backstop ). Všimněte si, že příručka Staty (a další zdroje Staty) hrobový přízvuk označují názvem „jednoduchá levá uvozovka“, ale přinejmenším na německých klávesnicích QUWERTZ (a pro německé uživatele, kteří používají čárky pro jednoduché levé uvozovky) je podle mě správnější mluvit o hrobovém přízvuku (nebo gravis, francouzsky: accent grave). Ať tak či onak, podívejte se na glyf ve výše uvedeném příkazu – to, co vidíte zde, je správně, zatímco příručka Staty vypadá často zavádějící (pro německé uživatele!).

Seznam položek, který následuje za foreach in, nemusí být seznam proměnných; může to být jakýkoli seznam prvků. Podívejte se na další příklad, který je speciálním případem, kdy jsou tyto prvky řadou čísel. Pokud to není tento případ, zůstaňte u foreach, ale jinak postupujte stejně.

Loopy s forvalues

Někdy nastane situace, kdy něco, např. seznam proměnných, souvisí se seznamem po sobě jdoucích čísel. Zde je reálný příklad z mé nedávné práce (některé poněkud nešikovné názvy proměnných zde byly zjednodušeny). V datech z průzkumů se často vyskytují informace o členech domácnosti, ve které respondent žije. V tomto případě byly informace o aktuálním stavu členů uloženy v proměnných „hhms_2“ až „hhms_10“ (prvním členem domácnosti je sám respondent!). Pro každého člena domácnosti jsem chtěl vytvořit dummy proměnnou označující, zda je či není zaměstnán (s různými typy zaměstnání kódovanými jako 1 až 4). Jeden z několika způsobů, jak to udělat, byl:

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

Čísla 2 až 10 jsou v tomto příkladu označena indexem „i“, ale místo „i“ můžete použít jakýkoli znak nebo řetězec znaků (jako např. „číslo“), nebo i čísla. V rámci smyčky je index obklopen hrobovým přízvukem (nebo gravis) na levé straně a apostrofem na pravé straně. Pozor:

Výsledkem je řada nových proměnných nazvaných „emp2“ až „emp10“ s hodnotami 1, pokud je příslušný člen domácnosti zaměstnán, a 0 v opačném případě.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.