Vous êtes sur la page 1sur 55

STATA POUR LES NULS

Olivier Cadot
Fvrier 2008

Table des matires


Comment mal dmarrer : leon un...................................................................................... 3
Do- et log-files ................................................................................................................ 3
Garbage in, garbage out : Formatage de loutput ........................................................... 6
Manipuler des donnes : comment faire du faux avec du vrai ........................................... 7
Importer des donnes ...................................................................................................... 7
Trier les variables et les maltraiter.................................................................................. 8
Gnrer des expressions vides de sens.......................................................................... 10
Max et min ................................................................................................................ 10
Moyenne, mdiane et cart-type ............................................................................... 11
Variables alatoires................................................................................................... 11
Variables en diffrences................................................................................................ 13
Variables muettes, aveugles et idiotes .......................................................................... 13
Variables en string ........................................................................................................ 14
Mettre le string et lenlever....................................................................................... 14
Manipuler des variables en string ............................................................................. 15
Fusionner des fichiers ................................................................................................... 17
Fusion horizontale ............................................................................................... 17
Fusion verticale ................................................................................................... 19
Variables avec indices (boucles)................................................................................... 20
Principe gnral ........................................................................................................ 20
Itrations ....................................................................................................................... 21
Boucles sur des observations .................................................................................... 22
Matrices et vecteurs ...................................................................................................... 22
Mettre une matrice en vecteur-colonne..................................................................... 22
Mettre un vecteur-colonne en matrice ...................................................................... 23
Multiplier une matrice par un vecteur....................................................................... 25
Un peu de programmation pour les ado............................................................................ 26
Programme.................................................................................................................... 26
Fichiers ado................................................................................................................... 26
If/else............................................................................................................................. 27
While............................................................................................................................. 29
Donnes de commerce international (les pires) ................................................................ 29
Agrger et dsagrger des donnes............................................................................... 29
Calculer un tarif moyen pondr................................................................................... 31
Transformer des droits spcifiques en nimporte quoi ................................................. 32

Identifier source et destination dans le commerce bilatral.......................................... 33


Estimation : quelques bidouillages ................................................................................... 35
Sauvegarder des rsultats, mme quand ils sont absurdes............................................ 35
Sauvegarder des statistiques descriptives ................................................................. 35
Sauvegarder valeurs prdites et rsidus .................................................................... 36
Sauvegarder des coefficients absurdes...................................................................... 36
Estimation ..................................................................................................................... 37
OLS and WLS........................................................................................................... 37
Estimations spares par anne................................................................................. 38
Sure ........................................................................................................................... 38
2sls ............................................................................................................................ 38
GMM......................................................................................................................... 39
Variables dpendantes limites................................................................................. 39
Graphiques ........................................................................................................................ 41
Graphiques avec courbes ou barres............................................................................... 41
Nuages de points ........................................................................................................... 43
Regressions non paramtriques ( smoother reg )...................................................... 46
Enqutes sur les scnes de mnages ................................................................................. 47
Statistiques descriptives et manipulation de donnes ................................................... 47
Moyennes, totaux et corrlations .............................................................................. 47
Calculer des indices dingalit ................................................................................ 49
Densits..................................................................................................................... 50
Effet de changements de prix par tranche de revenu .................................................... 50
Estimation sur des enqutes .......................................................................................... 52
Modles de slection................................................................................................. 53
Quelques trucs en Mata..................................................................................................... 54

Comment mal dmarrer : leon un


I think there is a world market for about five computers.
Thomas J. Watson
1
Chairman of the Board, IBM, 1943.

Do- et log-files
Ds les premires manipulations malheureuses, il faut regrouper toutes les erreurs, y
compris celles qui mettent les donnes dfinitivement cul par-dessus tte, dans un
(dont)-do-file avec le do-file editor de Stata. A la fin, le fichier en question (ou la
squence de fichiers) doit prendre les donnes de base et garantir la traabilit totale de
toutes les neries que vous avez faites. Cest seulement ainsi que vous saurez pourquoi
vous avez des rsultats absurdes depuis six mois. Les premires commandes devraient
tre
clear
#delimit ;
set mem 128m ;
set logtype text ;
capture log close ;
set more off ;
cd
cap
chdir
local path

d:\Papiers\paperdir ;
d:\Papiers\Paperdir ;
d:\Papiers\Paperdir ;

local pathdata
local pathdo
local pathresult

d:\Papiers\Paperdir\data ;
d:\Papiers\Paperdir\dofiles ;
d:\Papiers\Paperdir\results ;

log using
use

`pathresult\filename.log, replace
`pathdata\datafile.dta ;

Explication des commandes de dpart :


