Archive de la catégorie «Macro»

Macro SAS pour calculer le Omega total de McDonald

18 octobre 2009

Dernière, la littérature psychométrique semble en venir au consensus que le coefficient alpha (souvent attribué à tord à Cronbach, alors qu’il provient de Guttman) n’est pas le meilleur estimateur de la cohérence interne d’un test. Voici une macro SAS pour calculer un autre estimateur réputé comme meilleur que le Alpha de Cronbach :

/*
MACRO PAR DENIS TALBOT B.Sc.
denis.talbot3.1415@gmail.com

Dernière mise-à-jour 16 octobre 2009, SAS v9.2

Appeller la macro par
omega(data=,var=,out=);
Où var doit être une liste de variable sans raccourci (e.g. -, –).
Out est le nom SAS pour le fichier de sortie

RÉFÉRENCES:

Pour ne pas utiliser la alpha de Cronbach:

Sijtsma, K. (2009). On the use, the misuse, and the very limited usefulness of Cronbach’s alpha. Psychometrika, 74(1), 107-120.

Huysamen, G.K. (2006). Coefficient alpha: Unnecessarily ambiguous, unduly ubiquitous. SA Journal of Industrial Psychology, 32(4), 34-40.

Sur l’Omega total:

*Revelle, W., & Zinbarg, R.E. (2009). Coefficients alpha, beta, omega and the glb: comments on Sijtsma. Psychometrika. doi:10.1007/s11336-008-9102-z.

McDonald, R.P. (1999). Test theory: A unified treatment. Hillsdale: Erlbaum.

*Référence principale. La macro SAS présentée ici est inspirée du programme R du package psych
mentionnée dans cet article.
*/

%MACRO omega(data=,var=, out=);
%let _i=1;
%do %while (%scan(&var,&_i) ne %str() );
%let arg&_i=%scan(&var,&_i);
%let _i=%eval(&_i+1);
%end;
%let nvar=%eval(&_i-1);

PROC CALIS DATA = &data OUTEST = _cfa_ METHOD = ML NOPRINT;
VAR &var;
LINEQS
%DO _i=1 %TO (&nvar – 1);
&&arg&_i = f1 + e&_i,
%END;
&&arg&nvar =f1 + e&nvar;
std
f1 = 1,
e1 – e&nvar = ee:;
RUN;

DATA _cfa_;
SET _cfa_;
IF _TYPE_ = ‘PARMS’;
s_uniq = sum(of ee1-ee&nvar);
KEEP s_uniq;
RUN;
ODS LISTING CLOSE;
ODS OUTPUT PearsonCorr=PearsonCorr;
PROC CORR DATA = &data; VAR &var; RUN;
ODS LISTING;
DATA PearsonCorr;
SET PearsonCorr;
VT = sum(of &arg1–&&arg&nvar);
KEEP VT;
RUN;

PROC MEANS DATA = PearsonCorr NOPRINT; Var VT; OUTPUT OUT = PearsonCorr SUM=VT; RUN;

DATA &out; MERGE _cfa_ PearsonCorr; Omega = 1 – s_uniq/VT; KEEP Omega; RUN;

PROC PRINT DATA = &out; RUN;

%MEND;

Denis

D de Cohen

18 octobre 2009

Macro SAS pour calculer le D de Cohen

%macro D_COHEN(fichier=, var_class= , var= );

ods output ttests=ttest_proc(drop=method) statistics=stat_desc1 equality=equal1(drop=method);

proc ttest data= &fichier;

class &var_class;

var &var;

run;

proc sort data=ttest_proc;

by variable;

run;

proc sort data=equal1;

by variable;

run;

data d_cohen;

merge ttest_proc equal1;

by variable;

if Probf LT 0.05 then do;

if variances=’Equal’ then delete;

end;

if Probf GE 0.05 then do;

if variances=’Unequal’ then delete;

end;

D_COHEN=tvalue*(numdf+dendf+2)/(sqrt(DF)*sqrt((numdf+1)*dendf+1));

run;

proc print data=d_cohen;

var variable probt d_cohen;

run;

%mend;

Par Simon Olivier

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

18 mars 2009

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;

Macro pour le Rho de Jöreskog

24 juillet 2008

Bonjour,

 

Voici ma première chronique “Le saviez-vous” !!

 

J’ai construit une macro dans SAS évidemment afin de déterminer le Rho de Joreskog (c’est une mesure de cohérence interne, tsé j’en aie parlé dans ma présentation :D :D)

 

