***************************************************************************** * * CALCUL DE LA VARIANCE POUR LES ÉTABLISSEMENTS DE SANTÉ * * DATE : 7 mars 1996 * par : Chris Mohl * Modifié : 11 mai 2000 * par : Sylvain Nadon * * Ce programme effectue le calcul de la variance pour la composante * établissement de l'ENSP. Celui-ci est basé sur la méthode * d'échantillonnage à deux degrés avec remise. Il y a une macro pour le * le calcul de totaux et une autre pour le calcul de rapports. Jusqu'à * concurrence de 99 totaux ou rapports peuvent être calculés à la fois. * * ***************************************************************************** * Seules les trois premières étapes doivent être modifiées par l'utilisateur.; * ÉTAPE 1: * Lire le fichier de données. Définir les variables pour lesquelles vous * désirez obtenir une variance. Pour le calcul de totaux nommer les variables * tot1-totn où n désigne le nombre de variables pour lesquelles des estimés * sont requis. De même, pour le calcul de rapports définir num1-numm et * denom1-denomm comme étant le numérateur et dénominateur de chacun des * m taux. * Retenir le poids, strate, numéro de l'établissement, quelques variables * indicatrices ainsi que les variables tot,num et denom.; data person; %let datafid='n:\dev\nadosyl\institut\cycle2\variance\pumf\inst.txt'; /* ces noms changeront selon */ %include 'n:\dev\nadosyl\institut\cycle2\variance\pumf\inst_in.sas' ; /* le répertoire choisi */ * Valeurs manquantes. Veuillez consulter le dictionnaire des données pour les valeurs à traiter comme manquantes.; if dhi6gage=99 then dhi6gage=.; if ssi6g10 =99 then ssi6g10 =.; if sdi6dlng=99 then sdi6dlng=.; * Population totale. ; if (wti6wght>0) then tot1=1; else tot1=0; * Personnes de 65 ans et plus.; if (5<=dhi6gage<=10) then tot2=1; else if (1<=dhi6gage<=4 ) then tot2=0; * Femmes de 80 ans et plus. ; if (8<=dhi6gage<=10 and dhi6_sex=2) then tot3=1; else if (1<=dhi6gage<=7 and dhi6_sex=2) or (dhi6_sex=1) then tot3=0; * Personnes de 65 ans et plus ayant des liens étroits avec le personnel. ; if (0dimdenom then do; put 'ERREUR: Un nombre superieur de numerateurs ' dimnum ' ont ete definis que de denominateurs ' dimdenom 'pour le calcul de rapports'; put 'ERREUR: Le nombre de rapports a calculer correspond au nombre de denominateurs ' dimdenom; dimnum=dimdenom; end; else if dimdenom>dimnum then do; put 'ERREUR: Un nombre superieur de denominateurs ' dimdenom ' ont ete definis que de numerateurs ' dimnum ' pour le calul de rapports'; put 'ERREUR: Le nombre de rapports a calculer correspond au nombre de numerateurs ' dimnum; dimdenom=dimnum; end; call symput ('numtot',left(dimtot)); call symput ('numnum',left(dimnum)); call symput ('numden',left(dimdenom)); %mend; * ÉTAPE 4: * La macro "totals" effectue le calcul du total et de la variance des * variables définies précédemment.; %macro totals; proc sort data=person; by stratum instno; data insts; set person; by stratum instno; if first.instno; * Compte le nombre d''établissements dans chaque strate.; proc summary data=insts nway; class canada stratum; var one; output out=numinst sum=numinst; * Calcule le total pondéré au niveau de la strate pour chaque variable.; proc summary data=person nway; class canada stratum; var tot1-tot&numtot; weight wti6wght; output out=strtot sum=strtot1-strtot&numtot; * Calcule le total pondéré au niveau de l''établissement pour chaque * variable.; proc summary data=person nway; class canada stratum instno; var tot1-tot&numtot; weight wti6wght; output out=instot sum=instot1-instot&numtot; * Fusion des deux totaux et calcul de la composante représentant * la contribution à la variance de chaque établissement.; data mergeest; merge instot(in=in1) strtot(in=in2) numinst(in=in3); by canada stratum; if in1 and in2 and in3; array instot{*} instot1-instot&numtot; array strtot{*} strtot1-strtot&numtot; array term{*} term1-term&numtot; %do i=1 %to &numtot; if numinst=1 then term{&i}=0; else term{&i} = (((instot{&i}*numinst) - strtot{&i}) ** 2) / (numinst*(numinst-1)); %end; * Somme des composantes de la variance à l''échelle nationale.; proc summary data=mergeest nway; class canada; var term1-term&numtot; output out=variance sum=varian1-varian&numtot; * Somme des variables pondérées à l''échelle nationale.; proc summary data=person nway; class canada; var tot1-tot&numtot; weight wti6wght; output out=cantot sum=cantot1-cantot&numtot; * Sortie du total, variance et CV pour chaque variable, une variable * par ligne.; data cvs (keep=totdesc variance total cv); merge variance(in=in1) cantot(in=in2); by canada; if in1 and in2; array varian{*} varian1-varian&numtot; array cantot{*} cantot1-cantot&numtot; array cvtot{*} cvtot1-cvtot&numtot; %do i=1 %to &numtot; if cantot{&i}=0 then cvtot{&i}=0; else cvtot{&i} = sqrt(varian{&i}) / cantot{&i} * 100; totdesc=&i; variance=varian{&i}; total=cantot{&i}; cv=cvtot{&i}; output; %end; * Impression des résultats.; proc print split='*'; title1 'Exemple pour la documentation du fichier de microdonnées de 1996-1997'; title2 'Estimations, variances et cv des totaux'; label totdesc='DESCRIPTION'; var totdesc total variance cv; format totdesc totfrmt. total 10.2 variance 15.2 cv 10.2; %mend; * La macro "rates" effectue le calcul du rapport et de la variance * des variables définies précédemment.; %macro rates; proc sort data=person; by stratum instno; data insts; set person; by stratum instno; if first.instno; * Compte le nombre d''établissements dans chaque strate.; proc summary data=insts nway; class canada stratum; var one; output out=numinst sum=numinst; * Calcule le total pondéré au niveau de la strate du numérateur * et dénominateur de chaque variable.; proc summary data=person nway; class canada stratum; var num1-num&numnum denom1-denom&numden; weight wti6wght; output out=strtot sum=strnum1-strnum&numnum strden1-strden&numden; * Calcule le total pondéré au niveau de l''établissement du numérateur * et dénominateur de chaque variable.; proc summary data=person nway; class canada stratum instno; var num1-num&numnum denom1-denom&numden; weight wti6wght; output out=instot sum=insnum1-insnum&numnum insden1-insden&numden; * Fusion des deux totaux et calcul de la composante représentant * la contribution à la variance de chaque établissement.; data mergeest; merge instot(in=in1) strtot(in=in2) numinst(in=in3); by canada stratum; if in1 and in2 and in3; array insnum{*} insnum1-insnum&numnum; array insden{*} insden1-insden&numden; array strnum{*} strnum1-strnum&numnum; array strden{*} strden1-strden&numden; array term{*} term1-term&numnum; %do i=1 %to &numnum; if numinst=1 then term{&i}=0; else if strden{&i}>0 then term{&i} = (((insnum{&i}*numinst) - (strnum{&i}/strden{&i})*insden{&i}*numinst) ** 2) / (numinst*(numinst-1)); else term{&i}=0; %end; * Somme des composantes de la variance à l''échelle nationale.; proc summary data=mergeest nway; class canada; var term1-term&numnum; output out=variance sum=varian1-varian&numnum; * Somme des numérateurs et dénominateurs pondérés à l''échelle nationale.; proc summary data=person nway; class canada; var num1-num&numnum denom1-denom&numden; weight wti6wght; output out=canrat sum=cannum1-cannum&numnum canden1-canden&numden; * Sortie du rapport, variance et CV pour chaque variable, une variable * par ligne.; data cvs (keep=ratdesc variance rapport cv); merge variance(in=in1) canrat(in=in2); by canada; if in1 and in2; array varian{*} varian1-varian&numnum; array cannum{*} cannum1-cannum&numnum; array canden{*} canden1-canden&numden; array cvtot{*} cvtot1-cvtot&numtot; array canrat{*} canrat1-canrat&numnum; array cvrat{*} cvrat1-cvrat&numnum; %do i=1 %to &numnum; if canden{&i}=0 then canrat{&i} = 0; else canrat{&i} = cannum{&i}/canden{&i}; if canden{&i}=0 or cannum{&i}= 0 then cvrat{&i}=0; else cvrat{&i} = sqrt(varian{&i}/canden{&i}**2) / canrat{&i} * 100; ratdesc=&i; variance=varian{&i}/canden{&i}**2; rapport=canrat{&i}; cv=cvrat{&i}; output; %end; run; * Impression des résultats.; proc print split='*'; title1 'Exemple pour la documentation du fichier de microdonnées de 1996-1997'; title2 'Estimations, variances et cv des rapports'; label ratdesc='DESCRIPTION'; var ratdesc rapport variance cv; format ratdesc ratfrmt. rapport 15.5 variance 15.8 cv 10.2; run; %mend; * La macro "count" doit toujours être exécutée. Cependant les macros * "totals" ou "rates" peuvent être supprimées en plaçant l'instruction voulue * entre /* et */ si l'on désire calculer seulement des totaux ou * seulement des rapports.; %count; %totals; %rates; run;