clear vide la mmoire
#delimit ; dfinit le symbole que Stata comprendra comme la fin dune commande ;
par dfaut, cest un retour la ligne (quon retrouve avec #delimit cr); utile si on a des

commandes trs longues et quon souhaite revenir la ligne pour pouvoir tout lire
lcran ; par contre, il ne faudra plus loublier la fin de toutes les commandes. Si on
choisit cette syntaxe, les lignes de commentaires doivent tre crites comme
1

http://www.gocreate.com/QuotAmaze/qlun.htm. Cit dans le manuel de reference de Shazam v.8,


McGraw-Hill, 1997.

* commentaire ;

Alternativement, si on veut crire sans point-virgule, les commentaires scrivent


// commentaire

et les commandes longues peuvent tre casses en plusieurs lignes avec /// :
dbut de la commande ///
suite de la commande
commande suivante

Attention il faut imprativement un espace avant ///.


set mem 128m ; dtermine la quantit de mmoire alloue Stata

Le bloc de commandes
cd
cap
chdir
local path

d:\Papiers\paperdir ;
d:\Papiers\Paperdir ;
d:\Papiers\Paperdir ;

indique Stata de se mettre sur le rpertoire d:\Papiers\paperdir et de sen souvenir.


Le bloc de commandes
local pathdata
local pathdo
local pathresult

d:\Papiers\Paperdir\data ;
d:\Papiers\Paperdir\dofiles ;
d:\Papiers\Paperdir\results ;

met dans sa mmoire des sentiers qui mnent vers trois rpertoires (quil aura bien sr
fallu crer avant dans le file manager) : data, o on met les donnes, dofiles o on met les
programmes, et results o on met les rsultats. Ce dpart permet de garder la suite dans
un semblant dordre. On pourra alors se rfrer ces sentiers sous forme abrge ; par
exemple, on appelle le fichier donnes par la commande
use

`pathdata\datafile.dta ;

au lieu de mettre tout le sentier. Ne pas oublier de mettre les guillemets comme ils sont
(noter le sens !).
set logtype text ; enregistre le fichier log sous format texte au lieu dun format

Stata (par dfaut)


capture log close ; permet au programme de sarrter sans bug mme si, par

exemple, on linterrompt par /* sans refermer linterruption par */ avant log close (qui
signale la fin). en fait, capture est galement utile devant dautres commandes sensibles
pour viter des bugs. Ceci dit a bugge quand mme ; par exemple, chaque fois quun do-

file est interrompu par une erreur, le log ne se ferme pas et on a la fois suivante un
message derreur log file already open .
set more off ; permet a tout le programme de se drouler sur lcran
log using filename.log, replace ; cre un fichier log nomm filename ; si ce nom
de fichier existe dj replace remplace lancien par ce nouveau fichier log
log close ; ferme le fichier log;

La commande save datafile1.dta est trs importante : elle sauvegarde le fichierdonnes (.dta) modifi par le programme sous un autre nom que le fichier initial, ce qui
permet de laisser ce dernier intouch. Sinon on altre le fichier initial de faon
permanente, ce qui est en gnral un dsastre.
De faon gnrale, les guillemets (comme dans cd c:\path\directory) sont
obligatoires quand les noms spcifis ne sont pas lis en un seul mot ; par exemple, Stata
comprend use le nom que je veux.dta mais pas use le nom que je
veux.dta.
Si on a fait une srie de commandes sans do-file (ce qui une mauvaise ide, trs souvent)
et que tout dun coup on voudrait pouvoir les reproduire, on peut crer un log file aprs
coup avec
log using filename.log
# review x
log close

ce qui va imprimer, dans le nouveau log file cr, les x dernires commandes (autant que
lon veut).
Petit conseil dorganisation : il peut tre utile davoir trois rpertoires, un pour les
donnes, un pour les programmes, et un pour les rsultats. Le problme cest quon ne
veut pas retaper tout le sentier pour retrouver ces fichiers tout bout de champ quand on
les appelle dans un do file. Pour cela, on met la commande suivante au dbut du do-file :
local pathdata D:\blabla\rpertoire_gnrique\data
local pathprog D:\blabla\rpertoire_gnrique\dofiles
local pathrslt D:\blabla\rpertoire_gnrique\results

et ensuite on appelle le fichier donnes.dta stock dans le rpertoire data par


use `pathdata\filename.dta

Garbage in, garbage out : Formatage de loutput


Si lon veut que les variables apparaissent dans loutput sous un autre nom (par exemple
sous un nom plus simple) que celui donn par le dingue qui a fait les premires
manipulations de donnes, et ceci tout en prservant le nom original des variables, on
utilise la commande label comme ceci :
label variable lnparcellesexpl land ;

Enfin si lon veut sauvegarder des rsultats destimation sous une forme directement
exportable dans excel, la commande qui vient immdiatement aprs la commande
destimation est
outreg varlist using
bfmt(fc) replace;

table1,

br

coefastr

3aster

bdec(3)

tdec(3)

qui gnre un fichier (table1.out) contenant un tableau de rsultats avec les statistiques t
entre crochets (br) pour quExcel ne les prenne pas pour des nombres ngatifs2, des
astrisques par niveau de significativit (coefastr 3aster: trois pour 1%, 2 pour 5% et
une pour 10%), trois chiffres aprs la virgule pour les coefficients (bdec(3)) et les
statistiques t (tdec(3)) et des coefficients formats en fixe (et non en notation
scientifique, pas pratique) et avec une virgule pour les milliers (bfmt(fc)). Par dfaut,
outreg utilise les labels et non les noms de variables.
Pour que plusieurs colonnes de rsultats soient regroupes dans un seul tableau, la
commande outreg est comme ci-dessus aprs la premire estimation mais pour les
suivantes, on ajoute loption append en gardant le mme nom de fichier et les mmes
options de formatage ; style
reg y x1 x2 x3;
outreg x1 x2 x3 using table1, coefastr 3aster replace;
reg y x2 x3 x4;
outreg x2 x3 x4 using table1, append coefastr 3aster replace;

La commande outreg nest pas dans le package standard de Stata8 (ni de Stata9
dailleurs) et doit tre tlcharge depuis le web avec findit outreg. Une fois quun
fichier excel est gnr par outreg, il peut tre r-export vers Latex en incorporant dans
Excel la macro Excel2Latex (fichier tlchargeable depuis ma page web, il suffit de
cliquer dessus et il se met tout seul dans Excel)3.
2

Si on veut garder des parenthses et pas des crochets, quand on ouvre le fichier table1.out, la troisime
(dernire) tape du wizard il faut slectionner chaque colonne et la formater en texte. Excel ne changera
alors pas les parenthses en nombres ngatifs.
3
A propos, pour passer dun format de page portrait landscape pour des tableaux larges, les commandes
en latex sont:
Au dbut du document: \usepackage{rotating}
Dans le document, juste avant le tableau:
\clearpage

Manipuler des donnes : comment faire du faux avec du


vrai
When the President does it, that means it is not illegal.
4

Richard Nixon

Un petit prambule. Pourquoi manipuler les donnes en Stata et pas en Excel ? La raison
est simple : pas mal des commandes que lon va voir ci-dessous existent aussi en Excel et
sont certes quelquefois plus simples (si on arrive les trouver), mais par contre on perd
vite le fil de ce que lon a fait subir aux donnes avant de passer lestimation, et cest
parfois l que se cachent soit les quelques erreurs lorigine de rsultats grotesques soit,
au contraire, les mauvais traitements infligs aux chiffres pour obtenir le rsultat dsir.
Avec Stata, on peut garder la trace de toutes les manipulations dans le do-file. Celui-ci
doit contenir toutes les commandes permettant de passer du fichier-donnes brut celui
qui est prt lestimation. Il est alors facile de retrouver lerreur qui tue ou bien de
vrifier ce que les chiffres ont subi entre les mains du bourreau avant davouer.

Importer des donnes


Les fichiers excel ne peuvent tre imports que par copier-coller. Pour que les variables
alphanumriques (string) soient reconnues comme telles par Stata, Dieu sait pourquoi il
faut souvent ajouter une ligne de titre en haut du tableau excel et slectionner tout le
tableau (case en haut gauche). Par une ligne de titre, je veux dire rajouter une ligne avec
un blabla au-dessus des cellules de noms de variables, comme ceci :
blabla
Reporter Year

Description

710

MFN applied duty 0

2002

Duty Type Duty Code TL


2

01011000

Description

AV Duty Rate

Pure-bred breeding animals 0

\begin{sidewaystable}[!h]
\centering
\begin{tabular}
Donnes du tableau
\end{tabular}
\caption{Le nom de mon tableau}
\end{sidewaystable}
\clearpage
Attention a ne marche pas trs bien en Scientific Workplace. A propos de tableaux en SW, quand un
tableau se met nimporte o dans le fichier, en gnral cest quil manque le caption . Il se peut aussi que
les donnes rentres par le macro latex aient des lignes sautes, auquel cas SW va couiner.
4
Citation encore trouve dans le manuel de Shazam, p. 51.

710

2002

MFN applied duty 0

01019000

Other

710

2002

MFN applied duty 0

01021000

Pure-bred breeding animals 0

Cest la cellule blabla qui fait marcher le truc. Sinon, la classification (TL)
apparatrait comme 1011000 (sept chiffres) au lieu de 01011000 (huit). Du coup les noms
de variables ne seront pas reconnus comme tels par Stata et il faudra les rajouter la main
en double-cliquant sur var1, var2 etc, puis il faudra liminer les deux premires lignes
en cliquant sur une case puis sur delete first observation deux fois.
Pour viter de passer par excel qui met automatiquement les variables chiffres (genre
classification hs) en mode numrique, on peut tlcharger les donnes en spcifiant
quon les veut spares par des espaces pour pouvoir utiliser infile au lieu de insheet
(qui nadmet pas quon spcifie un format string pour certaines variables). Il faut
commencer par sauvegarder le fichier donnes en ASCII (en lui donnant lextension .txt).
Si la premire variable est hs8 par exemple et doit tre en string et la deuxime est
value , la commande est alors
Infile str10 hs8 value using path/filename.txt.

On note que les sries de quantits physiques doivent tre tlcharges avec un dlimiteur
(tab, point-virgule) mais surtout pas des espaces car la dfinition des units est
quelquefois forme de plusieurs mots, ce qui produit un galimatias.
Pour contrler la faon dont stata formatte les variables dans le data editor, on tape
quelque chose comme
format firm_name %-100s

pour les string, o % contrle le formattage, 100 donne le nombre despaces dans la
colonne (plus il y en a plus elle est large), le moins aligne les entres gauche dans la
colonne, et le s est pour string. Voir aussi la section Mettre le string et lenlever . Si
cest des donnes numriques, on tape
format var %11.3f

o 11 donne le nombre de chiffres gauche de la virgule, 3 donne le nombre de


dcimales, et f impose la notation dcimale (par opposition la notation scientifique).

Trier les variables et les maltraiter


On trie les variables par sort ou gsort. La premire ne peut les trier que par ordre
ascendant, alors que la seconde peut les trier par ordre ascendant ou descendant. Pour
trier une variable x par ordre descendant, on ajoute un signe devant la variable, par
exemple

gsort x

Pour gnrer une variable indexant les observations, la commande est


gen x=_n

Pour modifier des valeurs ou des groupes de valeurs dans une variable, on utilise la
commande recode. Par exemple,
recode x .=0
recode y 1/12 = 1

changent toutes les valeurs manquantes dans x ( . ) en 0 et toutes les valeurs de y


comprises entre 1 et 12 en 1, respectivement. Cela fonctionne aussi avec un if.
Attention distinguer les commandes recode et replace. recode x .=value
semploie si on veut remplacer x par une constante (ici value) quand x est gale une
certaine valeur (ici une valeur manquante). La commande
replace x=log(x) if x!=0

semploie si on veut remplacer la variable x par une variable (ici son log), ventuellement
quand x satisfait une condition (ici, nest pas gale 0 ). Noter la syntaxe lgrement
diffrente. Pour renommer simplement une variable, cest
rename year81 yr81

Si lon veut additionner deux variables, x et y, qui ont des valeurs manquantes, la
commande
gen z = x + y

va gnrer une nouvelle variable qui aura une valeur manquante pour chaque observation
o soit x soit y a une valeur manquante. Pour viter cela, utiliser la commande rsum avec
egen (extensions plus labores de la commande gen):
egen z = rsum(x y)

qui traitera les valeurs manquantes comme des zros. (On peut utiliser des commandes
similaires pour dautres fonctions comme rmean, rmax, rmin ; toutes avec egen et toutes
sans virgules dans la parenthse). Si on veut faire la somme des observations dune
variable et non pas une somme de variables, la commande est:
egen sumx = sum(x)

Pour faire des manipulations sur les observations dune variable x, les suffixes sont [_n],
[_n-1], etc. Supposons que lon veuille vrifier si un code (disons hs8) nest pas rpt
(cest--dire quon na pas deux entres pour le mme code). On compte ces doublons
possibles avec la commande

count if hs8==hs8[_n-1]

Supposons que lon veuille faire des modifications rcursives sur les observations
(dabord la premire, puis la deuxime, etc.). Par exemple, pour boucher des trous dans
des donnes avec la dernire valeur non manquante, la commande est
replace x=x[_n-1] if x[_n-1] != .
replace hs2=hs2[_n-1] if hs2[_n-1] !=""
replace hs2=hs2[_n-1] if hs2[_n-1] !=""
replace hs2=hs2[_n-1] if hs2[_n-1] !=""

Les statistiques descriptives sont gnres par sum x. Pour leur sauvegarde voir la
section Estimation/Sauvegarder des rsultats. On peut utiliser aussi codebook pour avoir
une ide plus complte de la distribution dune variable.
Quand il ny a pas assez derreurs dans les donnes, on peut en fabriquer en interpolant et
en extrapolant linairement avec la commande ipolate. En panel avec individual et year
comme variables transversale et temporelle respectivement, il suffit dajouter by
individual :
by individual : ipolate x, gen(new_x)

Loption gen permet de crer une nouvelle variable au lieu dcraser lancienne (non
interpole) ce qui permet de vrifier si le rsultat a du sens ou pas. En ajoutant loption
epolate, on interpole et on extrapole :
by individual : ipolate x, gen(new_x) epolate

Gnrer des expressions vides de sens


Max et min
Pour crer une expression du style y = max { x, c} o c est une constante, la commande
est
gen y=x if x>=c
recode y .=c

La premire ligne cre des valeurs manquantes dans y quand x < c . La deuxime
remplace ces valeurs manquantes par c. Attention, cependant : si la variable x a dj ellemme des valeurs manquantes, celles-ci seront codes par Stata comme 999 dans sa
petite tte et vont alors tre interprtes comme de grandes valeurs de y et rendues gales
la constante. Le problme est alors de prserver les valeurs manquantes comme telles,
par exemple en adoptant une convention ad hoc:
recode x .=-989898

10

gen y=x if x>=c & x !=-989898


recode y .=c

Moyenne, mdiane et cart-type


Pour crer des nouvelles variables (constantes) gales respectivement la moyenne, la
mdiane et lcart-type dune variable existante, les commandes sont
egen x_bar = mean(x)
egen x_med = pctile(x)
egen x_sd = sd(x)

Ne pas oublier quil sagit dun egen et non dun gen.

Variables alatoires
Pour gnrer une variable alatoire dune distribution uniforme, la commande est
gen x=uniform()

pour une variable x avec une distribution uniforme sur un intervalle unitaire. set seed
donne la valeur avec laquelle Stata va commencer lalgorithme de gnration de
nombres pseudo-alatoires. Par dfaut, Stata prend ce chiffre sur la montre de
lordinateur ; set seed est donc ncessaire seulement si lon veut pouvoir reproduire
exactement les rsultats.
Stata peut gnrer des variables alatoires de distributions autre que la distribution
uniforme. Pour cela, il utilise la fonction quantile qui est linverse de la distribution
cumulative : si F(x) = u alors u = Q(x). Pour gnrer une variable tire dune distribution
normale, Stata gnre dabord une variable uniforme u, puis gnre x avec la fonction Q,
comme le montre la Figure 1 dans laquelle les u sont 0.1, 0.3,, 0.9 et les x gnrs
graphiquement par la courbe F(.). On voit dans le graphique du dessus que leur frquence
correspond (bien logiquement) la densit normale.

11

Figure 1
Gnration dune variable normale par Stata

u = F(x)

Distribution
uniforme
des u

x = Q(u)

Les commandes pour gnrer cent observations dune variable tire dune distribution
standard normale centre sur zro sont donc
set obs 100
gen u=uniform()
gen x=invnorm(u)

o invnorm est la fonction quantile gaussienne ; ou bien, tout simplement,


gen x=invnorm(uniform())

12

Stata peut galement gnrer des variables alatoires tires dautres distributions (gamma
etc.). Par exemple pour gnrer une variable alatoire non-ngative tire dune
distribution Gamma avec paramtre 1, cest
gen u=uniform()
gen x=invgammap(1,u)

Pour les distributions qui ne sont pas pr-programmes, on peut rentrer directement la
forme algbrique de la fonction quantile (quand on la connat) dans la troisime ligne. Par
exemple, pour gnrer les dates de 100 vnements tirs dun processus dans lequel le
temps dattente entre deux vnements suit une distribution de Weibull avec paramtre p
= 3, on utilise la fonction quantile de Weibull Q ( u ) = ln (1 u )

1/ p

pour crire

set obs 100


gen u=uniform()
gen t=(-ln(1-u))^(1/3)

o t la date alatoire de chacun des 100 vnements observs.

Variables en diffrences
On gnre les premires diffrences dune variable x par la commande
gen Dx = D.x

Cette commande fonctionne aussi en panel lorsque lon a pralablement dfini la nature
du panel par la commande
tsset ind time

Attention lordre qui est trs important (vrifier sur loutput stata que lon na pas
interverti les deux !).

Variables muettes, aveugles et idiotes


Pour gnrer une variable muette gale 1 quand flowname est Export (et 0 quand
flowname nest pas Export), la commande est
gen export=(flowname==Export)

Attention, Stata est case-sensitive. Si la variable est export et non Export a ne


marchera pas.

13

Pour gnrer une variable muette quon veut appeler dummy partir dune variable
numrique x (gale 1 quand x est gale value1 ou5 value2 et 0 sinon) la commande est
gen dummy=(x==value1 | x==value2)

Pour gnrer plusieurs variables muettes partir dune variable continue,


gen dummy1=(x<=value1)
gen dummy2=(x>value1 & x<=value2)
gen dummy3=(x>value2) if x<.

Il faut noter la condition dans la troisime ligne. Le signe . reprsente une observation
manquante dans une variable. Si la variable comprend des valeurs numriques, Stata va
attribuer aux observations manquantes une valeur strictement suprieure au maximum de
la variable. La condition de la troisime ligne (if x<.) signifie donc quon veut garder les
observations manquantes en tant que telles. On vrifier que les variables muettes
correspondent bien ce que lon veut et que les valeurs manquantes sont prserves avec
tab x dummy3, missing

Pour crer un vecteur de variables muettes partir dune variable numrique servant
didentifiant (disons countrycode) allant de 1 n, la commande de base est
tab countrycode, gen(country)

et Stata cre n variables muettes quil appellera country1-countryn6. On note que cette
commande fonctionne aussi lorsque lon a une liste de codes-pays avec des trous : avec
trois pays dont les codes sont 21, 47, 803, la commande tab/gen va donner trois dummies
country1-country3. Pour effacer toutes ces nouvelles variables, il suffit de taper
drop country1-countryn

Variables en string
Mettre le string et lenlever
Pour changer une variable numrique en une variable alphanumrique7 ( string ), la
commande est
gen str8 newvar=string(oldvar,8.0f)
5

Le signe | nest pas toujours prsent sur les claviers. On peut le copier-coller depuis laide de Stata :
help operator ou search op_logical
6
Par exemple, country4 vaudra 1 pour toutes les observations qui ont la mme (quatrime) valeur dans
countrycode, 0 sinon.
7
Les strings sont rouges dans le Data Editor.

14

o str8 indique combien de chiffres (ici, huit) la nouvelle variable (ici newvar) doit
avoir, au maximum. Si la variable initiale (oldvar) contenait des nombres plus de huit
chiffres, Stata ne gardera que les huit premiers dentre eux ( partir de la gauche). Si on
ne met pas loption %8.0f, partir de huit chiffres ce crtin de Stata met mme les
strings sous forme exponentielle et a fait du galimatia par exemple quand on agrge. Par
contre des fois il aime pas cette option, voir.
Pour changer une variable alphanumrique en numrique la commande est
destring oldvar, replace

et pour gnrer sa sur jumelle en version numrique (noter les parenthses) :


destring oldvar, gen(newvar)

Souvent dans les donnes brutes il y a un mlange de donnes chiffres et de


cochonneries mal tapes style XXX. Pour transformer ces codes-lettres en valeurs
manquantes sans sen soucier, on utilise loption force :
destring oldvar, replace force

mais attention, on ne voit alors pas ce quon fait On peut faire des dgts sans sen
rendre compte. Plus prudent, quand on a repr un certain type de cochonneries
nettoyer, on peut spcifier loption ignore XXX .
Enfin on peut galement changer un string. Par exemple, si on ne veut grader que les trois
premiers caractres dun string (par exemple les trois premires lettres dun nom de pays,
country, ou les trois premiers chiffres dans une classification de produits), on taperait
gen str3 initiales=country

Manipuler des variables en string


Pour changer la valeur dune variable alphanumrique pour certaines observations, la
commande recode ne fonctionne pas : il faut employer replace et ne pas oublier les
guillemets. Exemple :
replace reporter=Bahamas, The if reporter==Bahamas

Supposons quune question denqute (disons la question code comme variable q85)
comprenne six sous-questions, chacune admettant une rponse de 1 (tout fait daccord)
4 (pas du tout daccord). Les rponses aux six sous-questions sont codes dans une
seule variable en format string 6, style 412232. Le problme est dextraire la rponse
la sous-question 4, quon appelle newvar. La commande est alors

15

gen str1 newvar=substr(q85,4,1)

o largument 4 de la commande substring est la place du chiffre garder en partant


de la gauche et largument 1 est le nombre de chiffres garder. Si on voulait garder le
quatrime et le cinquime chiffres et pas seulement le quatrime, la commande serait
gen str2 newvar=substr(q85,4,2)

Supposons maintenant que lon sintresse la fin dun string et pas son dbut. Il y a
alors une ruse. Le principe est le mme : le premier argument entre parenthses indique
o il faut commencer et le deuxime le nombre de caractres garder. Mais si le premier
argument est ngatif, stata compte en partant de la gauche et garde le nombre de
caractres donns par le deuxime argument en allant vers la droite. Par exemple si
dutyrate est gal 1.23%, avec
gen str1 newvar=substr(dutyrate,-1,1)

stata dmarre au dernier caractre de dutyrate et le garde, ce qui donne le % ; avec


gen str1 newvar=substr(dutyrate,-2,1)

stata dmarre lavant dernier (le 3) et ne garde que celui-l ; avec


gen str2 newvar=substr(dutyrate,-2,2)

stata dmarre encore lavant dernier et en garde deux, ce qui donne 3% .


Supposons quon ait trois variables alphanumriques : reporter, partner et flowname,
cette dernire tant soit Import soit Export. Les deux premires sont des codes de pays
trois lettres. On peut gnrer une nouvelle variable gale reporter quand flowname est
Export et partner quand flowname est Import par
gen str3 exporter1=reporter if flowname==Export
gen str3 exporter2=partner if flowname==Import

Pour crire des commandes conditionnelles sur la longueur du string, la fonction est
length(). Par exemple si on veut ajouter un 0 au dbut dun string quand il a deux
caractres (par exemple parce que le 0 a disparu quand un code a t enregistr en
numrique) la commande serait
gen str1 zero=0 ;
gen str3 newcode = zero + oldcode if length(oldcode)==2 ;
replace newcode oldcode if length(oldcode)!=2 ;
drop oldcode ;

Avec exactement le mme exemple mais en voulant ajouter deux 0, la deuxime ligne
serait

16

gen str3 newcode = zero + zero + oldcode if length(oldcode)==2 ;

Supposons que lon ait un ensemble de variables en string (des noms de produits par
exemple) chacun revenant plusieurs fois dans lchantillon (pour chaque mnage par
exemple) et que lon veuille crer un indice pour ces produits allant de 1 n. Une faon
de le faire est la suivante : on garde seulement la variable nom de produit et on la
sauvegarde dans un fichier part. Dans ce fichier, on cre une variable indiant les
observations, et on collapse cette variable par le nom du produit. Puis on la supprime et
on la remplace par une nouvelle variable indiant les observations, qui va maintenant
aussi indicer les produits de 1 n. On sauvegarde et on fusionne avec le fichier original :
keep product_name
gen n=_n
collapse n, by(product_name)
drop n
gen prod_id=_n
sort product_name
save products, replace
use original_file, clear
sort product_name
merge products using product_name

et voil.

Fusionner des fichiers


Fusion horizontale
Pour fusionner deux fichiers contenant des variables diffrentes mais aussi une variable
commune (identificatrice), la variable identificatrice (class) doit avoir le mme nom dans
les fichiers fusion1.dta et fusion2.dta. La premire chose faire est un tri des deux
fichiers par cette variable. Procdure :
use fusion1 ;
sort class ;
save fusion1, replace ;
clear ;
use fusion2 ;
sort class ;
save fusion2, replace ;

On fait la fusion a partir de fusion2.dta (le fichier ouvert) comme suit :


merge class using fusion1 ;
save fusion3 ;

Les valeurs manquantes dans un fichier apparaissent dans le fichier fusionn. Les lignes
omises dans un fichier (ici, fusion2.dta) apparaissent dans le fichier fusionn avec une
17

valeur manquante pour les variables de ce fichier mais en bas du fichier fusionn, qui doit
alors tre re-tri.
La fusion horizontale comporte un grave risque. Il se peut que la variable commune
(identificatrice) ne soit pas suffisante pour identifier chaque observation : dans notre cas,
il se peut que plusieurs observations aient la mme valeur dans class. Ds lors, il convient
de trier les donnes avec le maximum de variables communes possibles, par exemple
use fusion1 ;
sort class code country year id ;
save fusion1, replace ;
clear ;
use fusion2 ;
sort class code country year id ;
save fusion2, replace ;

Puis, nouveau,
merge class code country year id using fusion1 ;
save fusion3 ;

Attention, beaucoup de dsastres ont leur origine dans des fusions hasardeuses. Sil y a
une chose vrifier cent fois cest celle-l. Exemple : imaginons que lon veuille
fusionner un fichier dans lequel les entreprises sont classes par leur code NACE avec un
fichier de tarifs par code HS comprenant une concordance NACE-HS (NACE et HS sont
des nomenclatures de produits). Le fichier entreprises est

et le fichier concordance est

On les fusionne par NACE et on obtient

18

du pipi de chat ! Lentreprise 1 est classe dans hs1 et a donc un tarif de 10%,
lentreprise dans hs2 avec un tarif de 15%, alors que rien dans le fichier-entreprises ne
permet de dire quelles sont diffrencies par code HS (puisque le fichier-entreprises na
pas de code HS !). Le problme, cest que chaque catgorie NACE a plusieurs images
la fois dans le fichier entreprises et dans le fichier concordance, et Stata les apparie selon
sa fantaisie.
Il y a plusieurs possibilits dans ce cas. On peut dabord calculer un tarif moyen par code
NACE, puis faire un collapse (voir la section agrger des donnes ) par code NACE,
et ensuite seulement faire la fusion. Ou bien (plus lgant) utiliser la commande
joinby varlist using file2

ce qui va clater la variable nace par hs et entreprise (cest--dire faire un produit


cartsien de toutes les combinaisons de hs et firmes), ce qui donne

et on peut, partir de ce fichier (dont la taille a bien sr augment), calculer des


moyennes simples de tarifs par entreprise.

Fusion verticale
Pour fusionner deux fichiers contenant les mmes variables mais des observations
diffrentes (par exemple sils sont tellement gros quils ont t pralablement
saucissonns), cest encore plus simple :
use fusion1;
append using fusion2 ;
save fusion3 ;

19

Variables avec indices (boucles)


Principe gnral
Deux commandes : foreach et forvalues. Supposons que lon veuille crer une srie
de variables muettes marquant cinq catgories codes dans une variable type allant de 1
5. On peut crire
foreach i of numlist 1/5 {;
gen dummy`i = (type==`i) ;
} ;

