Evelyne Fournier Registre des tumeurs du Doubs et du ... · Quand on les appelle, Stata ne fait que...
Transcript of Evelyne Fournier Registre des tumeurs du Doubs et du ... · Quand on les appelle, Stata ne fait que...
Evelyne Fournier Registre des tumeurs du Doubs et du Territoire de Belfort
AcaDM
25-26 juin 2014
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 type format label variable label identifiant int %8.0g suivi byte %8.0g Temps de suivi clage byte %9.0g clage Classe age niv_etude byte %10.0g niv_etude Niveau etude statutm byte %9.0g statutm Statut marital residence byte %11.0g residence Lieu de résidence attit byte %8.0g Attidude-perspectives spitzer float %9.0g gh float %9.0g Global health pf float %9.0g Physical rf float %9.0g Role ef float %9.0g Emotional cf float %9.0g Cognitif sf float %9.0g Social functioning fa float %9.0g Fatigue na float %9.0g Nausea pa float %9.0g Pain dy float %9.0g Dyspnea ins float %9.0g Insomnia a float %9.0g Appetite Loss co float %9.0g Constipation dia float %9.0g Diarrhea fi float %9.0g Financial difficulties
Dimensions fonctionnelles
Symptômes
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
bysort suivi : regress spitzer `functional' suivi = 0 Source | SS df MS Number of obs = 25 -------------+------------------------------ F( 6, 18) = 2.67 Model | 46.5989309 6 7.76648849 Prob > F = 0.0495 Residual | 52.3610691 18 2.90894828 R-squared = 0.4709 -------------+------------------------------ Adj R-squared = 0.2945 Total | 98.96 24 4.12333333 Root MSE = 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
Macro locales 6
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
var1 var2 var3 var4 var5 var6 var7 var8 var9 var… varjmodalité 1modalité 2modalité 3modalité 4modalité 5modalité 6modalité 7modalité 8modalité 9modalité …modalité n
Répéter une même action sur plusieurs variables
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
while `i' <=10 {
display "le numéro i est " `i'
local i=`i'+1
}
Ecrire l'accolade à la fin de la ligne contenant le While Ne rien écrire à droite de l'accolade
Ne rien écrire à droite de l'accolade L'accolade doit apparaitre sur une ligne individuelle
Dans ce cas précis il faut incrémenter la macro i dans la boucle
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 : de 1 à 5 avec un pas de 1 forvalues i = 1(1)5 : de 1 à 5 avec un pas de 1 forvalues i = 5(20)85 : de 5 à 85 avec un pas de 20 forvalues i = 10(-2)1 : de 10 à 1 avec un pas de -2
forvalues i=1/5 { gen var_`i'=var^`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
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
Exemple : anova à 1 facteur pour toutes les dimensions de qualité de vie, tous les temps et toutes les caractéristiques patients
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% 66.66666 Mean 63.88889 Largest Std. Dev. 21.52663 75% 83.33334 100 90% 91.66666 100 Variance 463.3957 95% 100 100 Skewness -.2854273 99% 100 100 Kurtosis 2.749382
26
Utilisation données stockées return list
scalars:
r(N) = 108 r(sum_w) = 108 r(mean) = 63.88888827076665 r(Var) = 463.395669032029 r(sd) = 21.52662697758358 r(skewness) = -.2854273190223363 r(kurtosis) = 2.749381643946081 r(sum) = 6899.999933242798 r(min) = 0 r(max) = 100 r(p1) = 16.66666984558106 r(p5) = 25 r(p10) = 33.33332824707031 r(p25) = 50 r(p50) = 66.66665649414063 r(p75) = 83.33334350585938 r(p90) = 91.66665649414063 r(p95) = 100 r(p99) = 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
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
Utilisation données stockées
30
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)'
Données stockées
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
020
4060
8010
012
014
016
0Ta
ux p
our 1
0000
0 pe
rson
nes-
anné
es
0 20 40 60 80Classe d'âge
Incidence Homme Incidence FemmeMortalité Homme Mortalité Femme
Estomac
020
4060
8010
012
0Ta
ux p
our 1
0000
0 pe
rson
nes-
anné
es
0 20 40 60 80Classe d'âge
Incidence Homme Incidence FemmeMortalité Homme Mortalité Femme
Foie
05
1015
2025
3035
4045
Taux
pou
r 100
000
pers
onne
s-an
nées
0 20 40 60 80Classe d'âge
Incidence Homme Incidence FemmeMortalité Homme Mortalité Femme
Larynx
020
4060
8010
012
014
0Ta
ux p
our 1
0000
0 pe
rson
nes-
anné
es
0 20 40 60 80Classe d'âge
Incidence Homme Incidence FemmeMortalité Homme Mortalité Femme
Rein
050
100
150
200
250
300
Taux
pou
r 100
000
pers
onne
s-an
nées
0 20 40 60 80Classe d'âge
Incidence Homme Incidence FemmeMortalité Homme Mortalité Femme
Vessie
38
Conclusions
Boucles Gain de temps Qualité : réduction des sources d'erreurs dus
aux copier-coller
39