Loops (foreach e forvalues)

Occasione, un passo nel vostro lavoro (una trasformazione di dati, qualche analisi) deve essere eseguito ripetutamente, con qualche piccola variazione. Immaginate di voler fare diverse analisi di regressione con un dato insieme di variabili indipendenti, per esempio, per studiare l’effetto di queste variabili su una serie di risultati. (Notate che per un’analisi completamente simultanea di diversi risultati, forse si potrebbe usare la procedura sureg; supponiamo solo che non sia quello che vogliamo fare qui). Naturalmente, potreste scrivere il primo comando, copiare la linea di comando, scambiare il nome della variabile dipendente, e così via. Ma i cicli a volte rendono le cose più facili.

Ci sono due modi di definire i cicli: foreach si riferisce a una lista di elementi da enumerare, mentreforvalues si riferisce a un intervallo di numeri con l’effetto che ciò che segue viene eseguito su ognuno di questi numeri. Gli esempi seguenti sperano di chiarire.

Ciclo con foreach

Utilizziamo l’esempio con cui ho iniziato questa voce. Supponiamo che vogliate studiare gli effetti del reddito, dello stato di famiglia e del sesso su una serie di variabili dipendenti (naturalmente questo esempio è grossolanamente semplificato). Usando foreach, questo può essere ottenuto così:

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

Questo eseguirà analisi di regressione delle variabili “excl”, “depr” e così via sull’insieme delle variabili indipendenti. I nomi delle variabili nella lista che segue “foreach x” sostituiranno successivamente la x nella linea che inizia con regression. Al posto di x, può essere usato qualsiasi altro carattere o stringa di caratteri.

Assicuratevi di notare due cose: Primo, le parentesi graffe e il loro posizionamento. L’elenco degli elementi della lista è seguito da una parentesi graffa di apertura (sulla stessa linea!). Il comando o i comandi da eseguire seguono sulla linea o sulle linee successive – in realtà, possono seguire diversi comandi che saranno tutti ripetuti mentre Stata lavora attraverso la lista degli elementi della lista. La parentesi di chiusura segue su una linea extra alla fine.

In secondo luogo, all’interno delle parentesi, x (o qualsiasi cosa si possa usare al suo posto) è circondato da un accento grave, o gravis, a sinistra, e da un apostrofo a destra. (Ho appena imparato che i programmatori lo chiamano backquote, backtick o backgrave – da non confondere con backstop ). Si noti che il manuale di Stata (e altre fonti di Stata) si riferiscono all’accento grave con il nome di “citazione singola a sinistra”, ma almeno sulle tastiere tedesche QUWERTZ (e per gli utenti tedeschi che usano le virgole per le citazioni singole a sinistra) penso sia più corretto parlare di accento grave (o gravis, in francese: accent grave). Sia come sia, guardate il glifo nel comando qui sopra – quello che vedete qui è corretto, mentre il manuale di Stata sembra spesso fuorviante (per gli utenti tedeschi!).

La lista di elementi che segue foreach in non deve necessariamente essere una lista di variabili; può essere qualsiasi lista di elementi. Guardate il prossimo esempio che è un caso speciale in cui questi elementi sono una serie di numeri. Se questo non è il caso, mantenete il foreach, ma altrimenti procedete allo stesso modo.

Circuiti con forvalues

A volte avete una situazione in cui qualcosa, per esempio una lista di variabili, è collegata a una lista di numeri consecutivi. Ecco un esempio reale dal mio recente lavoro (alcuni nomi di variabili piuttosto imbarazzanti sono stati semplificati qui). Nei dati dei sondaggi, spesso si trovano informazioni sui membri della famiglia in cui vive l’intervistato. In questo caso, le informazioni sullo stato attuale dei membri erano memorizzate nelle variabili da “hhms_2” a “hhms_10” (il primo membro della famiglia è l’intervistato stesso!). Volevo creare, per ogni membro della famiglia, una variabile dummy che indicasse se fosse occupato o meno (con vari tipi di occupazione codificati da 1 a 4). Uno dei vari modi per farlo era:

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

I numeri da 2 a 10 sono indicati dall’indice “i” in questo esempio, ma invece di “i” si potrebbe usare qualsiasi carattere o stringa di caratteri (come, ad esempio, “numero”), o anche numeri. All’interno del ciclo, l’indice è circondato dall’accento grave (o gravis) a sinistra e dall’apostrofo a destra. Attenzione: Il primo accento grave, cioè quello che segue “emp”, sembra qui un apostrofo a causa di alcuni problemi tecnici che ho incontrato, ma nella vita reale dovrebbe essere sempre un accento grave.

Il risultato è una serie di nuove variabili, chiamate da “emp2” a “emp10”, con valori di 1 se il rispettivo membro della famiglia è occupato e 0 altrimenti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.