en notant que 1/5 signifie de 1 5 et numlist est (videmment) une liste de nombres.
On peut aussi numrer toute la liste, sans virgule, ou combiner :
foreach i of numlist 1 2 3/5 {;
gen dummy`i = (type==`i) ;
} ;

Cest justement la combinaison qui rend foreach flexible (au cas ou une boucle plante
on peut la sauter par exemple). Par contre foreach nadmet que des valeurs numriques.
Si on veut numrer jusqu la fin de lchantillon sans prciser sa taille en utilisant _N
(par exemple pour une procdure rpter sur des chantillons de taille variable), il faut
utiliser forvalues.
La syntaxe pour forvalues consiste donner le i initial (le premier 1), lincrment
du i (le 1 entre parenthses), et le i final. Pour lexemple prcdent, on crit
local N = _N
forvalues
i = 1(1) N {
gen dummy`i' = (type==`i)
}

Donc
forvalues i = 0(2) 4 {
gen x`i' = 1990 + `i'
}

donne trois nouvelles variables, x0=1990, x2=1992 et x4=1994, la valeur entre


parenthses (2) disant Stata de sauter de deux en deux.
Comme exemple de lapplication de foreach, supposons que lon veuille calculer un
poverty gap par anne pour quatre annes : 1993, 97, 99 et 2001. On a dans la base de
donnes quatre variables binaires appeles txchange1993 txchange2001 et une autre
appele year qui prend comme valeur le chiffre de lanne (1993 2001). Soit j lindice
marquant les annes (j = 1993, etc) On dfinit les variables avec lindice j de la faon
suivante
20

