Boucles sous Stata

Transcription

Boucles sous Stata
Evelyne Fournier
Registre des tumeurs du Doubs et du Territoire de Belfort
AcaDM
25-26 juin 2014
[email protected]
Organisation
 Préambule : macros locales
 Commandes répétées
 Présentation des principales commandes




WHILE
FORVALUES
FOREACH
FOR
 Boucles se servant de ce qui a déjà été calculé :
return list (commandes classe(r)) ou ereturn list (estimations)
 Boucles à travers les modalités d'une variable : levelsof
2
Macro locale
 Macro = boite dans laquelle on stocke des informations que l'on utilisera
ultérieurement
 Macro locale :
 créée dans un fichier ".do" ou ".ado"
 n'existe que dans le programme dans lequel elle est définie  Si lancée
manuellement, cesse d'exister dès la fin de la commande
 Quand on les appelle, Stata ne fait que remplacer leur nom par le texte
qu'elles contiennent avant d'exécuter la commande
 Quelques exemples plus concrets…
3
Macro locales 1
* macro locale=un nom
local malocale ma_macro
*Affichage :
display "Ma macro locale contient l(es) éléments suivant(s) :
`malocale'"
Ma macro locale contient l(es) éléments suivant(s) : ma_macro
* macro locale=une chaine de caractères
local machaine "ma chaîne de caractères"
*Affichage :
display "Ma macro locale contient l(es) éléments suivant(s) :
`machaine'"
Ma macro locale contient l(es) éléments suivant(s) : ma chaîne
de caractères
*macro locale=un nombre
local i 1
4
Macro locales 2
local X123 "X1 X2 X3"
// local X123 X1 X2 X3
display "Ma macro locale contient l(es)
éléments suivant(s) : `X123'"
Ma macro locale contient l(es) éléments
suivant(s) : X1 X2 X3
Application
5
Macro locales 3 – qdv.dta
variable name
identifiant
suivi
clage
niv_etude
statutm
residence
attit
spitzer
gh
pf
rf
ef
cf
sf
fa
na
pa
dy
ins
a
co
dia
fi
type
int
byte
byte
byte
byte
byte
byte
float
float
float
float
float
float
float
float
float
float
float
float
float
float
float
float
format
%8.0g
%8.0g
%9.0g
%10.0g
%9.0g
%11.0g
%8.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
%9.0g
label
variable label
Temps de suivi
clage
Classe age
niv_etude Niveau etude
statutm
Statut marital
residence Lieu de résidence
Attidude-perspectives
Global health
Physical
Role
Dimensions fonctionnelles
Emotional
Cognitif
Social functioning
Fatigue
Nausea
Pain
Dyspnea
Symptômes
Insomnia
Appetite Loss
Constipation
Diarrhea
Financial difficulties
6
Macro locales 4 – qdv.dta
statutm: (statut marital)
1 Celib
2 Marié
3 Veuf
4 Divorc
residence:
1 Domicile
2 Enfant
3 Institution
suivi : va de 0 à 3 (0=T0 1=T3 2=T6 3=T12 mois
clage: (classe age)
0 [65-74]
75 [75+]
niv_etude: (niveau études)
1 Primaire
2 Secondaire
3 Supérieur
99 NR
7
Macro locales 5
use qdv.dta
local functional "gh pf rf ef cf sf"
local symptom "fa pa na a dy co dia fi"
bysort suivi : regress spitzer `functional'
bysort suivi : regress spitzer `symptom'
Attention : présence de guillemets d'ouverture " ` " et de fermeture " ' "
8
Macro locales 6
bysort suivi : regress spitzer `functional'
suivi = 0
Source |
SS
df
MS
-------------+-----------------------------Model | 46.5989309
6 7.76648849
Residual | 52.3610691
18 2.90894828
-------------+-----------------------------Total |
98.96
24 4.12333333
Number of obs
F( 6,
18)
Prob > F
R-squared
Adj R-squared
Root MSE
=
=
=
=
=
=
25
2.67
0.0495
0.4709
0.2945
1.7056
-----------------------------------------------------------------------------spitzer |
Coef.
Std. Err.
t
P>|t|
[95% Conf. Interval]
-------------+---------------------------------------------------------------gh | -.0732396
.0232031
-3.16
0.005
-.1219876
-.0244916
pf | -.0219994
.0379852
-0.58
0.570
-.1018033
.0578045
rf |
.0041672
.0205688
0.20
0.842
-.0390462
.0473805
ef |
.0060237
.0295375
0.20
0.841
-.0560323
.0680797
cf |
.0352406
.0228835
1.54
0.141
-.0128358
.083317
sf | -.0034751
.025649
-0.14
0.894
-.0573615
.0504114
_cons |
9.45252
2.092727
4.52
0.000
5.055864
13.84918
-----------------------------------------------------------------------------suivi = 1
9
Macro locales 7
 Attention au signe égal
local x 2+2
di `x'
4
di "`x'"
2+2
local x=2+2
di `x'
4
di "`x'"
4
10
Intérêt des boucles
Répéter une même action sur plusieurs variables
var1 var2 var3 var4
modalité 1
modalité 2
modalité 3
modalité 4
modalité 5
modalité 6
modalité 7
modalité 8
modalité 9
modalité …
modalité n
var5 var6
var7 var8
var9
var…
varj
Répéter une
même action
pour
plusieurs
modalités
d'une
variable
action = data-management ou analyses statistiques ou graphiques etc
11
Commandes répétées
 Présentation des principales commandes
 WHILE
 FORVALUES
 FOREACH
 FOR
 Boucles se servant de ce qui a déjà été calculé :
