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
“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...