foreach j of numlist 1993 1997 1999 2001{


gen dollardep`j'
= dep/txchange`j' if year==`j'
gen dollarperday`j' = dollardep`j'/360
gen gap`j'
= 1 - dollarperday`j'
mean gap`j' if gap`j' <=.
display gap`j'
}

Itrations
Jusqu prsent on a considr des boucles consistant rpter une commande (ou un
bloc de commandes) pour chaque valeur de lindice i, disons de un n. Il ne sagit pas
ditrations proprement parler puisque chaque boucle est indpendante de la suivante.
On considre maintenant une srie de commandes dans lesquelles la valeur initiale dune
itration est la valeur donne par litration prcdente. Supposons que lon veuille
gnrer un processus de Markov
xt = xt 1 + ut
o ut est un choc avec une distribution normale, = 0.9 et une valeur initiale x0 = 1 . La
liste de commandes pour cinq iterations est
gen x0=1 ;
gen lambda=0.9 ;
foreach i of numlist 1/5 {;
local j = `i'-1 ;
set seed 0 ;
gen u`j'=invnorm(uniform()) ;
gen x`i' = lambda*x`j' + u`j' ;
};
display valeur finale egale a x5 ;
end ;

On note que xt et ut sont en fait des vecteurs si on a plusieurs observations. Les


conditions et les commandes qui suivent sont interprter en gardant cela lesprit.
Si on veut choisir le nombre ditrations simplement en appelant le programme, on mettra
le bloc de commandes sous forme dun programme (ou dun fichier ado) et on utilisera
forvalues:
program drop newloop ;
program define newloop ;
gen x0=1 ;
gen lambda=0.9 ;
local n = `1' ;

21

forvalues i = 1(1) `n' {;


local j = `i'-1 ;
set seed 0 ;
gen u`j'=invnorm(uniform()) ;
gen x`i' = lambda*x`j' + u`j' ;
};
display "valeur finale egale a " x`n' ;
end ;
newloop 100 ;

Boucles sur des observations


Attention : forvalues ne fonctionne pas sur des observations. Par exemple, supposons
que lon veuille gnrer une variable de stock de capital K partir dune variable
dinvestissement I par linventaire perptuel. La commande
local N = _N
gen K = 100
forvalues j = 2(1)N {
replace K = 0.9*K[_n-1] + I[_n-1] if _n == `j'
}

ne fonctionne pas. Il ny a pas besoin de boucle explicite. Il suffit dcrire


gen K = 100
replace K = 0.9*K[_n-1] + I[_n-1] if _n != 1

et stata procde squentiellement en commenant par la deuxime observation.

Matrices et vecteurs
Si on veut vraiment faire des oprations matricielles, Stata a un sous-programme, Mata,
avec sa propre syntaxe (voir une petite introduction a Mata la fin de cet aide-mmoire).
On ne prsente ici que quelques manipulations trs simples.

Mettre une matrice en vecteur-colonne


Avec la commande reshape. On dmarre avec une matrice 3x2 de la forme suivante
source

dest1

dest2

22

Lindice de lindustrie-source est i = 1,2,3 dans la premire colonne et lindice de


lindustrie-destination est j = 1,2 dans le suffixe des ttes de la deuxime et troisime
colonnes. Les variables (coefficients input-output si cest une matrice IO mais jai pris
une matrice rectangulaire pour montrer que la procdure ne demande pas une matrice
carre) sont x11 = 3, x12 = 2, x21 = 5, x22 = 4 x31 = 7 et x32 = 6. Cet exemple est dans le
fichier IOwide.dta dans DATA. On suppose aussi, cest en gnral le cas, que la premire
colonne est en format string (le code du secteur).
La srie de commandes est
destring source, replace ;
reshape long dest, i(source) j(destination) ;
gen coeff=dest ;
drop dest ;

et le rsultat est
source

destination

coeff

les coefficients input-output tant maintenant stocks dans la variable coeff. La variable
destination correspondant lindice j a t cre.
Pour que la syntaxe marche, on note que le nom des variables correspondant aux secteurs
de destination doit avoir un suffixe correspondant la variable i (code-produit). Je
suppose quil faut donc renommer toutes les colonnes la main, un peu casse-pieds mais
bon. Il faut aussi que le code du secteur i soit numrisable, cest--dire ne contienne pas
de lettres ou despaces.

Mettre un vecteur-colonne en matrice


On repart du tableau ci-dessus, et on veut remettre destination en colonnes. La commande
est
reshape wide coeff, i(source) j(destination)

et les deux variables correspondant "source" et "destination" dans notre exemple


doivent tre toutes les deux numriques, sauf si on utilise loption string (voir cidessous). Si on a une variable qui ne change pas pour un i donn on a pas besoin de la
mettre dans la liste de variables de reshape (exemple, i est lidentifiant dun individu et
23

la variable est son sexe). Bien videmment on ne peut mettre qu'une seule variable dans
la matrice.
Plus vicieux : supposons que lon ait des donnes du type
year
2002
2003
2003

hs6
010690
010110
030110

value
8827
1038
862

cest--dire 3 catgories de produits et deux annes mais (i) des valeurs manquantes et (ii)
des lignes carrment omises pour ces valeurs, au lieu de lignes vides (typique des
donnes commerce). On veut construire un tableau avec hs6 en ligne et les annes en
colonne (hs6 va donc jouer le rle de source et year de destination dans lexemple
prcdent), et des cellules vides pour les valeurs manquantes. Dautre part on veut garder
hs6 en format string, sinon le zro du dbut va disparatre.
Il faut commencer par trier les donnes dabord par hs6 puis par anne, sinon a ne
fonctionnera pas. Supposons que year et hs6 soient toutes les deux en string au dpart.
Pour le tri il faut les mettre en format numrique, mais en gardant une version string de
hs6 puisque lon en aura besoin plus tard (la transformation nest pas neutre cause du
zro au dbut alors que pour year elle lest). La liste de commandes est alors
destring hs6, gen(nhs6) ;
destring year, replace ;
sort nhs6 year ;

Aprs le tri, comme on veut hs6 en string, il faudra utiliser loption string dans reshape
et il faudra alors que les deux variables (hs6 et year) soient en string, ce qui veut dire les
transformer et supprimer leurs versions numriques :
gen str4 syear=string(year) ;
drop nhs6 year ;

enfin on peut utiliser la commande reshape wide


reshape wide value, i(hs6) j(syear) string ;

et on obtient
hs6
010110
010690
030110

value2002
.
8827
.

24

value2003
1038
.
862

Multiplier une matrice par un vecteur


Voil le programme concoct partir des fichiers IOlong.dta et vector.dta, tous les deux
dans le rpertoire DATA. La matrice dans le fichier IOlong.dta doit dj avoir t mise en
format long (voir section prcdente). Soit i la source (lignes) et j la destination
(colonnes) si on a en tte une matrice input-output par exemple. On commence par les
bidouillages habituels:
use IOlong.dta ;
destring source, replace ;
sort destination ;
save matrix.dta, replace ;

puis on fait la mme chose avec le fichier contenant le vecteur-colonne:


clear ;
use vector.dta ;
sort destination ;
save newvector.dta, replace ;

Ensuite on fusionne les deux fichiers sur la base de lindice j (appel destination et
contenu dans la deuxime colonne du fichier matrice en format long)
merge destination using matrix ;
drop _merge ;
save matrixvector.dta, replace ;

Puis on gnre les produits par cellule xij*yj que lon appelle product:
gen product=coeff*y ;
sort source destination coeff product ;

Enfin on somme ces produits sur j, cest--dire que lon gnre les expressions
j xij y j . Attention, on va utiliser loption by source qui en Stata signifie que lon
garde i constant, cest--dire que lon somme sur j. En dautres termes, by indique
lindice (la variable) gard constant et non pas lindice (la variable) sur lequel on somme.
by source: egen final=sum(product) ;
collapse final, by(source) ;
save matrixvector.dta, replace ;

et surprise, a marche, si, si. Mais franchement a va plus vite avec Mata (voir cidessous).

25

Un peu de programmation pour les ado


Programme
On peut inclure un programme lintrieur du do-file. Attention, si on fait marcher le dofile plusieurs fois de suite (par exemple pour debugger) on aura le message derreur
program dummy already defined . A partir de la deuxime fois il faudra donc crire
program drop dummy avant program define dummy (pas trs lgant mais bon). La
syntaxe de base pour ouvrir et fermer le programme (par exemple de cration des
variables muettes) est
program define dummy ;
forvalues
i = 1(1) 3 {;
gen type`i' = (type==`i) ;
} ;
end ;
dummy

et le programme est excut par le do-file par la dernire commande qui est simplement
son nom (les lignes qui prcdent ne font que le dfinir).

Fichiers ado
Une alternative plus lgante linclusion dun programme dans le do-file (par exemple
sil est long) est de crer un fichier .ado (en utilisant notepad ou nimporte quel diteur
ASCII). Si on veut utiliser le programme en lappelant par une commande il doit tre
sauvegard dans c:\Stata\ado\personal ou plus simplement dans un rpertoire ado
directement sur c:\ avec des sous-rpertoires chacun ayant comme nom une lettre le
lalphabet. On classe les fichiers ado dans le rpertoire de son initiale. Un fichier ado est
mis en route dans le fichier .do par une commande portant simplement son nom (juste le
nom, pas le chemin pour y arriver) suivie du nombre de boucles faire sil y a des
boucles (voir ci-dessous pour les macros).

Macros. Premire chose utile savoir : comment crer un macro (au vin blanc). Stata en
a de deux sortes : local et global. Un macro local dfini dans un fichier ado ne peut pas
tre utilis dans un autre fichier ado. Par contre, un macro global est dfini une fois pour
toutes et peut tre utilis par tous les fichiers ado (donc utiliser prudemment). Un
exemple de macro local consiste donner un nom une liste de variables, disons x y z en
lappelant truc :
local truc x y z

On peut alors utiliser `truc (avec un simple guillemet) dans nimporte quelle commande,
style

26

sum `truc
reg depvar `truc

Par contre les doubles guillemets dans la dfinition du macro sont optionnels. On peut
bien sr combiner le macro avec une boucle. Supposons que lon veuille mettre au carr
10 variables nommes respectivement z1-z10. On commence par faire un macro local avec
la liste des variables, puis on fait la boucle, ce qui donne
local truc z1-z10 ;
foreach x of local truc { ;
gen new`x=`x^2 ;
} ;

On note que le nom de la variable gnrique de la boucle (x) est libre. Jusque-l, le macro
peut tre utilis dans un do-file normal, il ny a rien qui require un programme.
Supposons maintenant quon ait 100 types possibles dune variable, indexs dans une
variable-code allant de 1 100. Pour crer des variables muettes disons pour les 50
derniers types, le contenu du fichier ado pour crer la liste de variables muettes serait:
program define dummy ;
local n = `1 ;
forvalues
i = 50(1) `n {;
gen type`i' = (type==`i) ;
} ;
end ;

qui est appel dans le do-file par


dummy 100

cest--dire avec le nom du programme (dummy) et le numro de la dernire boucle


dsire (100). La signification de la ligne local n = `1 nest pas trop claire mais bon.
La dfinition du macro local par `1 avec des guillemets uniques ne peut tre utilise que
dans un programme. Lintrt de cette syntaxe est que la fin des boucles peut maintenant
tre choisie directement par la commande dappel du programme dummy.

