370 likes | 507 Views
Commandes STATA pour microsimulations. Anda David. Les Macros locales. Une macro est une sorte de « boîte » dans laquelle on stocke des informations que l’on pourra utiliser ultérieurement.
E N D
Commandes STATA pour microsimulations Anda David
Les Macros locales • Une macro est une sorte de « boîte » dans laquelle on stocke des informations que l’on pourra utiliser ultérieurement. • Les macros peuvent être locales ou globales selon leur champ d’application, définissant ainsi où leur nom sera reconnu. • Les macros locales sont créées dans un ficher « .do » ou « .ado » et cessent d’exister une fois qu’on arrête l’exécution du fichier.
Les Macros locales • Il ne s’agit pas de variables : au moment où on les « invoque », STATA ne fait que remplacer leur nom par le texte qu’elles contiennent avant d’exécuter la commande. • On peut ainsi écrire du code permettant d’exécuter différentes choses selon la valeur prise par les macros au moment où le code est exécuté. • Syntaxe : local name targetname local name = targetname (dans le cas de scalaires)
Les Macros locales • Exemples : . local pays France Italie Allemagne Brésil . local ctycode 111 112 136 134 . display “`pays’” France Italie Allemagne Brésil . display “`ctycode’” 111 112 136 134 . local list=“age weight sex” . regress outcome `list’ . regress outcome age weight sex
L’utilité des macros • Exécution de commandes sur des sous-échantillons dont la définition est complexe: summarize … if (hours>0|hours>=.) & weeks>0 & earn>0 & earn/weeks>100 tabulate … if (hours>0|hours>=.) & weeks>0 & earn>0 & earn/weeks>100 regress … if (hours>0|hours>=.) & weeks>0 & earn>0 & earn/weeks>100 • Avec des macros: local if = “if (hours>0|hours>=.) & weeks>0 & earn>0 & earn/weeks>100” summarize … `if’ tabulate … `if’ regress … `if’
Les erreurs à ne pas commettre . local a = -4.57213 . local b = 2.12394 . local c = 0.72195 . di (-`b' + sqrt(`b')^2-4*`a'*`c')/(2*`a') -1.4439 • Pourquoi (`b’)^2 et pas `b’^2?
Un petit exemple • Calculer le 1er et le dernier quintile d’une distribution , puis calculer des statistiques descriptives pour chacun de ces quantiles et faire des régressions. (sysuse nlsw88) • Solution qui ne marche pas: summarize wage, detail summarize varlist if r(p5)<wage & wage>r(p95), detail regress … if r(p5)<wage & wage>r(p95) • Solution qui marche: summarize wage, detail local lo = r(p5) local hi = r(p95) summarize varlist if `lo’<wage & wage<`hi’, detail regress … `lo’<wage & wage<`hi’
Les macros locales • Afficher le contenu d’une macro : quelques erreurs à ne pas commettre local x=1 display `x‘ • Remarques : • Noter la distinction entre les deux quotes • Il n’est pas toujours indispensable d’utiliser le signe « = » pour définir des macros locales local x = 1 est identique à local x 1
Quand utiliser le signe “=“ • Pour comprendre dans quelles situations le signe « = » est nécessaire, il suffit de voir la différence entre les deux programmes suivantes : • A votre avis, que donnera : local x 2+2 di `x’ di “`x’” local x = 2+2 di `x’ di “`x’” local x -2 di `x’^2
Quand utiliser le signe “=“ .local i 10 .local j 10+`i’ .display “`j’” 10+10 .local j = 10 + `i’ .display “`j’” 20
Les boucles • Il est possible d’intégrer des boucles à un .do. Les boucles possibles: • while • foreach • forvalues. • La commande whileoblige le logiciel à répéter la commande entre accolades jusqu‘à ce que la condition précisée par while ne soit plus vraie. Il faut d'abord lancer un compteur par le biais d'une macro locale, puis préciser la condition de la boucle. • Les commandes foreachpermettent d’effectuer des tâchesrépétitives comme appliquer à plusieurs variables les mêmes commandes. • Quelques conseils : • N’oubliez jamais de sauvegarder le .do avant de tester une boucle. • L’oubli de l’incrémentation du compteur ferait boucler à l’infini Stata...
La boucle FOREACH: syntaxe foreach nom_de_la_macro in/of [list type] list { code involving `macroname'... } • Remarques: • In ou of selon le type de liste • Toutes les commandes situées entre les parenthèses seront exécutées pour chacun des items de la liste. • Exemple : foreach color in red blue green { 1. di "`color'" 2. } Permet d’obtenir à l’écran : red blue green Remarque : l’écriture d’une boucle en mode itératif conduit Stata à numéroter les lignes. Vous n’avez pas à le faire en mode éditeur de texte.
La boucleFOREACH: exemple simple • Il est plus simple de faire figurer au préalable la liste dans une macro : local colors red blue green foreach color in `colors' { 1. di "`color'" 2. } • C’est d’ailleurs tellement courant que Stata prévoit un code spécial pour ces situations : local colors red blue green foreach color of local colors { 1. di "`color’” 2. } • Remarques : • On a remplacé in par of parce que la macro locale décrit une listetype. • Le nom de la macro locale n’a pas besoin d’être entre quotes.
La boucle FOREACH : les types de liste • Il existe plusieurs types de liste : varlist, newlist, et numlist. • Illustration à partir de la base auto installée avec Stata (sysuse auto) foreach var in pricempg rep78 { 1. di "`var'« 2. sum `var‘ 3. } foreachvar of varlist price-rep78 { 1. di "`var'« 2. sum `var‘ 3. } foreach var in price-rep78 { 1. di "`var'« 2. sum `var‘ 3. } • Dans l’ex1 la liste est une suite de 3 mots qui sont ensuite considérés comme des noms de variables dans les commandes qui suivent. • Dans l’ex2 Stata interprète price-rep78 comme une liste de plusieurs noms. • Dans l’ex3 Stata interprète price-rep78 comme un seul mot et la commande ne sera donc exécutée qu’une seule fois.
La boucle FOREACH : les types de liste • On utilise newlistpour une liste nouvelle de variables qui seront créées à l’intérieur de la boucle. foreachvar of newlist x1 x2 x3 x4 x5 { 1. gen `var'=0 2. } • C’est bien sûr genqui génère les nouvelles variables • On utilise numlistpour une liste de nombres : foreachi of numlist 1/5 { 1. gen y`i'=0 2. } • Il faut noter que la macro `i‘ joue le rôle d’un indice accolé à la variable y
Exemples de boucle FOREACH (1) foreach v of varlist price mpg rep78{ 2. summarize `v', detail 3. } local ctycode 111 112 136 134 local i 0 foreach c of local ctycode { 2. local ++i 3. local rc "`rc' (`i'=`c')" 4. } display "`rc'« (1=111) (2=112) (3=136) (4=134)
La boucle FORVALUES • Avec la boucle forvalues on peut faire une boucle sur une liste de nombres. • Au lieu d’utiliser foreach i of numlist on peut utiliser forvalues. forvalues i = 1/5 { 1. gen z`i’=0 2. } • Remarque : On peut compter autrement que de 1 en 1. forvalues i = 1 (3) 30 { 2. gen z_`i'=`i' 3. }
FORVALUES: Exemple • On suppose qu’on a 4 variables, gdp1, gdp2, gdp3 and gdp4 avec les valeurs du PIB pour 4 pays. • On peut utiliser les similarités des noms des variables pour créer une boucle pour les commandes generate et summarize. forvalues i=1/4{ 2.generate double lngdp`i’=log(gdp`i’) 3. summarize lngdp`i’ 4.}
FORVALUES: Exemple • Si les variables sont plutôt indexées par le nom du pays alors on utilisera foreach (UKgdp, USgdp, DEgdp and FRgdp) foreach c in US UK DE FR { 2.generate double lngdp`c’=log(gdp`c’) 3. summarizelngdp`c’ 4.} ou .local country US UK DE FR .foreach c of local country {…
La boucle WHILE local i = 1 while `i’<=10 { display `i’ local i = `i’+1 } Définition d’un compteur Critère d’arrêt ( ne pas oublier le « } ») Toutes les commandes entre { et } seront exécutées via la boucle Incrémentation du compteur (le pas de la variation dépend du cas étudié)
WHILE: Exemple • Si on veut répéter la même analyse sur deux bases de donnée set95.dta et set96.dta : local i=95 while `i’<=96 { use set`i’ reg prob gender local i = `i’+1 }
Manipuler des scalaires • scalar define : définit des variables scalaires; scalar def nom_scalaire = expression Exemple: scalar def quatre = 4 • scalar dir / list : liste le contenu des scalaires; scalar dir scalar list _all scalar list nom_scalaire • scalar drop : supprime les scalaires. scalar drop nom_scalaire
Commandes matricielles • Créer des matrices : • mkmat: permet des convertir des variables en matrices; mkmat varlist [if] [in] [, options] Exemple: sysuse auto mkmat price mpg turn matrix dir matrix list price • matrix: crée des matrices à partir des vecteurs ou d’autres matrices; matrix nom_matrice = vecteur ou matrice Exemple: matrix X = (2 , 3 \ 2 , 1 \ 1 , 1) matrix Y = (1 \ 0 \ -1) matrix beta = inv(X’*X)*X’*Y
Commandes matricielles (2) • Lister des matrices: • matrix dir : liste les noms des matrices existantes; • matrix list nom_matrice : liste le contenu d’une matrice; Exemple: matrix list beta • Renommer des matrices: • matrix rename nom_matrice1 nom_matrice2 • Supprimer une matrice: • matrix drop nom_matrice • Matrix drop _all
Commandes matricielles (3) • Nommer des colonnes et des lignes : matrix coln / rown matrice=nom_col / nom_ligne Exemple: matrix coln X = X1 X2 • Calcul des données à partir des vecteurs: matrix score nouvelle_var = nom_vecteur
Indicateurs de pauvreté et inégalité • Indices Foster, Greer and Thorbecke. povdeco nom_var [if] [poids], [bygroup] varpl(ligne de pauvrete) Exemple: povdeco depenset1 if sim==1 [w=weightpop], by(urbrur) varpl(z) • Coefficient de Gini ineqdeco nom_var [if] [poids], [bygroup] Exemple: ineqdeco depenset1 if sim==3 [fw=weightpop]