return list (commandes classe(r)) ou ereturn list (estimations)
 Boucles à travers les modalités d'une variable : levelsof
12
Commande WHILE
 Tombée en désuétude au profit des commandes foreach et
forevalues
local i=1
Ecrire l'accolade à la fin de la ligne contenant le While
while `i' <=10 {
Ne rien écrire à droite de l'accolade
display "le numéro i est " `i'
Dans ce cas précis il faut incrémenter la
local i=`i'+1
macro i dans la boucle
} Ne rien écrire à droite de l'accolade
L'accolade doit apparaitre sur une ligne individuelle
13
Commande WHILE
while `i' <=10 {
2. display "le numéro i est " `i'
3. local i=`i'+1
4. }
le numéro i est 1
le numéro i est 2
le numéro i est 3
le numéro i est 4
le numéro i est 5
le numéro i est 6
le numéro i est 7
le numéro i est 8
le numéro i est 9
le numéro i est 10
14
Commande FORVALUES
 Parcours une plage de nombre et exécute une ou plusieurs
commandes pour chacun d'eux
forvalues i=1/5 {
gen var_`i'=var^`i'
}
: de 1 à 5 avec un pas de 1
1(1)5 : de 1 à 5 avec un pas de 1
5(20)85 : de 5 à 85 avec un pas de 20
10(-2)1 : de 10 à 1 avec un pas de -2
 forvalues i=1/5
 forvalues i =
 forvalues i =
 forvalues i =
15
Exemple FORVALUES
 Fichier d'exemple pmsi.dta
storage
display
value
variable name
type
format
label
variable label
-----------------------------------------------------------------------------num_patient
str1
%9s
diagdim
str7
%9s
Diagnostic Hospit DIM
datedim
str8
%9s
Date entrée DIM
diagreg1
str3
%9s
Diagnostic 1
datediag1
str8
%9s
Date de diagnostic 1
diagreg2
str6
%9s
Diagnostic 2
datediag2
str8
%9s
Date de diagnostic 2
diagreg3
str6
%9s
Diagnostic 3
datediag3
str8
%9s
Date de diagnostic 3
diagreg4
str6
%9s
Diagnostic 4
datediag4
str8
%9s
Date de diagnostic 4
16
Exemple FORVALUES
 Exemple :
 Convertir les dates diagnostics registre en format date %d
à l'aide de la commande forvalues
17
Exemple FORVALUES
 Convertir les dates en format date
* 4 diagnostics max registre  boucle sur les 1 à 4 dates de
diagnostics registre
forval i=1/4 {
gen adiag`i'=substr(datediag`i',1,4) // année d'entrée REGISTRE
gen mdiag`i'=substr(datediag`i',5,2) // mois d'entrée REGISTRE
gen jdiag`i'=substr(datediag`i',7,2) // jour d'entrée REGISTRE
gen double date_diag`i'=date(jdiag`i'+"/"+mdiag`i'+"/"+adiag`i',"DMY")
format date_diag`i' %d
}
l datediag1 date_diag1
18
Exemple FORVALUES
Résultat de la syntaxe
19
Commande FOREACH
 Fait boucler sur une liste d'éléments  puissantes possibilités
 foreach X in maliste
 utilisation d'une liste arbitraire
 foreach X of local maliste  utilisation d'une liste préalablement