If/else
Supposons maintenant que lon veuille faire de zro une barrire absorbante, cest--dire
que ds que le processus passe zro ou en-dessous, il reste coinc zro. On utilise la
commande if/else :
gen x0=1 ;
gen lambda=0.9 ;
foreach i of numlist 1/100 {;
local j = `i'-1 ;

27

set seed 0 ;
gen u`j'=invnorm(uniform()) ;
if x`j' <= 0 {;
gen x`i' = 0 ;
};
else {;
gen x`i' = lambda*x`j' + u`j' ;
};
};
display "x100 =" x100 ;

Attention la syntaxe est trs sensible. Louverture daccolade doit tre sur la mme ligne
que le if, la commande en dessous, et la fermeture daccolade sur une ligne part.
En utilisant forvalues on peut mettre aussi une barrire endogne en disant Stata
de sarrter ds que la diffrence entre xt et xt 1 est plus petite que 0.1, ce qui illustre en
mme temps limbrication de commandes if/else :
gen x0=1 ;
egen X0=mean(x0) ;
gen lambda=0.9 ;
program drop newloop ;
program define newloop ;
local n = `1' ;
forvalues i = 1(1) `n' {;
local j = `i'-1 ;
set seed 0 ;
gen u`j'=invnorm(uniform()) ;
gen x`i' = lambda*x`j' + u`j' ;
egen X`i' = mean(x`i') ;
if X`j+1'-X`j' > -0.01 {;
continue ;
};
else if x`j'>5 {;
continue ;
else {;
break ;
};
};
};
display "valeur finale " X`n' ;
end ;
newloop 20 ;

