Macro pour calculer les résidus ajustés d’un tableau de fréquence

18 mars 2009 par nilidas

Voici une macro construite par Simon Olivier pour calculer les résidus ajustés d’un tableau de fréquence.

Les résidus ajustés se veulent un outils pour déterminer les liens d’associations dans un tableau de fréquence. Sous l’hypothèse d’indépendance entre les variables du tableau de fréquence IxJ, les résidus suivent une loi normale de moyenne zéro et de variance 1. Des résidus positifs élevés dans un cellule démontrent que les catégories ont tendance à avoir lieu ensemble alors que des résidus négatifs élevés montrent une tendance à ce que les catégories n’aient pas lieu simulaténament.

Les catégories doivent être représentés par des numéros.

Fichier = fichier de données

mingrp1 = plus petite catégorie de la première variable

maxgrp1 = plus grande catégorie de la première variable

var1 = nom de la première variable

%macro residus_ajustes(fichier=, mingrp1=, maxgrp1=, mingrp2=, maxgrp2=, var1=, var2=);

ods output CrossTabFreqs=res_aju;

proc freq data=&fichier;

tables &var1*&var2;

run;

data max;

set res_aju;

id_group=compress(&var1||&var2);

id_num=input(id_group,3.);

run;

/*GROUP I */

proc means data=res_aju noprint;

where _TYPE_=’10′;

by &var1;

var frequency;

output out=max_i(drop=_TYPE_) max=max_i;

run;

/*GROUP J */

proc means data=res_aju noprint;

where _TYPE_=’01′;

by &var2;

var frequency;

output out=max_j(drop=_TYPE_) max=max_j;

run;

/*TOTAL*/

proc means data=res_aju noprint;

var frequency;

output out=maximum max=maximum;

run;

data _null_;

set maximum;

call symput(’total’,maximum);

run;

%put &total;

data residus_adjus;

set res_aju;

Groupe1=&var1;

Groupe2=&var2;

if &var1=. then delete;

if &var2=. then delete;

id_group=compress(&var1||&var2);

id_num=input(id_group,3.);

run;

data merg_i;

merge max_i residus_adjus;

by &var1;

keep id_num max_i;

run;

proc sort data=residus_adjus;

by &var2;

run;

data merg_j;

merge max_j residus_adjus;

by &var2;

keep id_num max_j;

run;

proc sort data=merg_j;

by id_num;

run;

proc sort data=residus_adjus;

by id_num;

run;

data residus_adjus2;

merge merg_i merg_j residus_adjus;

by id_num;

pi=max_i/&total;

pj=max_j/&total;

do group=&mingrp1 to &maxgrp1;

do group2=&mingrp2 to &maxgrp2;

espere=max_i*max_j/&total;

RA=(frequency-espere)/sqrt(espere*(1-pi)*(1-pj));

end;

end;

run;

proc print data=residus_adjus2;

where &var1 ne . and ra ne . or groupe2 ne . and ra ne .;

var groupe1 groupe2 ra;

run;

%mend;

Conseils SAS

18 mars 2009 par nilidas

Voici un lien pratique vers un document donnant quelques conseils pratiques pour travailler sur le formats des données.

Entre autres, on y trouve une façon simple de transformer des données de type caractère vers des données de type numérique (et vice-versa).

http://www4.ncsu.edu/~fisik/SAS_Data_Handling.htm#d3

Merci à Simon Olivier Fournier pour l’information!

Sélectionner du texte en colones au lieu d’en lignes sur SAS

28 octobre 2008 par nilidas

Afin de sélectionner du texte en colones au lieu d’en lignes sur SAS  il suffit de maintenir le bouton ALT pendant qu’on effectue la sélection.

 

Effacer l’output et le log lorsqu’on fait rouler un programme.

16 octobre 2008 par nilidas

Avec le logiciel SAS, il est possible de modifier les fonctions des boutons. Un changement utile permet d’effacer le Log et l’Output lorsqu’on fait rouler un programme, de sorte que seul le nouveau log et le nouvel output est affiché. Pour ce faire il suffit d’aller cliquer sur tools dans la barre d’outils puis choisir Customize dans le menu déroulant. Ensuite, sous l’onglet Customize, on peut choisir de créer un nouveau bouteau ou modifier le fonctionnement d’un bouton.  Pour effectuer le changement proposé, il suffirait d’inscrire le code output; clear; log; clear; wnextedit; SUBMIT sur la ligne command du bouton voulu.

