* Variancef.sps *. **************************************************************************************************** * * CALCUL DE LA VARIANCE POUR LES ÉTABLISSEMENTS DE SANTÉ * Date : 9 avril 1998 * par : Claude Delorme * Modifié : 11 mai 2000 * par : Sylvain Nadon * * Ce programme SPSS effectue le calcul de la variance pour la composante établissement de l'ENSP, * équivalent du programme SAS écrit par Chris Mohl en mars 1996. Ce programme, basé sur la méthode * d'échantillonnage à deux degrés avec remise, utilise les mêmes algorithmes que la version SAS. * Contrairement à ce dernier, la macro "Totals" est utilisée pour le calcul des totaux et rapports. * Jusqu'à 99999 totaux et 49999 rapports peuvent être calculés à la fois. Le répertoire 'C:\TEMP' * doit exister puisqu'il est utilisé pour stocker les fichiers temporaires; ceux-ci se nomment * "labeltot", "labelrat", "person", "ninst", "ins", "str", "can" et "var", ont tous l'extension * "sav" et sont détruits après utilisation. * * Le point, et non pas la virgule, doit être utilisé par le système d'exploitation pour séparer * les décimales; modifier au "Panneau de configuration" si besoin est. * * Voir "INSTRUCTIONS À MODIFIER À CHAQUE NOUVELLE UTILISATION" plus bas dans ce programme. * ****************************************************************************************************. set header=yes printback=no. title 'CALCUL DE LA VARIANCE POUR LES ÉTABLISSEMENTS DE SANTÉ'. subtitle 'EXEMPLE POUR LA DOCUMENTATION DU FICHIER DE MICRODONNÉES DE 1996-1997'. define !totals( var =!tokens(1) /dim =!tokens(1) /labfile=!tokens(1) /lstvar =!cmdend). !let !lstvrs=!concat('str1 to str',!dim). !let !lstvri=!concat('ins1 to ins',!dim). !let !lstvrc=!concat('can1 to can',!dim). !let !lstvrv=!concat('var1 to var',!var). !let !lstvrt=!concat('ter1 to ter',!var). * Somme des variables pondérées au niveau de l'établissement, de la strate, et du Canada. get file='c:\temp\person.sav'. weight by wti6wght. aggregate outfile='c:\temp\ins.sav' /presorted /break=canada stratum instno /!lstvri=sum(!lstvar). aggregate outfile='c:\temp\str.sav' /presorted /break=canada stratum /!lstvrs=sum(!lstvar). aggregate outfile='c:\temp\can.sav' /presorted /break=canada /!lstvrc=sum(!lstvar). get file='c:\temp\can.sav'. flip variables=!lstvrc. !if (!var~=!dim) !then compute den=var001. compute var001=lag(den,!var). execute. select if (not(sysmis(var001))). !ifend. save outfile='c:\temp\can.sav' /rename=(var001=can) /drop=case_lbl. * Calcul de la composante représentant la contribution à la variance de chaque établissement. match files file='c:\temp\ins.sav' /table='c:\temp\str.sav' /table='c:\temp\ninst.sav' /by stratum. vector ins=!lstvri /str=!lstvrs. vector ter (!var). loop #i=1 to !var. compute ter(#i)=0. !if (!var~=!dim) !then compute #j=#i+!var. do if str(#j)>0. compute str(#i)=ninst*ins(#j)*str(#i)/str(#j). if ninst>1 ter(#i)=(((ins(#i)*ninst)-str(#i))**2)/(ninst*(ninst-1)). else. compute ter(#i)=0. end if. !else. if ninst>1 ter(#i)=(((ins(#i)*ninst)-str(#i))**2)/(ninst*(ninst-1)). !ifend. end loop. * Somme des composantes de la variance à l'échelle nationale. aggregate outfile=* /presorted /break=canada /!lstvrv=sum(!lstvrt). erase file='c:\temp\ins.sav'. erase file='c:\temp\str.sav'. flip variables=!lstvrv. save outfile='c:\temp\var.sav' /drop=case_lbl /rename=(var001=var). * Sortie du total, de la variance et du CV. match files file='c:\temp\can.sav' /file='c:\temp\var.sav' /file=!labfile. !if (!var~=!dim) !then do if den<=0. compute can=0. compute var=0. else. compute can=can/den. compute var=var/den**2. end if. !ifend. do if can=0. compute cv=0. else. compute cv=sqrt(var)/can*100. end if. * Impression des résultats. do if $casenum=1. print eject. !if (!var=!dim) !then formats can var(F15.2) cv(F10.2). print eject /'DESCRIPTION' 13 'TOTAL' 84 'VARIANCE' 97 'CV' 114/. !else formats can(F15.5) var(F15.8) cv(F10.2). print eject /'DESCRIPTION' 13 'RAPPORT' 82 'VARIANCE' 97 'CV' 114/. !ifend. end if. print / ' ' label can var cv. execute. !enddefine. new file. input program. compute time=$time. print // '-----------------------------------------' / 'Date et heure courante: ' time(datetime17) / '-----------------------------------------'//. end case. end file. end input program. execute. *--------------------------------------------------------------------------------------------------. * SECTION DES SPÉCIFICATIONS . * INSTRUCTIONS À MODIFIER À CHAQUE NOUVELLE UTILISATION . * VOIR ÉTAPES 1, 2 ET 3 . * . * Veuillez n'apporter des modifications qu'à la section suivante . *--------------------------------------------------------------------------------------------------. * ÉTAPE 2: * Assigner une étiquette (60 charactères maximum) pour chaque variable apparaissant lors de * l'impression des résultats, en utilisant une nouvelle ligne pour chaque étiquette. set printback=both. data list list /label (A60). begin data /* <<< ÉTIQUETTES DES TOTAUX <<< 'Population totale' 'Personnes de 65 ans et plus' 'Femmes de 80 ans et plus' end data. save outfile='c:\temp\labeltot.sav'. data list list /label (A60). begin data /* <<< ÉTIQUETTES DES RAPPORTS <<< 'Personnes de 65+ ans ayant liens étroits avec le personnel' 'Personnes de 65+ ans pouvant converser en anglais' 'Personnes de 65+ ans pouvant converser en français' 'Personnes de 65+ ans pouvant converser en français & anglais' end data. save outfile='c:\temp\labelrat.sav'. set printback=no. * ------------------------------------------------------------------------------------- FIN ÉTAPE 2. define !count(). !let !ntotal=0. !let !nrates=0. !let !dim=0. * -------------------------------------------------------------------------------------------------. * ÉTAPE 3: * Spécifier le nombre de totaux et/ou rapports, ainsi que le nom du répertoire contenant les fichiers. !let !ntotal=3. /* <<< NOMBRE DE TOTAUX <<< !let !nrates=4. /* <<< NOMBRE DE RAPPORTS <<< !let !dim=8. /* <<< CE NOMBRE DOIT ÊTRE ÉGAL À DEUX FOIS LE NOMBRE DE RAPPORTS <<< !let !folder='N:\DEV\NADOSYL\INSTITUT\CYCLE2\VARIANCE\PUMF' /* <<< NOM DU RÉPERTOIRE CONTENANT LES FICHIERS <<< * ------------------------------------------------------------------------------------- FIN ÉTAPE 3. file handle datain /name=!quote(!concat(!folder,'/','inst.txt')). include file=!quote(!concat(!folder,'/','inst_in.sps')). do if $casenum=1 & !dim~=2*!nrates. print /// ' >>>>> >>>>> DIM = ' !quote(!dim) ' & NRATES = ' !quote(!nrates) ' <<<<< <<<<<' // ' >>>>> >>>>> ERREUR: DIM DOIT ÊTRE ÉGAL À 2 FOIS NRATES <<<<< <<<<<' ///. end if. vector tot(!ntotal,F2). vector num den(!nrates,F2). * -------------------------------------------------------------------------------------------------. * ÉTAPE 1: * 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. Pour le calcul de rapports, définir num1-numm et den1-denm comme étant le numérateur et * le dénominateur de chacun des m rapports. set mprint=no. /* <<< CRÉATION DES VARIABLES "TOT", "NUM" ET "DEN" <<< * Veuillez consulter le dictionnaire des données pour les valeurs à traiter comme manquantes. missing values dhi6gage ssi6g10 sdi6dlng(99). * Population totale. do if (wti6wght >0 ). compute tot1=1. else. compute tot1=0. end if. * Personnes de 65 ans et plus. recode dhi6gage (missing=sysmis) ( 1 thru 4 = 0) (5 thru 10 =1) into tot2. * Femmes de 80 ans et plus. do if (dhi6gage>=8 and dhi6_sex=2). compute tot3=1. else if (dhi6gage<=7 and dhi6_sex=2) or (dhi6_sex=1). compute tot3=0. end if. * Personnes de 65+ ans ayant liens étroits avec le personnel. do if (ssi6g10>0 and dhi6gage>=5). compute num1=1. else if (ssi6g10=0 or dhi6gage<5). compute num1=0. end if. * Personnes de 65+ ans pouvant converser en anglais seulement. do if (sdi6dlng=1 and dhi6gage>=5). compute num2=1. else if (sdi6dlng>1 or dhi6gage<5). compute num2=0. end if. * Personnes de 65+ ans pouvant converser en français seulement. do if (sdi6dlng=2 and dhi6gage>=5). compute num3=1. else if (sdi6dlng=1 or sdi6dlng>2) or (dhi6gage<5). compute num3=0. end if. * Personnes de 65+ ans pouvant converser en français et anglais seulement. do if (sdi6dlng=3 and dhi6gage>=5). compute num4=1. else if (sdi6dlng<=2 or sdi6dlng>3) or (dhi6gage<5). compute num4=0. end if. * Personnes de 65 ans et plus. do if (dhi6gage>=5). loop #i=1 to !nrates. compute den(#i)=1. end loop. else if (dhi6gage<5). loop #i=1 to !nrates. compute den(#i)=0. end loop. end if. *--------------------------------------------------------------------------------------------------. * FIN DES SPÉCIFICATIONS <<< NE RIEN MODIFIER EN DEHORS DE LA SECTION DES SPECIFICATIONS <<<. *--------------------------------------------------------------------------------------------------. !let !lstvrt=''. !if (!ntotal>0) !then !let !lstvrt=!concat('tot1 to tot',!ntotal). !ifend. !let !lstvrr=''. !if (!nrates>0) !then !let !lstvrr=!concat('num1 to den',!nrates). !ifend. compute canada=1. formats canada(F1). save outfile='c:\temp\person.sav' /keep=stratum instno wti6wght !lstvrt !lstvrr canada. get file='c:\temp\person.sav'. sort cases by stratum instno. xsave outfile='c:\temp\person.sav'. * Comptage du nombre d'établissements dans chaque strate. aggregate outfile=* /presorted /break=stratum instno /ninst=n. aggregate outfile='c:\temp\ninst.sav' /presorted /break=stratum /ninst=n. !if (!ntotal>0) !then !totals var=!ntotal dim=!ntotal labfile='c:\temp\labeltot.sav' lstvar=!lstvrt. execute. !ifend. !if (!nrates>0) !then !totals var=!nrates dim=!dim labfile='c:\temp\labelrat.sav' lstvar=!lstvrr. !ifend. new file. erase file='c:\temp\ninst.sav'. erase file='c:\temp\can.sav'. erase file='c:\temp\var.sav'. erase file='c:\temp\labeltot.sav'. erase file='c:\temp\labelrat.sav'. erase file='c:\temp\person.sav'. !enddefine. !count. set mprint=no.