et l encore on peut choisir combien de boucles on fait (ce qui ne sert pas forcment
grandchose si larrt est endogne ! Mais bon). On note que la condition du if (X`j+1'X`j' > -0.01) est exprime en termes de lindice j, pas i.

28

While
La syntaxe de while est en gros la mme que celle de if/else :
while condition { ;
command ;
} ;

A utiliser prudemment, while peut facilement produire des boucles sans fin

Donnes de commerce international (les pires)


Agrger et dsagrger des donnes
Un petit truc utile pour commencer. Les donnes de commerce descendues de
COMTRADE (la base standard pour les donnes de commerce international) contiennent
plusieurs degrs dagrgation simultanment. Si lon demande les importations de la
Zambie au niveau HS6 (6 chiffres, le niveau le plus dsagrg), par exemple, on va avoir
des observations 2, 4 et 6 chiffres, celles 2 et 4 (entoures) tant redondantes :
Period
2002
2002

Trade
Flow
Import
Import

2002

Import

Commodity
Reporter Partner Code
Commodity Description
World
Zambia
H2-01
Live animals
Zambia World H2-0101 Live horses, asses, mules and hinnies.
Live horses/asses/mules/hinnies:
Zambia World H2-010110 pure-bred breeding animals

Trade
Value
519675
16525
69

Pour viter le double comptage, il faut sen dbarrasser et ne garder que les lignes six
chiffres. Pour cela on peut utiliser la fonction length :8
Rename commoditycode hs ;
gen pseudolevel=length(hs) ;
gen level=pseudolevel-3 ;
keep if level==6 ;

Supposons maintenant que lon veuille faire lopration inverse (lagrgation) sur une
variable x contenue dans une base de donnes o lagrgation nest pas faite
automatiquement. Supposons que la variable identificatrice, appelons-la class, soit une
variable numrique 8 chiffres. Il va falloir commencer par la rduire aux 6 de gauche
pour agrger la variable x. La nouvelle variable identificatrice sera appele hs6. La
8

Cela peut dailleurs aussi se faire en excel, en gnrant une variable de comptage des chiffres du code,
appelons-la par exemple level , par la fonction LEN (avec comme argument la cellule contenant le
commodity code ). Cette variable sera gale 5 pour la premire ligne (elle compte le trait dunion), 7
pour la deuxime et 9 pour la troisime. On rimporte en stata et on lui dit keep if level==9 .

29

procdure est dabord de mettre hs8 en mode string puis de la rduire six chiffres en
liminant les deux derniers :
gen str8 hs8=string(class,%8.0f)
gen str6 hs6=substr(hs8,1,6)

Dans lexpression substr(hs8,1,6), le second argument (1) indique quel chiffre de


lancien string le nouveau doit commencer (si ngatif, combien de chiffres de la fin) et
le troisime indique la longueur du nouveau string. Donc
gen str6 hs6=substr(hs8,-8,6)

donne la mme chose. Puis on aggrge x par


sort hs6
by hs6: egen agx=sum(x)

ce qui donne un vecteur de valeurs identiques pour x lintrieur de chaque classe de hs6.
On peut dailleurs combiner ces deux commandes par
by sort hs6: egen agx=sum(x)

Enfin on supprime les lignes redondantes par


collapse agx, by(hs6)

Attention, ne surtout pas taper simplement collapse agx hs6 vu quil ne resterait
quune ligne. Il faut simplement supprimer de la liste de variables celles qui ne sont pas
agrges (class, hs8 et x) vu quelles nont plus de sens aprs lagrgation. Aucune
variable alphanumrique ne doit tre dans la liste de variables, car collapse ne peut
admettre que des variables numriques comme argument. Toutes les variables
alphanumriques quon veut garder (et qui doivent donc tre constantes dans chaque
catgorie agrge) doivent tre mises dans loption by(), qui en admet autant quon veut.
Par contre dans by() on peut mettre des variables numriques.
Pour agrger des donnes HS2 en chapitres, il faut dabord les agrger au niveau HS2. Il
reste alors en principe 99 lignes. Il faut alors copier du fichier chapitresSH.dta les
deux colonnes (HS2 et chapitre) qui donnent la clef, puis agrger de nouveau par la
mme procdure en utilisant chapitre comme variable catgorielle.
A propos de lignes redondantes, si on souponne quun fichier donnes a, pour Dieu sait
quelles raisons, plusieurs valeurs pour une mme ligne HS alors quil ne devrait en avoir
quune (eh oui, ces choses-l arrivent) ; on peut vrifier en tapant
isid hs8 using filename, sort

et sil y a des doublons stata dira quelque chose comme identifier not unique .

30

Calculer un tarif moyen pondr


Soient import la variable reprsentant les valeurs en douanes importes, class la
classification HS en format alphanumrique9, et tarif la variable tarif.
Pour un tarif moyen pondr agrg sur toutes les lignes tarifaires, la procdure est :
egen agimport=sum(import)
generate wimport=import/agimport
generate intermed=wimport*tarif
egen wtarif=sum(intermed)

ce qui donne une colonne (wtarif) de constantes gales au tarif moyen pondr.
Pour un tarif moyen pondr agrg, la procdure est
(i) tarif pondr par HS2
generate str2 HS2=abbrev(class,2)
sort HS2
by HS2: egen import2=sum(import)
generate w2import=import/import2
generate intermed2=w2import*tarif
egen w2tarif=sum(intermed2)
collapse variable list, by(HS2)

(ii) tarif pondr par chapitre


sort HS2
cd c:\data
merge HS2 using chapitresSH
save ``path\tarifchapitre.dta``
sort chapitre
by chapitre: egen import3=sum(import)
generate w3import=import/import3
generate intermed3=w3import*w2tarif
egen tarifchapitre=sum(intermed3)
collapse variable list, by(chapitre)

A propos, si par hasard la classification se prsente en excel sous forme de plusieurs colonnes (des fois a
arrive), style 010 dans la case A1 et 200 dans la case B1 alors que le vrai code est 010200, on peut reconsolider dans une seule colonne en en gnrant une nouvelle en tapant dans la premire case de la
nouvelle =A1&A2, ce qui donnera 010200.

31

Transformer des droits spcifiques en nimporte quoi


Supposons que des donnes tarifaires se prsentent de la faon suivante :
Description
MFN applied duty
MFN applied duty
MFN applied duty
MFN applied duty
MFN applied duty
MFN applied duty
MFN applied duty

HS
52063200
52063300
52063400
52063500
52064100
03026970
03026990

Description
Measuring per single yarn
Measuring per single yarn
Measuring per single yarn
Measuring per single yarn
Measuring per single yarn
Red-eye sardine
Other

AV Duty Rate
NULL
NULL
NULL
NULL
NULL
NULL
NULL

Specific Duty Rate


18% with a maximum of 700c/kg
18% with a maximum of 700c/kg
18% with a maximum of 700c/kg
18% with a maximum of 700c/kg
18% with a maximum of 700c/kg
25% or 70c/kg
25% or 70c/kg

Problme : quoi faire du droit spcifique ? Dans ce cas-l la mthode la plus simple est de
ne considrer que la premire partie de lexplication (18% ou 25%) et dignorer le reste.
Pas trs propre mais mieux que de gnrer des centaines de variables manquantes,
quelquefois justement dans les secteurs sensibles qui nous intressent (ici les textiles). La
procdure est alors de
1. Rduire la variable Specific Duty Rate (un string, videmment) 3 lettres, celles qui
nous intressent (18% ou 25%).
2. Dfinir deux nouvelles variables, numriques celles-l, gales aux taux en question,
3. On les additionne.
4. On remplace NULL par 0 dans la variable AV Duty Rate pour pouvoir lui enlever son
string
5. On vrifie que chaque fois quil y a un droit spcifique le taux ad-valorem est zro,
6. et finalement on additionne le droit ad-valorem avec le pseudo-quivalent ad-valorem
du droit spcifique.
Ce qui nous donne quelque chose comme
gen str10 sdutyrate=substr(specificdutyrate,1,10) ;
gen spec1=18 if sdutyrate=="18%" ;
gen spec2=25 if sdutyrate=="25%" ;
egen AVequiv=rsum(spec1 spec2) ;
drop spec1 spec2;
replace
destring
count if
count if

AVdutyrate="0" if AVdutyrate=="NULL" ;
AVdutyrate, replace ;
AVequiv!= 0 ;
AVdutyrate!=0 & AVequiv!=0 ;

replace AVdutyrate=AVequiv if AVequiv!=0 ;


rename AVdutyrate AVtariff ;
label
variable AVtariff "Ad val. applied MFN tariff" ;

Tout cela est un bidouillage, rien de plus, car un vrai quivalent ad-valorem de droit
spcifique doit tre calcul partir des valeurs unitaires, mais bon cest un dbut.

32

Identifier source et destination dans le commerce bilatral


Supposons que lon ait des donnes de commerce bilatral se prsentant de la faon
suivante :
reporter
ARG

partner
PRY

flowname
Import

Value
3.8

ARG

URY

Export

100.264

ARM
ARM

CHE
GEO

Import
Import

502.478
26.122

ARM

USA

Import

54.268

AUS

HKG

Export

1.427

AUS
AUS

IDN
NZL

Export
Export

2.253
24.465

AUS
AUT

USA
BRA

Import
Import

2.033
53.22

AUT

CAN

Import

389.476

Selon que le flux est Export ou Import , le pays cod comme reporter est soit la
source soit la destination. On veut rarranger les donnes de faon avoir une colonne
source et une colonne destination. Pour cela, le plus simple est de donner un code
numrique aux pays, qui sera plus facile manipuler quun identifiant alphanumrique.
Premire tape, gnrer un fichier-pays (une liste de pays complte), puis le coder en
gnrant la variable _n, quon appellera code. Le fichier listant les pays, countries.dta, a
donc deux variables, country (un identifiant trois lettres) et code (un chiffre).
On copie cette liste initiale dans deux fichiers spars, un dans lequel lidentifiant trois
lettres est appel reporter et _n est appel reportercode, et un dans lequel il est appel
partner et _n partnercode :
use countries.dta ;
rename country reporter ;
rename code reportercode ;
sort reporter ;
save reporter.dta, replace ;
use countries.dta, clear ;
rename country partner ;
rename code partnercode ;
sort partner ;
save partner.dta, replace ;

On fusionne ces deux fichiers, successivement, avec le fichier de base (flow.dta) dont le
tableau ci-dessus est une extraction, une fois par reporter, une fois par partner.
use flow.dta, clear ;
sort reporter ;
save flow.dta, replace ;
merge reporter using reporter.dta ;

33

drop _merge ;
sort partner ;
save flow.dta, replace ;
merge partner using partner.dta ;
drop _merge ;

On a alors deux colonnes de codes numriques (reportercode et partnercode). On peut


faire tous les bidouillages quon veut. En loccurrence, ce que lon veut, cest gnrer des
codes par exportateur et importateur plutt que reporter et partner. On commence par
gnrer une variable muette gale un quand le flux est Export :
gen export=(flowname=="Export") ;

puis on gnre des codes exportateur et importateur via deux variables


intermdiaires :
gen exporter1=reportercode if export==1 ;
gen exporter2=partnercode if export==0 ;
recode exporter1 .=0 ;
recode exporter2 .=0 ;
gen exportercode=exporter1+exporter2 ;
drop exporter1 exporter2 ;
gen importer1=partnercode if export==1 ;
gen importer2=reportercode if export==0 ;
recode importer1 .=0 ;
recode importer2 .=0 ;
gen importercode=importer1+importer2 ;
drop importer1 importer2 ;

et on garde ce qui nous intresse :


keep partner reporter flowname exportercode importercode value ;
sort exportercode importercode ;
save newflow.dta, replace ;

Dernire tape, pour faire joli on rintroduit les identifiants-pays trois lettres, dabord
en les renommant dans le fichier-liste countries.dta puis en fusionnant avec le fichier-flux
flow.dta (le renommage est ncessaire pour la fusion) :
use countries.dta, clear ;
rename code exportercode ;
rename country exporter ;
sort exportercode ;
save exporter.dta, replace ;
use countries.dta, clear ;
rename code importercode ;
rename country importer ;
sort importercode ;
save importer.dta, replace ;
use newflow.dta, clear ;

34

sort exportercode ;
merge exportercode using exporter.dta ;
drop _merge ;
/* ce stage un tas dobservations absurdes sont gnres, Dieu sait
pourquoi... */
sort importercode ;
merge importercode using importer.dta ;
drop _merge ;
/* encore dautres, ne pas saffoler, juste les virer en douceur...*/
drop if value==. ;
sort reporter partner ;
save newflow.dta, replace ;

ce qui donne ceci :


reporter

Partner

flowname

Value

exportercode

Importercode

exporter

Importer

ARG

PRY

Import

3.8

105

PRY

ARG

ARG

URY

Export

100.264

130

ARG

URY

ARM

CHE

Import

502.478

21

CHE

ARM

ARM

GEO

Import

26.122

45

GEO

ARM

ARM

USA

Import

54.268

131

USA

ARM

AUS

HKG

Export

1.427

53

AUS

HKG

AUS

IDN

Export

2.253

57

AUS

IDN

AUS

NZL

Export

24.465

97

AUS

NZL

AUS

USA

Import

2.033

131

USA

AUS

AUT

BRA

Import

53.22

17

BRA

AUT

AUT

CAN

Import

389.476

20

CAN

AUT

Estimation : quelques bidouillages


Sauvegarder des rsultats, mme quand ils sont absurdes
Sauvegarder des statistiques descriptives

sum x ;
gen x_bar = r(mean) ;
gen sigma_x = r(sd) ;

35

Sauvegarder valeurs prdites et rsidus


Pour sauvegarder les valeurs prdites (en gnrant une nouvelle variable yhat) et rsidus
(en gnrant une nouvelle variable residuals), les commandes sont
predict yhat
predict e, residuals

Par dfaut cest les valeurs prdites qui sortent.

Sauvegarder des coefficients absurdes


Supposons quaprs avoir estim une quation, disons de gravit avec un quota et un
tarif, on veuille estimer lquivalent tarifaire du quota. Lquation (faut quil ny en ait
quune seule pour ce qui va suivre) est
reg lntrade lntariff quota lndistance lnmGDP lnxGDP Y1-Y15 M1-M96 X1X118, noconst ;

et on veut sauvegarder les coefficients du quota et du tarif (la variable quota est muette et
gale 1 pour les paires de pays ou celui de destination impose un quota sur le pays
source, une faon trs primitive de capturer leffet du quota). Pour garder ces
estims en mmoire mme aprs avoir fait dautres estimations on gnre des nouvelles
variables gales ces coefficients par la commande _b[varname] :
gen beta_t = _b[lntariff];
gen beta_Q = _b[quota];

ou pour la constante
gen constant = _b[_cons] ;

sinon on fait directement le calcul dquivalent tarifaire, quon fait apparatre dans le log
par la commande display :
gen t = exp(_b[quota]/_b[lntariff]) 1 ;
display t ;

Plus gnralement, toutes les commandes de stata gardent leur rsultat en mmoire dans
trois types de macros, les r , les e et les s . On peut accder la liste de ces
macros en tapant return list, ereturn list ou sreturn list.
Par exemple, les estims de rgression et leurs variances sont sauvegards sous forme de
macros dans e(.), et on peut les transformer en variables apparaissant dans la base de
donnes (sur la premire ligne uniquement, puisquil sagit de scalaires) en tapant :
reg y x

36

mat b=e(b)
svmat b

La premire commande (mat b=e(b)) gnre un vecteur-ligne b dont les lments sont
ceux de e(b), i.e. les coefficients. La deuxime (svmat b) gnre k variables b1, b2.... bk,
chacune avec une seule observation (sur la premire ligne), correspondant aux k
coefficients estims par la rgression prcdente, mais attention le coefficient de la
constante vient toujours en dernier, donc on peut ajouter rename bk b0 pour tre sr de
ne pas confondre. On peut donner le nom quon veut la place de b. Si on voulait garder
les coefficients dans une seule variable A1 (en colonne), on sauverait la transpos de la
matrice e(b),
mat b=e(b) ;
svmat b ;

Pour sauvegarder la matrice de variances-covariances des coefficients, la commande est


mat v=e(V) ;
svmat v ;

On note que largument dans e(V)est en majuscule. Ce quon obtient est une matrice
k k (ou k est le nombre de coefficients y compris celui de la constante, qui vient
toujours en dernier dans stata) et les variances sont sur la diagonale (donc 2 est sur

( )

( )
1

la premire ligne et la premire colonne, et ainsi de suite jusqu 2 k , la variance du


coefficient sur la constante, qui est sur la k-ime ligne et la k-ime colonne.

Estimation
OLS and WLS
OLS cest
reg y x

Avec des contraintes (par exemple 1 = 1 et 2 = 3 ) cest


constraint define 1 x1 = 1
constraint define 2 x2 = x3
cnsreg y x1 x2 x3, c(1,2)

Pour WLS, la commande est


reg y x [aweight = z], nocons

37

o [aweight = z] nest pas une option mais vient avant la liste des options (par
exemple nocons)

Estimations spares par anne


On peut utiliser la procdure foreach pour des estimations spares par anne.
Supposons que la variable dpendante est yt avec t = 2001, 2002,200 3 et les rgresseurs
xt et zt. La commande est tout simplement
foreach t of numlist 2001 2002 2003 { ;
reg y x z if year==`t ;
} ;

et on pourra rcuprer les valeurs prdites et les rsidus anne par anne, par exemple,
avec
predict yhat`j ;
predict resid`j', resid ;

Sure
La commande est
sureg (eq1 : y1 x1 x2 x3, options) (eq2 : y2 x1 x2)
predict y1hat, equation(eq1) ;

Parmi les options, aweight et fweight fonctionnent mais pas pweight.

2sls
Supposons que lon veuille estimer le systme suivant
y = 0 + 1 x1 + 2 x2 + 3 x3 + u
x1 = 0 + 1 y + 2 z2 + 3 z3 + v.

La commande est alors


ivreg y x2 x3 (x1 = z1 z2 z3)

et la plupart des options de reg (OLS) sont permises. Le test dendognit de Hausman
est entr de la faon suivante :
ivreg y x2 x3 (x1 = z1 z2 z3) ;
hausman, save ;

38

reg y x1 x2 x3 ;
hausman, constant sigmamore ;

et loutput dit si la diffrence des coefficients entre les deux regressions (un chi carr) est
significative ou non. Si elle est significative (Prob>chi2 infrieure 0.05) lhypothse
nulle (pas dendognit) est rejete et les estims OLS sont inconsistants.

GMM
La commande pour lestimateur GMM est
xtabond y x z, lag(1)

o loption spcifie le nombre de retards utiliss comme instruments.


Si on veut utiliser lestimateur dit system-GMM de Blundell et Bond, le programme
doit tre descendu du web par findit xtabond2. Le system GMM estime une quation
simultanment en niveaux et en diffrences et instrumente les niveaux par les diffrences
contemporaines et les diffrences par les niveaux retards. La commande est
xtabond2 y L.y x z t1-tn, gmm(y x z, lag(1 1)) iv(x) robust nomata

o t1-tn sont des effets-temps, z est exogne, et x est endogne. Lestimateur utilise par
dfaut toutes les valeurs retardes des variables endognes disponibles dans lchantillon.
Il y a alors souvent trop dinstruments, un problme qui se manifeste dans une p-value du
test de Hansen proche de 1. En gnral il vaut mieux quil ny ait pas plus dinstruments
que dindividus dans le panel. Loption lag(1 1) permet de limiter le nombre de retards
utiliss une priode. Loption nomata vite un problme que je nai jamais compris.

Variables dpendantes limites


Tobit

Supposons que lon veuille rgresser une variable y censure zro et un sur x. La
commande est
tobit y x z, ll(0) ul(1)

o ll(.) est ul(.) sont les bornes infrieures et suprieures respectivement. Pour avoir
les effets marginaux, il faut descendre dtobit2 en tapant findit dtobit2 (Dieu sait
pourquoi la commande dtobit bugge). Sinon on peut utiliser la commande postestimation
mfx compute

39

mais elle est bestialement gourmande en calculs.


Probit

Lestimation et les effets marginaux sobtiennent en Stata7 de la faon suivante. Soient x,


y, et z trois variables respectivement catgorielle (x), binaire (y) et continue (z). La
variable dpendante est y. Supposons qux aille de 1 8 et que lon veuille son effet
marginal la valeur x = 7. Les commandes sont
probit y x z
matrix xvalue=(7)
dprobit y x z, at(xvalue)

La premire ligne estime le probit de faon conventionnelle et donne les coefficients. La


seconde dfinit la valeur laquelle leffet marginal est calcul (par dfaut, cest--dire
sans la seconde ligne et loption dans la troisime, cest la moyenne). La troisime ligne
demande les rsultats sous forme deffets marginaux plutt que de coefficients. Loption
robust peut tre utilise avec probit.
Supposons que lon veuille compter le nombre dobservations pour lesquelles y = 1 et
lquation donne Prob(y=1) > 0.5 ou bien y = 0 et Prob(y=1) < 0.5 (une mesure ad hoc
du fit de lquation). La srie de commandes est
predict yhat ;
gen predicted=(yhat>=0.5) ;
count if (predicted==1 & y ==1) | (predicted==0 & y ==0) ;

Enfin, noter que outreg utilis avec un probit ne donne pas par dfaut le pseudo-R2. Il
faut prciser
outreg x1 x2, addstat(Pseudo R-squared, e(r2_p))

Variables instrumentales en probit :

La commande est ivprobit et la syntaxe est


ivprobit y x2 x3 (x1 = z1 z2 z3)

o x1 est le regresseur endogne et z1-z3 sont les instruments.


Multinomial logit

Syntaxe du multilogit : soit y { y1 , y2 ,...} la variable de choix. La commande pour


choisir la catgorie de base par rapport laquelle tous les coefficients seront calculs
(disons y1) est
mlogit y x1 x2 x3, basecategory(y1)

40

En mlogit les coefficients ne sont pas interprtables directement (ratios de probabilits) ;


les effets marginaux des variables x1 et x2 (par dfaut toutes) calculs aux valeurs
valeur1 et valeur2 (par dfaut aux moyennes) sur la catgorie y1 (par dfaut toutes) sont
obtenus avec
prchange x1 x2, x(x1=valeur1) x(x2=valeur2), outcome(1)

Pour les rgresseurs binaires le delta par dfaut est de un. A noter, prchange ne
fonctionne pas avec svymlogit, la commande de multilogit pour les enqutes.
Une commande alternative qui fonctionne avec svymlogit est
mfx compute, predict (outcome(1)), eyex at(median x1)

qui donne galement les carts-type et peut donner des lasticits directement (eyex) ou
en semi-log (voir [R] mfx), et peut tre value l o on veut (ici mdiane du rgresseur
x1). Il faut rpter la commande pour chaque catgorie de la variable dpendante.
Attention le calcul est lourd et prend quatre sicles, dautant plus quen Stata7 on ne peut
pas limiter la liste de rgresseurs inclus dans les calculs.
Negative binomial

nbreg y x, exposure(z)

Graphiques
La commande de base est twoway suivie du type de graphique (line, bar, scatter, hist) et
des variables, dabord celle sur laxe vertical puis celle sur laxe horizontal. Pour
sauvegarder un graphique, on tape
graph save graph1, replace

et pour le r-ouvrir,
graph use graph1

Graphiques avec courbes ou barres


Pour un graphe avec des courbes cest
graph twoway line y x, xscale(range(0 100)) yscale(range(0 100)
xlabel(0(2)18)

41

o xscale et yscale donnent le minimum et le maximum sur les axes (utile par
exemple si on veut une symtrie), xlabel(0 10 to 100) et ylabel(0 10 to 100)
fixent les marques sur les axes (ici toutes les 10 units), c(l) dit Stata de relier les
points par une ligne, et s(i) lui dit de rendre les marqueurs invisibles, ce qui donne une
simple ligne. Les variables apparaissent automatiquement sous leur label et pas sous leur
nom de variable si on a spcifi un label par la commande
label variable x nimporte quoi

Il y a plusieurs faons de mettre deux courbes sur le mme graphique. En voici une :
twoway line y1 x, lpattern(l) xtitle() ytitle() || line y2 x,
lpattern(_)

o lpattern(l) indique que la ligne reprsentant y1 sera pleine et lpattern(_) que la


ligne reprsentant y2 aura des tirets longs.
Pour des barres avec ajustement de la couleur, cest
twoway bar count revokey, fcolor(gs15) xtitle(Revocation year) ytitle(#
of cases) ;

o gs15 donne un gris trs clair (pour economiser lencre de limprimante).


Pour un histogramme de la variable x, la commande la plus simple est
hist x, bin(10) xscale(range(0 100)) xtick(0(10)100) xlabel(0(10)100)

et le nom de la variable devra tre mis dans loption xtitle(my title). Si on veut la
densit la place dun histogramme, la commande est
kdensity x, n(100) width(0.01) normal ;
twoway (kdensity GDPpc, gaussian width(0.01) n(100))

o loption n(100) donne le nombre dobservations utilises (plus il y en a moins la


densit est lisse), width(0.01) dtermine la largeur des intervalles (important pour
viter que le graphique ne bave sur des valeurs hors de lintervalle permissible droite et
gauche) et loption normal superimpose sur le tout une distribution normale (je
suppose avec les mmes moyennes et variances) pour amuser le lecteur.
Si on veut raffiner la prsentation, on peut donner des prcisions sur lapparence des
lignes, ce qui peut tre important quand on veut superimposer plusieurs courbes sur le
mme graphique ; exemple
twoway (kdensity x, lpattern(longdash) lwidth(medthick)) ///
(kdensity y, lwidth(medthick) lcolor(red)) ///
(kdensity z, lpattern(shortdash_dot) lwidth(medthick) lcolor(blue))

42

On peut aussi spcifier des sous-options. Ainsi dans


hist x, width(10) xlabel(0(20)220, alternate format(%9.0fc)) percent

10

Percent
20

30

40

la sous-option alternate lintrieur de xlabel(0(20)220,) fait alterner la position


des chiffres le long de laxe pour quils ne se chevauchent pas et la sous-option
format(%9.0fc) limine les dcimales de ces chiffres, ce qui donne

40
20

80
60

120
160
200
100
140
180
220
avepm

On note que les tiquettes sarrtent 220 alors que les donnes vont plus loin ; viter
bien sr.

Nuages de points
Pour un nuage de points la commande est
graph twoway scatter y x, xtitle() ytitle()

De la mme faon, un scatterplot de y sur x avec la droite de rgression sera obtenu par
reg y x
twoway (scatter y x) (lfit y x)

ou bien
reg y x
twoway scatter y x || lfit y x

Si on veut avoir une courbe pour une rgression polynomiale, on peut taper
twoway (scatter y x) (qfit y x)

43

-2

et si on veut lintervalle de confiance autour des valeurs prdites on tape lfitci ou


qfitci au lieu de lfit ou qfit, ce qui donne le joli graphe

-2

-1

0
x
y
Fitted values

95% CI

Supposons que lon veuille un scatterplot de y par rapport x avec une droite reprsentant
la diagonale. On veut donc viter de relier les observations de y en fonction de x (un
nuage) mais par contre on veut relier les observations le long de la diagonale pour avoir
une ligne 45o. La srie de commandes est alors
gen diagonal=x ;
label variable y "Zambia's stats (log scale)" ;
label variable x "mirrored stats (log scale)" ;
twoway (scatter d x) (line diagonal x), xscale(range(018))
yscale(range(0 18)) xlabel(0(2)18) ylabel(0(2)18) ;

Le tout donne
Zambia's stats (log scale)

diagonal

18
16
14
12
10
8
6
4
2
0
0

8
10
12
mirrored stats (log scale)

14

16

18

ce qui ne paye peut-tre pas de mine mais en couleur est beaucoup mieux (pas la moindre
ide comment rcuprer les couleurs, par contre). En loccurrence le nuage est tronqu
horizontalement 6 parce quil ny a pas de valeur miroir au-dessous de e6=403'000
dollars (pas de raison spciale).

44

Pour un nuage de points avec pour chacun une tiquette donne par la variable cty_name,
la commande est
twoway scatter y x, mlabel(cty_name) legend(off)

Souvent le problme est que les etiquettes se chevauchent ou sont trop prs, comme cest
le cas ici avec Canada et South Africa:
100

Mexico

Average measures duration


40
60
80

USA

Venezuela
EU

Canada
South Africa

South Korea
Taiwan
Australia
Turkey
Argentina
New Zealand

20

China

50

100
Average duty rate

150

200

Le problme se rsout en gnrant une variable, pos, dont la valeur est la position de
ltiquette par rapport au point exprime en heure dhorloge (12 = en haut, 3 = droite, 6
= en bas etc.), et en ajustant cette variable :
gen pos
replace
replace
replace

= 3
pos = 11 if cty_name=="EU"
pos = 4 if cty_name=="South Africa"
pos = 2 if cty_name=="Canada"

twoway scatter l_bar t_bar, mlabel(cty_name) mlabv(pos) legend(off)

ce qui donne

45

100

Mexico

Average measures duration


40
60
80

USA

EU

Venezuela
Canada
South Africa
South Korea
Taiwan
Australia
Turkey
Argentina
New Zealand

20

China

50

100
Average duty rate

150

200

Si on ne veut des tiquettes que pour certains points, il faut dfinir une nouvelle variable
comme ceci
gen show_tag =
(cty_name=="ARG" | cty_name=="BRA" | cty_name=="BEL" | cty_name=="BRA"
| cty_name=="CHL" | cty_name=="COL" | cty_name=="ECU" | cty_name=="PER"
| cty_name=="PRY" | cty_name=="URY" | cty_name=="VEN") ;
gen str3 tag = cty_name if show_tag==1 ;
twoway scatter l_bar t_bar, mlabel(tag) mlabv(pos) legend(off)

Si la place des points on veut avoir des bulles, disons bleues, dont la taille est
proportionnelle une troisime variable z, la commande devient
twoway scatter y x [weight = z], msymbol(circle) mcolor(ltblue)

mais on ne peut plus avoir dtiquettes (si on ajoute loption mlabel(cty_name) alors
[weight = z] devient inoprant). Il faut alors copier-coller le graphique sur powerpoint
et les ajouter la main.

Regressions non paramtriques ( smoother reg )


Pour une rgression non paramtrique dune variable x sur les centiles dune distribution
(disons le coefficient de Gini calcul sur les exportations dun pays, rgress sur le
revenu par habitant pour voir comment la diversification volue avec le revenu), la
commande est
xtile centile = gdpcap, nquantiles(100) ;
collapse(mean) Gini gdpcap, by(centile) ;
lowess Gini centile, bwidth(0.8) ;

On revient sur cette mthode plus bas pour les effets de changements de prix par tranche
de revenu.

46

Enqutes sur les scnes de mnages


The goverment are very keen on amassing statistics. They collect them, add them, raise them to
the nth power, take the cube root and prepare wonderful diagrams. But you must never forget that
every one of these figures comes in the first instance from the village watchman, who just puts
down what he damn well pleases.
Anonyme, cit dand Sir Josiah Stamp,
Some Economic Factors in Modern Life.10

Les commandes statistiques ordinaires (moyenne, regression etc.) appliques une


enqute de mnages donnent des estims biaiss (voir Deaton 1997). Stata a plusieurs
commandes qui permettent de tenir compte de la structure de lenqute.
Supposons que l'enqute soit divise en diffrentes strates, que dans chaque strate, on ait
tir au sort un certain nombre de villages (qu'on appelle Primary Sampling Unit, ou PSU)
et que dans chaque village un certain nombre de mnages soit tir. Supposons aussi que
la variable identifiant la strate s'appelle strataid, que celle identifiant le village s'appelle
id_comm et que celle indiquant le poids du mnage s'appelle poids. La syntaxe pour
indiquer cette structure stata est
svyset [pweight=poids], strata(strataid) psu(id_comm);

en Stata8 et
svyset pweight poids ;
svyset strata strataid ;
svyset psu id_comm ;

en Stata7. Une fois que cette structure est dclare on na pas besoin de la rpter
chaque commande destimation. La commande svydes donne une description de
lenqute sous forme de tableau (combien de strates, de PSU etc)

Statistiques descriptives et manipulation de donnes


Moyennes, totaux et corrlations
La commande de moyenne est svymean et la commande de somme est svytotal. Celleci nest pas exactement equivalente sum car on ne peut pas enregistrer le rsultat
comme une nouvelle variable comme dans egen somme = sum(output). A la place, la
procdure est
10

Toujours le manuel de Shazam

47

svytotal output;
mat A=e(b);
svmat A;
rename A1 somme;

La premire ligne calcule la somme de output mais n'enregistre pas le rsultat qui est
stock momentanment dans e(b). La deuxime ligne gnre un scalaire A gal e(b),
dont la troisime fait une variable (A1) que la dernire renomme somme . Cette
nouvelle variable est la somme sur toutes les observations de la variable output dans
laquelle chaque observation est pondre selon la structure de lenqute. Pour trouver la
moyenne, mme chose avec svymean au lieu de svytotal.
Les moyennes conditionnelles ne peuvent pas non plus se faire avec la commande by,
comme par exemple by year: egen average=mean(output). On est oblig de faire a
catgorie par catgorie, par example
svymean output if year==1993;
mat B=e(b);
svmat B;
rename B1 average93;

et ainsi de suite pour chaque anne.


Supposons que lon veuille calculer les valeurs mdianes dun certain nombre de
variables. Il y a une faon subtile dutiliser la procdure introduite pour des variables
indices :
foreach x in "lnfamily" "lnchefmage" "lnchefmage2"
"chefmeduc" "lnmembresage" "inputs" "lndepenses"
"lnparcellesexpl" {;
gen `x'x=`x';

On note que la procdure foreach est ici utilise avec des variables sans indice, le x tant
la variable elle-mme ; les huit variables gnres sont lnfamilyx, lnchefmagex etc.
Ensuite on refait une procdure similaire pour les indicer par anne
foreach j of numlist 1993 1997 1999 2001{;
/*egen `x'p`j'=median(`x') if year==`j';*/
svymean `x' if year==`j';
mat A=e(b);
svmat A;
egen `x'p`j'=mean(A1);
mat drop A;
drop A1;
};
};

48

Les corrlations sont difficiles calculer en tenant compte des strates, clusters etc Or si
lon nen tient pas compte les estims risquent dtre gravement biaiss. La commande
pour les calculer est
corr_svy

qui peut tre descendue du web par findit corr_svy.

Calculer des indices dingalit


Il y a quelques trucs descendre du web en commenant par search ineqerr, do
Stata dirige sur son site pour descendre les fichiers ncessaires. Il y a aussi une
commande inequal mais je ne sais pas quelle est la diffrence. La commande ineqerr
donne le coefficient de Gini et lindice dentropie de Theil. Je crois quelle admet les
poids de redressement et tous les bidouillages utiliss dans les enqutes de mnage mais
pas trs clair comment. La syntaxe pour calculer par exemple les indices dingalit pour
le revenu des mnages ruraux (income avec une variable muette rural gale un) est
ineqerr income if rural==1

Loutput donne aussi les carts-type des estims de ces indices calculs par bootstrapping
(par dfaut, le nombre de tirages est 100).
La commande en Sata 7 pour les courbes de Lorenz est glcurve7 et la syntaxe est la
suivante. Supposons que les poids de redressement (fw) soient donns par la variable
wgt :
glcurve7 income fw=wgt if rural==1, Lorenz saving lorenz1.wmf ;

Supposons que lon veuille comparer la courbe de Lorenz en 1993 et 1997. Loption
saving lorenz1.wmf sert exporter le graphique en format .wmf, qui souvre en
ACDSee ou autre chose et peut tre copi-coll dans word ou import dans latex.
Si la base de donnes contient une variable year gale 1993 ou 1997 selon les
observations (on suppose quon a mlang deux enqutes de mnages), on dfinit dans la
commande une variable gl(income) que Sata va appeler, dans le graphe, income_1993 ou
income_1997, et on lui prcise by(year) et split :
glcurve7 income fw=wgt if rural==1, gl(income) by(year) split Lorenz
saving lorenz1.wmf ;

et on a les deux courbes sur le mme graphique.

49

Densits
Pour tracer une distribution du revenu (variable income), on utilise la commande de
kernel density de la faon suivante :
kdensity income [fweight=poids], nogr gen(y fy) ;

Quelquefois la densit est crase par des outliers. On lui met alors une borne suprieure
avec if income<=level. Les intervalles sur lesquels la densit est calcule sont ajusts
par loption width(#) o # est exprim en termes de income (la variable sur laxe
horizontal). Plus il est petit moins la densit est lisse. Il est possible que la densit
dmarre un niveau de revenu ngatif invent , cest juste que lintervalle sur lequel
la premire observation est centre dborde sur les chiffres ngatifs. Il se peut aussi que
la courbe soit plus lisse sans les poids, cest voir.
Si on veut plusieurs densits sur le mme graphique, la srie de commandes est un peu
plus complique :
kdensity income [fweight=poids] if income<=level, nogr gen(y fy) ;
kdensity income [fweight=poids] if year==1993 & income<=level93, nogr
gen(fy93) at(y) ;
kdensity income [fweight=poids] if year==1999 & income<=level99, nogr
gen(fy99) at(y) ;
label var fy93 "1993" ;
label var fy99 "1999" ;
gr fy93 fy99 y, c(ll) xlab ylab ;

La premire commande gnre la densit pour les deux annes et les variables y (income)
et fy (frquence). La deuxime et la troisime font la mme chose pour les annes 1993 et
99 sparment. Les deux commandes label font apparatre les labels plutt que les noms
de variables sur le graphique ; enfin la dernire gnre le graphique combin, avec des
lignes (ll) dans la commande c(ll) (c est pour connect ) et les labels sur les axes
horizontal (xlab) et vertical (ylab). Les symboles sur les courbes (triangles etc.) sont
choisis avec la commande s().

Effet de changements de prix par tranche de revenu


Une procdure sympa consiste tracer une courbe reprsentant limpact dun
changement de prix par tranche de revenu (disons centiles). La procdure est la suivante.
Soit 1993 lanne de base sur laquelle on analyse limpact du changement de prix
(delta_p) sur le revenu (income). La premire commande gnre les centiles de la
distribution du revenu :
xtile centile = income if year==1993,

nquantiles(100)

puis pour chaque centile on calcule le delta_p moyen


50

foreach j of numlist 1/100{ ;


svymean delta_p if centile==`j' ;

et on sauvegarde le rsultat par la procdure habituelle


mat A=e(b) ;
svmat A ;
rename A1 delta_p`j' ;
mat drop A ;

On a alors cent variables delta_p`j que lon veut combiner en une seule. Problme: elles
ont toutes le mme format, savoir un chiffre positif sur la premire ligne (premire
observation) et des valeurs manquantes pour tout le reste. On les transforme alors en
gnrant cent nouvelles variables delta2_p`j, des constantes dans lesquelles toutes les
valeurs manquantes sont remplaces par la valeur positive de la premire ligne:
egen delta2_p`j=mean(delta_p`j') ;

puis on transforme une nouvelle fois ces constantes pour quelles soient gales cette
valeur positive seulement dans le bon centile j (et codes comme valeurs manquantes
pour tous les autres centiles):
egen delta3_p`j'=mean(delta2_p`j) if centile==`j' ;

puis on laisse tomber les variables de calculs intermediaries et on ferme laccolade car on
na plus besoin de lindice j:
drop delta_p`j delta2_p`j ;
} ;

et on combine ces cent variables delta3_p`j en une seule en en faisant la somme


horizontale (avec egen, ce qui permet dadditionner travers les valeurs manquantes)
egen newdelta_p=rsum(delta3_p1-delta3_p100) ;

enfin on garde seulement ce dont on a besoin (on ne met ici que newdelta_p et centile
mais on peut vouloir garder dautres variables pour autre chose!)
collapse newdelta_p, by(centile) ;

et finalement on rgresse newdelta_p sur centile en utilisant le lowess smoother (ksm en


Stata7, lowess en Stata8) qui recalcule la pente de la droite de regression pour chaque
observation en prenant 40% de lchantillon gauche de lobservation et 40% droite,
soit 80% en tout (ce qui peut tre ajust avec bwidth()).
ksm newdelta_p centile, bwidth(0.8) ;

Le rsultat est une courbe indiquant que le changement de prix est favorable aux pauvres
si elle est pente ngative et favorable aux riches si elle est pente ngative. Une

51

procdure similaire peut tre utilise pour calculer leffet dun tarif par tranche de revenu
(le delta p est alors leffet du tarif sur le revenu rel moyen des mnages dans la tranche,
soit via les prix la consommation soit via les revenus soit les deux). Exemple :

-.5

Producer price index


.5
1
1.5

Lowess smoother

20

40

60

80

100

Centile
bandwidth = .8

Ici (Madagascar 1999-2001) le changement des prix la production est une fonction
ngative des centiles (classs par ordre croissant de revenu, les plus riches droite), donc
il est pro-pauvre . On note la distribution uniforme des points le long de laxe
horizontal : cest parce que lon a bien rgress les p sur les centiles et non sur les
niveaux de revenu. Pas trs intuitif, certes, mais on saperoit vite lusage que la
rgression sur les niveaux de revenu donne un graphique compltement diffrent. A
noter, aussi, avant de sexciter, que le sous-chantillon glissant recalcul par Stata
pour chaque observation est plus petit aux extrmes quau milieu (bien ncessairement,
sinon il ne pourrait pas tre diffrent pour chaque observation). Les non-linarits plus
marques observes souvent prs des extrmes en sont le reflet, donc interprter
prudemment.

Estimation sur des enqutes


Une fois que lon a indiqu Stata la structure de lenqute avec svyset/svydes, on
peut utiliser les commandes spciales (svyreg, svyprobit, svyivreg,
svyheckman,) sans avoir prciser chaque fois les poids, les clusters et les strates de
lchantillon, par exemple
svyreg y x1 x2 x3 ;

Si par contre on na rien dclar au dbut comme structure denqute, la commande est
svyreg [pweight=poids], strata(strataid) psu(id_comm);

52

Modles de slection
Supposons que lon veuille estimer sur des donnes denqute le modle

y = X + u1 ,
I * = Z + u2 ,
1 si I * > 0
I =
0 sinon,
avec u1 and u2 suivant une distribution normale avec moyenne zro et variances 2 et un
respectivement, et correlation . La version la plus simple de la commande est
svyheckman y x1 x2 x3, select(I=x1 x2 z1 z2)

et bien entendu de nombreux raffinements peuvent tre ajouts.

53

Quelques trucs en Mata

Pour construire une matrice mata avec des variables sauvegardees dans un fichier stata, la
commande est
st_view(X=.,.,("x1","x2"))

o le premier argument donne le nom, le deuxime lui dit de prendre toutes les
observations, et le troisime dfinit les colonnes par le nom des variables. La fonction
st_view fait la mme chose que la fonction st_data mais prend moins de mmoire car
elle ne fait que regarder les donnes au lieu de les stocker sparment.
Pour gnrer des variables mata contenant le nombre dobservations et de paramtres,
cest
N = rows(X)
k = cols(X)

Pour gnrer le vecteur beta en mata aprs une regression stata, cest pareil:
reg y x1 x2
mat coeff = e(b)
svmat coeff
mata
st_view(b=.,1,("coeff1","coeff2","coeff3"))
end

o le deuxime argument lui dit de ne garder que la premire observation, ce qui


transforme les variables stata cres par mat coeff = e(b) en un vecteur-ligne 1 x k.
Pour dfinir un vecteur-colonne mx1 contenant des 0 , on peut taper
real matrix iota(real scalar m) {
real matrix iota
iota = J(m,1,0)
return(iota)
}

Une variable contenant la trace dun produit de matrices se dfinit par


t = trace(A,B)

pour tr(AB) et
t = trace(A,B,1)

54

pour tr(AB).
Pour introduire une commande stata dans mata, cest
{
stata(`"drop _all"')
}

A noter : on ne peut pas faire de programme mata dans un programme : deux end lun
aprs lautre le font capoter. Il faut donc mettre toutes les commandes mata une par une
avec le prfixe mata : au dbut de chaque commande.

55

Vous aimerez peut-être aussi