définie dans une macro
foreach var in "liste de variable" {
macommande impliquant ma macro `var'
}
Exemple : anova à 1 facteur pour toutes les dimensions de qualité de
vie (15), tous les temps (4) et toutes les caractéristiques patients (4)
C’est-à-dire 15 x 4 x 4=240 analyses
En 1 (ou plusieurs) boucle(s)
20
Foreach - qdv.dta
statutm:
1 Celib
2 Marié
3 Veuf
4 Divorc
residence:
1 Domicile
2 Enfant
3 Institution
suivi : va de 0 à 3 (0=T0 1=T3 2=T6 3=T12 mois
clage:
0 [65-74]
75 [75+]
niv_etude:
1 Primaire
2 Secondaire
3 Supérieur
99 NR
21
Commande FOREACH – qdv.dta
Exemple : anova à 1 facteur pour toutes les dimensions de qualité de vie, tous les temps
et toutes les caractéristiques patients
forval tpssuivi=0/3 {
// boucle 1
foreach domaine in gh pf rf ef cf sf-fi {
// boucle 2
foreach caracteristics in clage niv_etude statutm residence {
// boucle 3
di "Analyse du domaine " "`domaine'" " pour la caractéristique
" "`caracteristics'" " pour le suivi " `suivi'
oneway `domaine' `caracteristics' if suivi==`tpssuivi'
} // fin boucle 3
} // fin boucle 2
} // fin boucle 1
22
Analyse du domaine gh pour la caractéristique clage pour le suivi 0
Analysis of Variance
Source
SS
df
MS
F
Prob > F
-----------------------------------------------------------------------Between groups
45.828631
1
45.828631
0.13
0.7222
Within groups
8863.63657
25
354.545463
-----------------------------------------------------------------------Total
8909.4652
26
342.671739
Bartlett's test for equal variances:
chi2(1) =
0.1299
Prob>chi2 = 0.719
Analyse du domaine gh pour la caractéristique niv_etude pour le suivi 0
Analysis of Variance
Source
SS
df
MS
F
Prob > F
-----------------------------------------------------------------------Between groups
537.665149
2
268.832575
0.77
0.4738
Within groups
8371.80005
24
348.825002
-----------------------------------------------------------------------Total
8909.4652
26
342.671739
Bartlett's test for equal variances:
chi2(2) =
1.3080
Prob>chi2 = 0.520
Analyse du domaine gh pour la caractéristique statutm pour le suivi 0
23
Commande FOR – qdv.dta
for var gh pf rf ef cf sf fa na : replace X=99 if X==.
for var niv_etude statutm residence : tab X clage
->
tab niv_etude clage
|
clage
niv_etude |
[65-74]
[75+] |
Total
-----------+----------------------+---------Primaire |
36
32 |
68
Secondaire |
16
8 |
24
Supérieur |
12
4 |
16
-----------+----------------------+---------Total |
64
44 |
108
->
tab statutm clage
24
Données stockées Stata
 return list : retourne des résultats stockés en mémoire
issues de commandes générales, stockés dans r()
 ereturn list : retourne des résultats stockés en mémoire
issues de commandes d'estimations, stockés dans e()
25
Utilisation données stockées
* exemple : créer des variables centrées réduites pour les 15 dimensions de qdv en
utilisant les données stockées dans r() et les boucles
use qdv.dta, clear
sum gh, detail
Global Health
------------------------------------------------------------Percentiles
Smallest
1%
16.66667
0
5%
25
16.66667
10%
33.33333
16.66667
Obs
108
25%
50
16.66667
Sum of Wgt.
108
50%
75%
90%
95%
99%
66.66666
83.33334
91.66666
100
100
Largest
100
100
100
100
Mean
Std. Dev.
Variance
Skewness
Kurtosis
63.88889
21.52663
463.3957
-.2854273
2.749382
26
Utilisation données stockées
return list
scalars:
r(N)
r(sum_w)
r(mean)
r(Var)
r(sd)
r(skewness)
r(kurtosis)
r(sum)
r(min)
r(max)
r(p1)
r(p5)
r(p10)
r(p25)
r(p50)
r(p75)
r(p90)
r(p95)
r(p99)
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
108
108
63.88888827076665
463.395669032029
21.52662697758358
-.2854273190223363
2.749381643946081
6899.999933242798
0
100
16.66666984558106
25
33.33332824707031
50
66.66665649414063
83.33334350585938
91.66665649414063
100
100
27
Utilisation données stockées
* Génération de variables centrées réduites cr=(xi-moy(x))/sd(x)
foreach domaine in gh pf rf ef cf sf fa na pa dy ins a co dia fi {
quietly sum `domaine' , detail
gen cr_`domaine'=(`domaine' - r(mean))/r(sd)
}
ou
foreach domaine in gh pf rf ef cf sf fa na pa dy ins a co dia fi {
quietly sum `domaine' , detail
gen cr_`domaine'=(`domaine' - `r(mean)')/`r(sd)'
}
28
Utilisation données stockées
use prenom.dta, clear
29
Utilisation données stockées
 Comparaison des prénoms : on veut savoir si l'un des prénoms d'une liste est
contenu dans l'un des prénoms de l'autre liste
 split les prénoms et comparaison 2 à 2 des prénoms
 mais combien de prénoms dans une variable et combien de prénoms dans l'autre ?