Alors la voici,

 

 

*Insérer le nom du jeu de données obtenu avec le ods output de la procédure CALIS et StdManifestEq=;

*Insérer le nom de la variable désirée pour déterminer sa cohérence interne;

*Inscrire la position du premier caractère de la variable;

*Inscrire la position du dernier caractère de la variable;

 

%macro

Rho_de_Joreskog(fichier=, variable=, debut_var=, fin_var=);

data Joreskog;

set &fichier;

retain lambda_&variable Var_&variable;

if control ne

‘b’ then delete;

if

%upcase(substr(Variable,&debut_var,&fin_var))=%upcase(“&variable”) then do;

lambda_&variable+Coefficient1;

Var_&variable+Coefficient2**

2;

end;

else delete;

run;

data Joreskog;

set Joreskog;

rho_joreskog_&variable=lambda_&variable**

2/(lambda_&variable**2+Var_&variable);

keep variable Rho_Joreskog_&variable;

run;

proc means noprint;

var Rho_Joreskog_&variable;

output out=Joreskog max=Rho_Joreskog_&variable;

run;

data Joreskog;

set Joreskog;

keep Rho_Joreskog_&variable;

run;

proc print;run;

%mend

;

%Rho_de_Joreskog(fichier=Joreskog1, variable=mi, debut_var=

1, fin_var=2);

 

 

Si vous avez des questions n’hésitez pas à me contacter !!

 

Simon Olivier Fournier !

Macro pour le test de linéaire, régression logistique

23 juin 2008

Bonjour tout le monde,

 

Dans ma deuxième chronique, je vais vous montrer ma macro que j’ai créé afin de tester l’hypothèse de linéarité lorsqu’on effectue de la régression logistique.

 

La voici :

 

/*Tester l’hypothèse de linéarité*/

 

%macro linearite(fichier=, ech= , vary=, var_expl= , maxvalue=);

 

proc sort data=&fichier;

 by &ech;

run;

 

data &fichier;

 set &fichier;

 intervalle=&max_value/10;

 if 0<=&var_expl<intervalle then nclasse=1;

 if intervalle<=&var_expl<2*intervalle then nclasse=2;

 if 2*intervalle<=&var_expl<3*intervalle then nclasse=3;

 if 3*intervalle<=&var_expl<4*intervalle then nclasse=4;

 if 4*intervalle<=&var_expl<5*intervalle then nclasse=5;

 if 5*intervalle<=&var_expl<6*intervalle then nclasse=6;

 if 6*intervalle<=&var_expl<7*intervalle then nclasse=7;

 if 7*intervalle<=&var_expl<8*intervalle then nclasse=8;

 if 8*intervalle<=&var_expl<9*intervalle then nclasse=9;

 if 9*intervalle<=&var_expl<=10*intervalle then nclasse=10;

run;

 

proc sort data=&fichier;

 by nclasse;

run;

 

proc means data=&fichier noprint;

 by nclasse;

 var &var_expl;

 output out=moy mean=moyenne;

run;

 

proc sort data=&fichier;

 by nclasse &vary;

run;

 

proc means data=&fichier noprint;

 where &vary=0;

 by nclasse;

 var &vary;

 output out=nombre0 n=nbr0;

run;

 

proc means data=&fichier noprint;

 where &vary=1;

 by nclasse;

 var &vary;

 output out=nombre1 n=nbr1;

run;

 

data nombre;

 merge nombre1 nombre0;

 by nclasse;

 logit_p=log(nbr0/nbr1);

 drop _TYPE_ _FREQ_;

run;

 

data &fichier;

 merge &fichier moy nombre;

 by nclasse;

 drop _TYPE_ _FREQ_ nbr0 nbr1;

run;

 

goptions reset=all;

symbol1 c=blue v=dot;

proc gplot data=&fichier;

  title“&vary*&var_expl”;

  plot pred*&var_expl;

run;quit;title;

 

goptions reset=all;

symbol1 c=green v=dot;

proc gplot data=&fichier;

  title“&vary*&var_expl”;

  plot logit_p*moyenne;

run;quit;title;

 

data &fichier;

 set &fichier;

 drop logit_p moyenne;

run;

 

%mend;

 

Si vous avez des questions, n’hésitez pas  !!!

 

Simon Olivier Fournier

 

P.S. Je vais essayer de vous envoyer d’autres choses que des macros les prochaines fois !!