Analyses de trajectoires (suite)

11 août 2008 par nilidas

Tel que promis, voici la suite du premier article, avec la programmation de PROC TRAJ (désolé pour l’écriture peut conviviale, mais je ne comprends toujours pas très bien comment ajuster le format des textes du blog.)

 

PROC TRAJ  DATA = OUT =/*Fichier de sortie avec les probabilités prédites que l’individu appartienne à chaque trajectoire*/

OUTPLOT =/*Fichier de sortie qui servira à tracer les graphiques*/

OUTSTAT =/*Fichier de sortie qui contient les équations des trajectoires*/

OUTEST =/*Fichier de sortie avec les paramètres des trajectoires et les statistiques d’ajustement du modèle*/

ITDETAIL/*Pour obtenir les détails sur les itérations*/

CI95M/*Option à mettre pour pouvoir obtenir des intervals de confiance autour des trajectoires*/

OUTPLOT2 = OUTSTAT2 =/*Même fichiers, mais pour effectuer de l’analyse duale, c’est-à-dire pour coupler les trajectoires de deux phénomènes, par exemple la motivation et la pérception de compétence*/;

MODEL cnorm/zip/logit/*Définition de la variable réponse :CNORM : Normal censurée, c’est le cas des études en psychologie où les individus doivent répondre selon une échelle bien définie, par exemple allant de 0 à 5.

ZIP : Zero inflated Poisson, c’est le cas lorsque la variable réponse est un dénombrement, avec possibilité que zéro (0) soit une valeur plus probable qu’avec la loi de Poisson standard.

Logit: La variable réponse est dichotomique.*/;

VAR /*Toutes les variables réponses pour chaque temps, s’il y a 5 temps de mesure, les 5 temps doivent être dans une variable différente, par exemple

 

id temps1 temps2 temps3 temps4 temps5 mot1 mot2 mot3 mot4 mot5

1    1             2           3         4             5       1.5   3.47  1.25   4.25  5.24

Alors on doit inscrire : VAR mot1-mot5*/;

TCOV /*Toutes les covariables variant dans le temps. Chacune doivent être écrites pour chacun des temps, comme pour la variable réponse.Par exemple : age1-age5 sexe1-sexe5 (bien que le sexe ne varie pas dans le temps, on peut mettre le sexe comme une TCOV*/;

 

RISK /*Les variables qui sont des facteurs de risque d’appartenir à une trajectoire plutôt qu’une autre. Les facteurs de risque ne sont mesurée qu’à un temps*/

INDEP /*Toutes les variables qui représente les temps de mesure, dans l’exemple précédent : temps1-temps5*/;

MIN/*À inscrire si la variable réponse est CNORM, il s’agit de la plus petite valeur possible pour la variable réponse*/;

MAX/*À inscrire si la variable réponse est CNORM, il s’agit de la plus grande valeur possible pour la variable réponse*/;

 

ORDER/*L’ordre de chacune des trajectoires, s’il y a trois trajectoires, une constante, une linéaire, une quadratique, il faut inscrire : 0 1 2*/;

 

NGROUPS /*Le nombre de trajectoires à modéliser*/;  

ID /*Variable indiquant le numéro d’idendification de l’observation*/; 

/*Pour de l’analyse duale*/

MODEL2; 

VAR2; 

INDEP2 /*Il faut inscrire un nom différent de variables que pour indep1, même si les deux phénomènes ont lieu en même temps*/; 

MIN2; 

MAX2; 

ORDER2; 

NGROUPS2 ; 

TCOV2 ; 

RISK2 ;

RUN;

%TRAJPLOT(/*Fichier Outplot*/, /*Fichier outstat*/, /*Titre 1*/, /*Titre 2*/, /*Titre Axe des Y*/, /*Titre Axe des X*/);

/*Graphiques des trajectoires, en ligne pleine la trajectoire observée. La trajectoire prédite est en ligne pointillée */

%TRAJPLOTNEW(/*Fichier Outplot*/, /*Fichier outstat*/, /*Titre 1*/, /*Titre 2*/, /*Titre Axe des Y*/, /*Titre Axe des X*/);

/*En ligne pleine, la trajectoire prédites, autour l’intervalle de confiance*/

 

 

Denis