use prenom.dta, clear
split(prenom_reg), p(" ")
variables created as string:
prenom_reg1 prenom_reg2 prenom_reg3
prenom_reg4
return list
macros:
r(nvars) : "4"
r(varlist) : "prenom_reg1 prenom_reg2 prenom_reg3 prenom_reg4 "
local nbreg=`r(nvars)' // r(nvar) va disparaitre dès la
prochaine commande  sauvegarde dans macro locale nbreg
30
Données stockées
split(prenom_source), p(" ")
variables created as string:
prenom_source1 prenom_source2 prenom_source3 prenom_source4
prenom_source5
return list
macros:
r(nvars) : "5"
r(varlist) : " prenom_source1 prenom_source2 prenom_source3
prenom_source4 prenom_source5 "
local nbsource=`r(nvars)'
31
Données stockées
 Comparaison des 4 prénoms registre vs 5 prénoms source
gen comp=0
gen croist=0
forval i=1/`nbreg' {
forval j=1/`nbsource' {
replace comp=1 if prenom_reg`i'==prenom_source`j' ///
& prenom_reg`i' !="" & prenom_source`j'!=""
replace croist=`i'`j' if comp==1 & croist==0
}
}
32
Données stockées
 Attention, pour fonctionner cette série de syntaxe doit être
lancée en une seule fois car les macro locales `r(nvars)'
`nbsource' `nbreg' `i' `j' ne sont gardées en mémoire que le
temps de l'exécution de la syntaxe
33
Levelsof
 Affiche une liste triée du contenu distinct d'une variable
 fichier de travail : incidence.dta
 exemple : faire des graphiques identiques pour chacune
des localisations
34
Levelsoff incidence.dta
loc : localisation
cancéreuse
clage : classe
d'age
incid1/2 : taux
spécifique
d'incidence
homme/femme
morta1/2 taux
spécifique de
mortalité
homme/femme
35
Levelsof incidence.dta
tab loc
loc |
Freq.
Percent
Cum.
--------------------------------+----------------------------------Estomac |
18
20.00
20.00
Foie |
18
20.00
40.00
Larynx |
18
20.00
60.00
Rein |
18
20.00
80.00
Vessie |
18
20.00
100.00
--------------------------------+----------------------------------Total |
90
100.00
levelsof loc
`"Estomac"' `"Foie"' `"Larynx"' `"Rein"' `"Vessie"'
return list
macros:
r(levels) : "`"Estomac"' `"Foie"' `"Larynx"' `"Rein"' `"Vessie"'"
36
levelsof
levelsof loc
foreach lev in `r(levels)'{
preserve
keep if loc=="`lev'"
twoway (line incid1 clage, lcolor(blue) lwidth(thick)) ///
(line incid2 clage, lcolor(cranberry) lwidth(thick)) ///
(line morta1 clage, lcolor(blue) lwidth(thick) lpattern(dash)) ///
(line morta2 clage, lcolor(cranberry) lwidth(thick) lpattern(dash)), ///
title("`lev'", size(large) color(black)) ///
ytitle(Taux pour 100000 personnes-années) ///
ytitle(, margin(small)) ylabel(#10, ticks tlcolor(black)) ///
xtitle(Classe d'âge) xtitle(, margin(medsmall))
graph save "C:\FORMATION STATA\ACADM\Loc_`lev'_1_Gr_taux_spe", replace
restore
}
37
20
60
40
80
Taux pour 100000 personnes-années
0 5 10 15 20 25 30 35 40 45
0
20
Classe d'âge
Incidence Homme
Mortalité Homme
60
0
80
40
20
20
40
60
Classe d'âge
Incidence Homme
Mortalité Homme
80
Incidence Homme
Mortalité Homme
Incidence Femme
Mortalité Femme
Incidence Femme
Mortalité Femme
Vessie
Taux pour 100000 personnes-années
0
50 100 150 200 250 300
Rein
80
60
Classe d'âge
Incidence Homme
Mortalité Homme
Incidence Femme
Mortalité Femme
0
40
Classe d'âge
Taux pour 100000 personnes-années
0 20 40 60 80 100 120 140
0
Larynx
Foie
Taux pour 100000 personnes-années
0
20 40 60 80 100 120
Taux pour 100000 personnes-années
0 20 40 60 80 100 120 140 160
Estomac
0
20
40
60
80
Classe d'âge
Incidence Femme
Mortalité Femme
Incidence Homme
Mortalité Homme
Incidence Femme
Mortalité Femme
38
Conclusions
 Boucles
 Gain de temps
 Qualité : réduction des sources d'erreurs dus
aux copier-coller
39
[email protected]

Documents pareils

formation stata

formation stata “bweight lowbw” composent la "varlist", la liste des variables devant être listées “if sex==2” est "l'expression", elle informe stata de ne lister que les observations pour lesquelles la variable s...

Plus en détail