(gH) -_- anas.sas.txt ; TimeStamp (unix) : 04 Novembre 2010 vers 09:52 /************************************************************/ /* */ /* quelques ANAlyses Statistiques en Sas */ /* */ /************************************************************/ /* chargement des données et des programmes */ %include 'x:\datagh.sas' ; %include 'x:\statgh.sas' ; /* définition des options et des noms de catalogues */ options nodate LINESIZE=256 PAGESIZE=5000 NOCENTER FORMDLIM=' ' FORMCHAR='-----------' nonumber ; libname bls "." ; /************************************************************/ /* */ /* étude des données BLS */ /* */ /************************************************************/ /* ce programme sert à quatre choses : */ /* 1. afficher les données de départ */ /* 2. convertir les dates en champs JOUR MOIS AN */ /* 3. normaliser les noms et prénoms */ /* 4. trier les bases et conserver les seuls */ /* champs utiles */ /* partie 1 : valeurs de départ */ proc import datafile="patient2.xls" out=bls.patients dbms=xls replace ; proc contents data=bls.patients ; proc import datafile="marqueur_valeur2.xls" out=bls.valeurs dbms=xls replace ; proc contents data=bls.valeurs ; proc import datafile="medecin2.xls" out=bls.medecins dbms=xls replace ; proc contents data=bls.medecins ; proc import datafile="ordonnance2.xls" out=bls.ordonnances dbms=xls replace ; proc contents data=bls.ordonnances ; proc import datafile="resultat2a.xls" out=res2a dbms=xls replace ; proc import datafile="resultat2b.xls" out=res2b dbms=xls replace ; data bls.resultats ; set res2a res2b ; proc contents data=bls.resultats ; run ; /* bases : bls.patients bls.ordonnances bls.valeurs bls.medecins bls.resultats */ /* partie 2 : conversion des dates */ /* jourN : jour de naissance */ /* jourC : jour de consultation */ /* idem avec moisN, moisC et anN, anC. */ data bls.BLS_P ; format daten mmddyy8. ; set bls.patients ; daten = ((date_naissance+315619200)/86400) ; jourN = day(daten) ; moisN = month(daten) ; anN = year(daten) ; nom1 = upcase( nom) ; pren1 = upcase( prenom) ; pid = id ; nom = prxchange("s/É/E/",-1,nom1) ; nom = prxchange("s/È/E/",-1,nom) ; nom = prxchange("s/-/E/",-1,nom) ; prenom = prxchange("s/É/E/",-1,pren1) ; prenom = prxchange("s/È/E/",-1,prenom) ; prenom = prxchange("s/-/ /",-1,prenom) ; run ; data garde2 ; set bls.BLS_P ; keep pid nom prenom jourN moisN anN ; proc sort data=garde2 out=bls.BLS_Pt ; by nom prenom jourN moisN anN pid ; proc print data=bls.BLS_Pt (obs=30) ; /* --------------------------------------------------------------------------- */ data bls.BLS_O ; format datep mmddyy8. ; set bls.ordonnances ; datep = ((datePrescription+315619200)/86400) ; jourP = day(datep) ; moisP = month(datep) ; anP = year(datep) ; oid = id ; pid = PATIENT_id ; data garde3 ; set bls.BLS_O ; keep oid pid jourP moisP anP ; if anP<2006 then delete ; proc sort data=garde3 out=bls.BLS_Ot ; by jourP moisP anP oid pid ; proc print data=bls.BLS_Ot (obs=30) ; /* --------------------------------------------------------------------------- */ /* dans les bases de données : $virus = "(cause_id=3)" ; $nbc++ ; $cause[$nbc] = $virus ; $alcool = "(cause_id=2)" ; $nbc++ ; $cause[$nbc] = $alcool ; $steatose = "(cause_id=5)" ; $nbc++ ; $cause[$nbc] = $steatose ; $score = "(typeMesure=0)" ; $aire = "(typeMesure=1)" ; $activ = "(typeMesure=2)" ; */ data bls.BLS_R ; set bls.resultats ; rid = id ; oid = ORDONNANCE_id ; if typeMesure > 0 then delete ; scorei = valeurInitiale ; scoref = valeurFinale ; proc print data=bls.BLS_R (obs=30) ; data garde4 ; set bls.BLS_R ; keep rid oid scorei scoref ; proc sort data=garde4 out=bls.BLS_Rt ; by rid oid ; *proc print data=bls.resultats (obs=30) ; *proc print data=bls.BLS_R (obs=30) ; proc print data=bls.BLS_Rt (obs=30) ; /* voici ce qu'on conserve */ proc contents data=bls.BLS_Pt ; proc contents data=bls.BLS_Ot ; proc contents data=bls.BLS_Rt ; run ; /* fusion des données par patient */ proc sql ; CREATE TABLE bls.tousres AS SELECT p.pid, p.nom, p.prenom, p.jourN, p.moisN, p.anN, o.jourP, o.moisP, o.anP, r.scorei, r.scoref FROM bls.BLS_Pt p, bls.BLS_Ot o, bls.BLS_Rt r WHERE (p.pid=o.pid) AND (o.oid=r.oid) ORDER BY p.nom, p.prenom, p.anN, p.moisN, p.jourN, o.anP, o.moisP, o.jourP ; quit ; run ; * proc print data=bls.tousres (obs=100) ; /* pour vérification et tests futurs */ proc sql ; CREATE TABLE bls.respartiels AS SELECT * FROM bls.tousres (OBS=150) ; /* car LIMIT 150 n'existe pas en SAS/SQL */ quit ; run ; proc print data=bls.respartiels ; /* on ne conserve que les patents avec au moins deux fibromètres */ data encours ; * TEST : set bls.respartiels ; set bls.tousres ; if (nom="") then delete ; if missing(jourN) then delete ; if missing(moisN) then delete ; if missing(anN) then delete ; * proc print data=encours ; proc sql ; CREATE TABLE resm AS SELECT a.pid, a.nom, a.prenom, a.jourN, a.moisN, a.anN, a.jourP, a.moisP, a.anP, a.scorei, a.scoref FROM encours a, encours b WHERE (a.pid=b.pid) AND (NOT( (a.jourP=b.jourP) AND (a.moisP=b.moisP) AND (a.anP=b.anP) )) ORDER BY a.nom, a.prenom, a.anN, a.moisN, a.jourN, a.anP DESC , a.moisP DESC, a.jourP DESC ; quit ; run ; /* suppression des doublons */ proc sort data=resm out=resm2 nodup ; by _all_ ; /* tri par date de Prescription décroissante */ proc sql ; CREATE TABLE bls.resm AS SELECT * FROM resm2 ORDER BY nom, prenom, anN, moisN, jourN, anP DESC , moisP DESC, jourP DESC ; quit ; run ; proc print data=bls.resm ; /* un peu de comptage sur les patients avec au moins deux fibromètres score */ proc freq data=bls.resm noprint ; table pid / out=frequences ; run ; * proc print data=frequences ; proc freq data=frequences ; table count ; /* surveillons qui a eu plus 10 calculs ou plus */ proc sql ; SELECT a.pid,a.count,b.nom, b.prenom FROM frequences a, bls.patients b WHERE count>9 AND a.pid=b.id ORDER by pid, count desc ; /**** -- FIN D'ANALYSE BLS -- *****************************************************************/ /* définition des options et des noms de catalogues */ options nodate LINESIZE=256 PAGESIZE=50 NOCENTER FORMDLIM=' ' FORMCHAR='-----------' nonumber ; libname chu '.' ; /************************************************************/ /* */ /* étude du protocole SNIS */ /* */ /************************************************************/ title Analyse des 201 individus ; run ; proc corr data=chu.sans3 ; var AOF HYALUH GLY ASAT ALAT PLAQUET TP ; run ; /*********************************************************************/ title Régression sur 201 individus sans le TP ; run ; proc reg data=chu.sans3 ; model AOF = HYALUH GLY ASAT ALAT PLAQUET ; output out=chu.res3 p=pAOFsansTP ; run ; title "R2a corrigé du biais d'optimisme 201 individus et 1000 répétititons sans TP" ; *%r2a_corr(dsn=chu.sans3,outcome=AOF,covars=HYALUH GLY ASAT ALAT PLAQUET ,B=1000,sel=none); run ; /*********************************************************************/ title Régression sur 201 individus avec le TP ; run ; proc reg data=chu.sans3 ; model AOF = HYALUH GLY ASAT ALAT PLAQUET TP; output out=chu.res4 p=pAOFavecTP ; run ; title "R2a corrigé du biais d'optimisme 201 individus et 1000 répétititons avec TP" ; *%r2a_corr(dsn=chu.sans3,outcome=AOF,covars=HYALUH GLY ASAT ALAT PLAQUET TP,B=1000,sel=none); run ; /*********************************************************************/ /* TimeStamp (dos) : 02 Avril 10 11:13 ; r:\sefbm\analyses\vindiag7\vd7p1.sas */ %include "x:\statgh.sas " ; %optionsgh() ; libname chu "." ; proc import datafile="ghvd7.xls" out=chu.vd7org dbms=xls replace ; proc contents data=chu.vd7org ; proc means data=chu.vd7org ; proc freq data=chu.vd7org ; table expl_val meta_f ; /* TimeStamp (dos) : 02 Avril 10 11:26 ; r:\sefbm\analyses\vindiag7\vd7p2.sas */ %include "x:\statgh.sas " ; %include "x:\roc.sas " ; %include "x:\rocplot.sas " ; %optionsgh() ; libname chu "." ; /* conversion en 0/1 obligatoire pour Auroc */ data chu.vd7_01 ; set chu.vd7org ; ms2 = 0 ; /* metavir supérieur ou égal à F2 */ ms3 = 0 ; /* metavir supérieur ou égal à F3 */ mf4 = 0 ; /* metavir égal à F4 */ if (meta_f>1) then ms2 = 1 ; if (meta_f>2) then ms3 = 1 ; if (meta_f=4) then mf4 = 1 ; proc freq data=chu.vd7_01 ; table meta_f ms2 ms3 mf4 ; /********************************************************************/ title Aurocs MS2 ; %roc(data=chu.vd7_01,var=FibroMetre Fibroscan CSF_index,response=ms2) ; title Aurocs et comparaison MS2 ; %roc(data=chu.vd7_01,var=FibroMetre Fibroscan,response=ms2) ; %roc(data=chu.vd7_01,var=FibroMetre CSF_index,response=ms2) ; %roc(data=chu.vd7_01,var=Fibroscan CSF_index,response=ms2) ; * %comp3roc(chu.vd7_01,ms2,FibroMetre,Fibroscan,CSF_index) ; /********************************************************************/ title Aurocs MS3 ; %roc(data=chu.vd7_01,var=FibroMetre Fibroscan SF_index,response=ms3) ; title Aurocs et comparaison MS2 ; %roc(data=chu.vd7_01,var=FibroMetre Fibroscan,response=ms3) ; %roc(data=chu.vd7_01,var=FibroMetre SF_index,response=ms3) ; %roc(data=chu.vd7_01,var=Fibroscan SF_index,response=ms3) ; /********************************************************************/ title Aurocs MF4 ; %roc(data=chu.vd7_01,var=FibroMetre Fibroscan C_index,response=mf4) ; title Aurocs et comparaison MF4 ; %roc(data=chu.vd7_01,var=FibroMetre Fibroscan,response=mf4) ; %roc(data=chu.vd7_01,var=FibroMetre C_index,response=mf4) ; %roc(data=chu.vd7_01,var=Fibroscan C_index,response=mf4) ; /*********************************************************************/ data chu.sans4 ; set chu.sans3 ; keep AOF HYALUH GLY ASAT ALAT PLAQUET TP ; run ; proc export data=chu.sans4 outfile="sans4.xls" dbms ="excel" replace ; data chu.reg5 ; merge chu.res3 chu.res4 ; by rang ; keep rang AOF HYALUH GLY ASAT ALAT PLAQUET TP pAOFsansTP pAOFavecTP; run ; proc export data=chu.reg5 outfile="reg5.xls" dbms ="excel" replace ; data chu.sans2 ; set chu.sans1 ; if AOF =. then delete ; if HYALUH =. then delete ; proc means data=chu.sans2 ; var AOF HYALUH GLY ASAT ALAT PLAQUET TP ; run ; title Données chu.sans3 ; run ; data chu.sans3 ; set chu.sans2 ; if AOF =. then delete ; if HYALUH =. then delete ; if AOFresid>=20 then delete ; proc means data=chu.sans3 ; var AOF HYALUH GLY ASAT ALAT PLAQUET TP ; run ; /********************************************************************/ title Régression sur 202 individus ; run ; proc reg data=chu.sans2 ; model AOF = HYALUH GLY ASAT ALAT TP ; run ; title Régression sur 201 individus ; run ; proc reg data=chu.sans3 ; model AOF = HYALUH GLY ASAT ALAT TP ; run ; /*********************************************************************/ /* vérification de la sélection des meilleures variables par bootstrap */ /* ancienne macro bmodel2 de SB ==> */ /* la macro suivante est commentée car elle dure un peu plus de */ /* 4 minutes ; une copie de la sortie est dans score3p6.sor.txt */ /* et le listing "propre" dans score3p6_freq.txt */ /* vérifier que tout fonctionne avec B=10 puis mettre B=1000 */ /* utiliser en session */ /* sas score3p6.sas -work "E:\tmp */ /* si besoin est */ /* l'appel de la macro est commenté, car cela dure 20 minutes... */ * %quels_regresseurs_RLM(dsn=chu.sans_outl2,outcome=AOF,covars=HYALUH GLY ALAT ASAT PLAQUET TP poids age ferritin trigly bmi2,B=1000,sel=stepwise); /* calcul de la valeur du R2 ajusté corrigé du biais d'optimisme */ /* par bootstrap */ /* ancienne macro bvalAR2 de SB ==> */ * proc contents data=chu.sans_outl2 ; run ; title "R2a corrigé du biais d'optimisme 201 individus et 1000 répétititons" ; %r2a_corr(dsn=chu.sans3,outcome=AOF,covars=HYALUH GLY ASAT ALAT PLAQUET TP,B=1000,sel=none); run ; proc print data = t2; var Optimistic_aR2 OptimismCorrection Corrected_aR2 aR2_ICinf aR2_ICsup; run; /* recherche de l'outlier dans la régression */ title %str(Régression complète (saturée) : AOF = f(HYALUH GLY ASAT ALAT PLAQUET TP) pour les données chu.snisf1 ) ; proc reg data=chu.snisf1 ; model AOF = HYALUH GLY ASAT ALAT PLAQUET TP ; output out=chu.res_score3 r=AOFresid cookd=AOFcook ; run ; /* proc print data=res_score3 ; var RANG AOF HYALUH GLY ASAT ALAT PLAQUET TP AOFresid AOFcook ; */ title Valeurs extremes serie 1 (cook) ; run ; data outl1 ; set chu.res_score3 ; if AOFcook<0.2 then delete ; proc print data=outl1 ; var RANG AOF HYALUH GLY ASAT ALAT PLAQUET TP AOFresid AOFcook ; run ; ods html file= "score3p6/score3p6.html" gpath = "score3p6/" (url=none) ; /*********************************************************************/ title Meilleure Régression (201 individus) ; run ; data chu.sans_outl2 ; set chu.res_score3 ; if AOFresid>=20 then delete ; proc reg data=chu.sans_outl2 ; model AOF = HYALUH GLY ASAT ALAT PLAQUET TP ; run ; proc contents data=chu.sans_outl2 ; run ; /*********************************************************************/ /* vérification de la sélection des meilleures variables par bootstrap */ /* ancienne macro bmodel2 de SB ==> */ /* la macro suivante est commentée car elle dure un peu plus de */ /* 4 minutes ; une copie de la sortie est dans score3p6.sor.txt */ /* et le listing "propre" dans score3p6_freq.txt */ /* vérifier que tout fonctionne avec B=10 puis mettre B=1000 */ /* utiliser en session */ /* sas score3p6.sas -work "E:\tmp */ /* si besoin est */ /* l'appel de la macro est commenté, car cela dure 20 minutes... */ * %quels_regresseurs_RLM(dsn=chu.sans_outl2,outcome=AOF,covars=HYALUH GLY ASAT PLAQUET TP poids age alat ferritin trigly bmi2,B=1000,sel=stepwise); /* calcul de la valeur du R2 ajusté corrigé du biais d'optimisme */ /* par bootstrap */ /* ancienne macro bvalAR2 de SB ==> */ * proc contents data=chu.sans_outl2 ; ods html select none ; %r2a_corr(dsn=chu.sans_outl2,outcome=AOF,covars=HYALUH GLY ASAT PLAQUET TP,B=1000,sel=none); ods html select all ; proc print data = t2; var Optimistic_aR2 OptimismCorrection Corrected_aR2 aR2_ICinf aR2_ICsup; run; ods html close; /************************************************************/ /* */ /* étude du Dossier PBIO */ /* */ /************************************************************/ title Dossier PBIO ; run ; /* un peu de données (formatées) */ %print10(pbio) ; /* des tris à plat */ proc freq data=pbio ; tables CONNAIT DIFF CONSOM MARQUE CONSVIE SEXE AGE ETATCIVIL NBENFANTS SITPROF CL_REVENU / NOCUM ; /* tris à plat, par fréquence décroissante ; proc freq data=pbio order=freq ; table sexe etatciv age revenu / nocum ; table sexe*etatciv sexe*age sexe*revenu / norow nocol nopercent ; run ; proc freq data=titanic order=freq ; tables CLASS AGE SEX SURV ; */ run ; /************************************************************/ /* */ /* étude du Dossier TITANIC */ /* */ /************************************************************/ title Dossier TITANIC ; run ; /* un peu de données (formatées) */ %print10(titanic) ; /* des tris à plat */ proc freq data=titanic order=freq ; tables CLASS AGE SEX SURV ; run ; /****************************************************************************************************************/ /****************************************************************************************************************/ TITLE Etude de tous les paramètres - 26 mars 97 ; libname f 'z:\A1056' ; options nodate LINESIZE=250 PAGESIZE=5000 NOCENTER FORMDLIM=' ' FORMCHAR='-----------' nonumber ; %include 'x:\statgh.sas' ; * Etude de tous les paramètres - 3 octobre 97 " ; /****************************************************************************************************************/ /****************************************************************************************************************/ /* création de la base à  partir des données issues du fichier Excel de converties en fichier texte (pour faciliter l'utilisation de R */ /*********************************************************/ data f.alltintinana ; infile '1056.sor' firstobs=2 ; input IDEN $ REPL AT URE AH TP AM AE SX NU NS $ NFA VAC LVD $ ; run ; proc contents data=f.alltintinana ; ** proc print data=f.alltintinana ; * listages des valeurs en début et fin de fichier : %titregen(f.alltintinana) ; run ; %tete(f.alltintinana) ; run ; %queue(f.alltintinana) ; run ; title2 ; /****************************************************************************************************************/ /****************************************************************************************************************/ data prepanadse ; set alltintinana; dse = "oui" ; if sce=-1 then dse= "non" ; alrt = "oui" ; if cda=0 then alrt = "non" ; if alrt="non" then grp="ns" ; if alrt="oui" and dse="non" then grp="nc" ; if alrt="oui" and dse="oui" then grp="oa" ; f_iden1 = put(iden,Z4.0) ; /* format zéro pour garantir la concaténation */ f_iden2 = iden ; /* format zéro pour garantir la concaténation */ niden = grp||trim(f_iden) ; /* on utilise retain pour réordonner les variables */ data anadse ; retain niden grp dse alrt cda ; set prepanadse ; proc print data=anadse (firstobs=1 obs=10) ; proc print data=anadse (firstobs=800 obs=825) ; /* on aura besoin de trier par sexe, donc */ proc sort data=anadse out=anadse2 ; by sexe niden ; /* quelques comptages */ title Analyse Globale ; run ; proc freq data=anadse2 order=freq ; table sexe dse alrt grp dse*grp dse*alrt ; /************************************************/ data alltintinana_alrt ; set anadse2 ; length nar $ 30 ; length naj $ 30 ; length nav $ 30 ; length nab $ 30 ; ar = 0 ; aj = 0 ; av = 0 ; ab = 0 ; nar = "" ; naj = "" ; nav = "" ; nab = "" ; /***************************************************************/ if repl <= 1100 then do ; ar = 1 ; nar = trim(nar) || " plq" ; cplq = "Rouge" ; end ; if 1100 < repl and repl <= 70 then do ; aj = 1 ; naj = trim(naj) || " plq" ; cplq = "Jaune" ; end ; /***************************************************************/ alerte = ((ar*10 + aj)*10 + ab)*10 + av ; nar = trim(nar) ; naj = trim(naj) ; nav = trim(nav) ; nab = trim(nab) ; proc print data=alltintinana_alrt (firstobs=1 obs=10) ; proc print data=alltintinana_alrt (firstobs=2728 obs=2738) ; proc freq data=alltintinana_alrt order=freq ; table NMO alerte ar aj ab av CDA LVD nar naj nab nav cplq casat curee cah ctp ca2m cage ; proc freq data=alltintinana_alrt order=freq ; table ar*aj ar*av ar*ab aj*av aj*ab av*ab / norow nocol nopct ; proc means data=alltintinana_alrt n mean stddev cv min max maxdec=2 ; var PLQ ASAT UREE AH TP A2M AGE ; ** proc print data=alltintinana_alrt ; data alltintinana_alrt ; set alltintinana_alrt ; lvdn = input(lvd,4.) ; run ; ** proc contents data= alltintinana_alrt ; data alltintinana_alrt ; set alltintinana_alrt ; dseplq = 0 ; idplq = indexc(lvd,'1') ; if (lvdn>-1) and (idplq>0) then dseplq=1 ; dseasa = 0 ; idasa = indexc(lvd,'2') ; if (lvdn>-1) and (idasa>0) then dseasa=1 ; dseage = 0 ; idage = indexc(lvd,'7') ; if (lvdn>-1) and (idage>0) then dseage=1 ; /**************************************************/ length f_lvd $ 30 ; f_lvd = "???" ; if lvdn=1 then f_lvd = "REPL" ; if lvdn=5 then f_lvd = "TP" ; if lvdn=65 then f_lvd = "A2M TP" ; proc freq data=alltintinana_alrt order=freq ; table dseplq*cplq dseasa*casat dseure*curee dsehya*cah dsetdp*ctp dsea2m*ca2m dseage*cage/ norow nocol nopct ; proc freq data=alltintinana_alrt order=freq ; table dseplq*cplq dseasa*casat dseure*curee dsehya*cah dsetdp*ctp dsea2m*ca2m dseage*cage/ norow nocol nopct ; proc freq data=alltintinana_alrt order=freq ; table lvd f_lvd ; data dsealrt ; set alltintinana_alrt ; if lvd=-1 then delete ; proc freq data=dsealrt order=freq ; table lvd f_lvd ; /************************************************/ data chtmp.re ; * file "f1056.txt" ; array v1 $ id ; set chtmp.bip ; if a2m<10 then a2m = a2m*100 ; exclu = 0 ; alat = -1 ; if sexe=2 then sexe=0 ; format id $7. ; id = 'M'||put(numero,Z5.0) ; format repl 5.1 ; format age 9.4 ; data f ; set c.f ; array v1 $ iden ; iden = 'M'||put(numero,Z5.0) ; drop numero; proc sort data=f out=f_t ; by iden ; proc sort data=resultats out=res_t ; by iden ; data c.c ; merge res_t f_t ; by iden ; ZCDA = put(CDA,Z4.0) ; proc import datafile="Z:\bases7gh.xls" out=c.alls17 dbms=excel replace; data c.ft ; set c.f ; if ft = . then delete ; proc export data=pbh outfile="Z:\sniff17_1056.dbf" dbms=dbf replace; data c.f ; array v1 numero ; /* array force à utiliser les variables dans cet ordre */ array v2 pl ; array v3 as ; array v4 ur ; array v5 hy ; array v6 tp ; array v7 a2 ; array v8 ag ; array v9 se ; set c.p ; /* attention à bien mettre set après array et avant les if */ keep numero pl as ur hy tp am ag sx ; if pl = . then delete ; if as = . then delete ; if ur = . then delete ; if hy = . then delete ; if tp = . then delete ; if a2 = . then delete ; if ag = . then delete ; if se = . then delete ; /* gestion du fichier des rintintins */ data a (rename=(nom=nom1)) ; set b.rintintins ; id1 = id ; proc sort data=a out=at ; by id ; proc print data=at (firstobs=1 obs=5) ; var id nom1 ; proc means data=at n ; var id ; /* gestion du fichier du suivi des rintintins */ data binit (rename=(nom=nom2 num_ro=id qualificatif=qualificatif_id mode_x=mode_x_id)) ; set b.suivi_rintintins ; proc means data=binit n ; var id ; data b ; set binit ; id2 = id ; proc sort data=b out=bt ; by id ; proc print data=bt (firstobs=1 obs=5) ; var id nom2 ; proc means data=bt n ; var id ; /* fusion puis export */ title Fichier 3 ; run ; data ct ; merge at bt ; by id ; proc means data=ct n ; var id ; data c ; set ct ; erreur=0 ; noma =nom1 ; nomb =nom2 ; ida = id1 ; idb = id2 ; if not(nom1=nom2) then erreur=1; if not(ida=idb) then erreur=erreur + 2; drop MODE_EXERCICE_id SPECIALITE_id ZONE_VACANCES TITRE_id ; proc sort data=c out =ptout ; by descending erreur id ; proc sql ; create table tout as select id , titre , nom1 , prenom , qualificatif from ptout ; quit ; data rintintins ; length adresse1 $ 90 ; format adresse1 $90. ; informat adresse1 $90. ; /* gestion du fichier des rintintins */ data a (rename=(nom=nom1)) ; set b.rintintins ; id1 = id ; proc sort data=a out=at ; by id ; proc print data=at (firstobs=1 obs=5) ; var id nom1 ; proc means data=at n ; var id ; /* gestion du fichier du suivi des rintintins */ data binit (rename=(nom=nom2 num_ro=id)) ; set b.suivi_rintintins ; proc means data=binit n ; var id ; data b ; set binit ; id2 = id ; proc sort data=b out=bt ; by id ; proc print data=bt (firstobs=1 obs=5) ; var id nom2 ; proc means data=bt n ; var id ; /* fusion puis export */ title Fichier 3 ; run ; data ct ; merge at bt ; by id ; proc means data=ct n ; var id ; data c ; set ct ; erreur=0 ; noma =nom1 ; nomb =nom2 ; ida = id1 ; idb = id2 ; if not(nom1=nom2) then erreur=1; if not(ida=idb) then erreur=erreur + 2; drop MODE_EXERCICE_id SPECIALITE_id ZONE_VACANCES TITRE_id ; proc sort data=c out =ptout ; by descending erreur id ; data suivi_rintintins ; length nom$ 50 ; informat nom $50. ; format nom $50. ; length r_gion_rintintin $ 50 ; informat r_gion_rintintin $50. ; format r_gion_rintintin $50. ; erreur = 0 ; set b.suivi_rintintins ; if (Premier_calcul =.) then do ; erreur = 1 ; mois = 0 ; annee = 0 ; end ; else do ; mois = month(Premier_calcul) ; annee = year(Premier_calcul) ; end ; if trim(r_gion_rintintin)="---" then erreur = 3 ; if dpt_rintintin=. then erreur = 4 ; if dpt_rintintin<0 then erreur = 5 ; proc means data=suivimt noprint ; output out=s1a1 sum= ; var nouveaux_p prem_r prem_B; data s1b ; array v1 mois ; array v2 annee ; array c $ dsc ; array v3 nouveaux_p ; array v4 prem_r ; array v5 prem_B ; array v6 prem_p ; set s1a1 s1a2 ; drop _TYPE_ _FREQ_ ; prem_p = nouveaux_p - prem_r - prem_B ; if _n_=1 then do ; dsc = "TOTAL" ; mois = month(today()) ; annee = year(today()) ; end ; else dsc = "" ; proc sort data=s1b out=s2b ; by annee mois ; proc export data=calculs_nettoyes outfile="Out/B6_details_calculs.xls" dbms ="excel" replace ; proc sql ; create table calculs_relies as select a.num_ro as num1 , a.id_labo as idl1 , a.id_rintintin as idm1 , a.laboratoire as labo1 , a.rintintin as med1 , b.id as idl2 , b.qualificatif , b.nom from a , b where idl1=idl2 ; quit ; proc sql ; create table calculs_relies as select a.num_ro as num1 , a.id_labo as idl1 , a.id_rintintin as idm1 , a.laboratoire as labo1 , a.rintintin as med1 , c.id as idm2 ,c.nom , c.prenom from a , c where idm1=idm2 ; quit ; data calculs_lies (rename=(num1=num_ro)) ; set calculs_relies ; proc sql ; delete from non_relies where num_ro in (select num_ro from calculs_lies) ; quit ; proc freq data=calc_hors_CHU order=freq ; table base cause mode_exercice ; %macro compteCAUSE(base,onglet) ; data calc2 ; base = "calc2" ; total = 1 ; ao = 0 ; vux = 0 ; atoze = 0 ; set &base ; if trim(cause)= 'Ao' then ao = 1 ; if trim(cause)= 'Vux' then vux = 1 ; if trim(cause)= 'Soz meta' then atoze = 1 ; /* proc print data=calc2 (firstobs=1 obs=10) ; var Date_r_sultat anne_calc mois_calc cause ao vux atoze ; */ proc sort data=calc2 out=calc3 ; by descending annee descending mois ; proc means data=calc3 noprint ; output out=calc4 sum= ; var total vux ao atoze; data aa ; length nom_m $ 50 ; format nom_m $50. ; informat nom_m $50. ; base = "aa" ; set a ; nom_m = trim(rintintin) ; proc sql ; select count(distinct(nom_m)) from bbt ; quit ; /* proc sql ; select distinct(nom_m) , prenom , " BBT" from bbt where nom_m like "MP%" ; quit ; */ proc sql ; create table erreur_nom1 as select aat.nom_m from aat left join bbt on aat.nom_m=bbt.nom_m where bbt.nom_m is null ; quit ; proc print data=erreur_nom1 ; data aat_sansd ; /* sans double */ set aat ; tn = trim(nom_m) ; lng = length(tn) ; if substr(tn,lng,1)="." then delete ; proc sql ; create table cct as select aats.nom_m , cause , date_r_sultat , aats.mode_exercice , bbts.mode_exercice , vux, ao, atoze , mois , annee , base1 , base2 , nom1 , nom2 , region_id from aats, bbts where aats.nom_m = bbts.nom_m ; quit ; data eetv ; set eet ; where vux=1 ; %compteME(eetv,detail_vux) ; data eeta ; set eet ; where ao=1 ; %compteME(eeta,detail_ao) ; data eets ; set eet ; where atoze=1 ; %compteME(eets,detail_atoze) ; %compteOrdo(cct,"") ; data cct1996 ; set cct ; where annee=1996 ; data cct1997 ; set cct ; where annee=1997 ; %compteOrdo(cct1996,"1996") ; %compteOrdo(cct1997,"1997") ; %optionsgh(ls=120) ; /** ################################################################################# */ /** */ /** classification ward de la matrice des distances euclidiennes lignes de VINS */ /** */ /** ################################################################################# */ libname gh 'I:\Sasdata' ; options nofmterr ; options nodate LINESIZE=256 PAGESIZE=50 NOCENTER FORMDLIM=' ' FORMCHAR='-----------' nonumber ; /* chargement des données */ proc print data=gh.vins ; /* matrice euclidienne des distances */ proc distance data=gh.vins out=vins_md method=Euclid ; var interval(_numeric_); id vin ; proc print data=vins_md ; /* classification */ /* method=average outtree=vins_tr nosquare nonorm */ /* comme hclust(vins_md,method="average") en R */ proc cluster data=vins_md method=average outtree=vins_tr nosquare nonorm ; id vin ; proc print data=vins_tr ; proc sort data=vins_tr out=vins_ttr ; by _height_ ; /* donc croissant */ proc print data=vins_ttr ; /* dendrogramme : sauvegarde du graphique en postscript */ goptions reset=all gaccess='sasgastd > vinsclsas.ps' device=pscolor ; proc tree data=vins_tr horizontal ; height _height_ ; id vin ; title Classification vins ; quit ; /* reprise des options par défaut */ goptions reset=goptions; run ; /** ################################################################################# */ /** */ /** affichage de l'age pour ELF avec des couleurs différentes pour chaque sexe */ /** */ /** ################################################################################# */ /* TimeStamp (dos) : 06 Septembre 06 13:46 ; z:\essai.sas */ options nofmterr ; libname gh 'I:\Sasdata' ; * proc contents data=gh.elf ; * proc print data=gh.elf ; proc sort data=gh.elf out=elf2 ; by age ; data elf3 ; set elf2 ; idn= _n_ ; if sexe=0 then do ; ageh = age ; agef = . ; end ; else do ; ageh = . ; agef = age ; end ; proc print data=elf3 (obs=10) ; symbol1 c=blue v=dot ; symbol2 c=red v=dot ; proc gplot data=elf3 ; plot ageh*idn agef*idn / overlay ; run ; /** ################################################################################# */ /** */ /** classification issue d'une AFC */ /** */ /** ################################################################################# */ PROC CORRESP DATA=nomtab1 DIM=3 OUT=toto NOPRINT ; VAR cac dj ftm can net ; ID ident ; PROC CLUSTER METHOD=CENTROID ; VAR DIM1-DIM3; ID ident; PROC TREE ; RUN ; /** ################################################################################# */ /** */ /** comparaison des proc clasiques avec les macros gh */ /** */ /** ################################################################################# */ /* lecture des données */ data consom77 ; infile 'z:\consom77.dar' firstobs=2; input Temps $ Resm Depc ; run ; %titregen(consom77) ; /* étude avec les proc classiques */ proc contents data=consom77 ; proc means data=consom77 ; proc corr data=consom77 ; proc reg data=consom77 ; model depc = resm ; /* étude avec les macros gh et dl */ titregen(consom77) ; combien(consom77) ; decritQT(consom77,resm,"mDollars") ; decritQT(consom77,depc,"mDollars") ; asgQT(consom77,depc,"mDollars") ; regrlin(consom77,resm,depc,"mDollars","mDolars") ; run ; /** ####################################### */ /* sortie en fichier texte */ data _null_; set demo ; file "demo.sor" notitles noprint; put id $5. plaq 6.0 asat 6.0 uree 7.2 ah 7.0 tp 6.0 a2m 8.0 age 9.4 sexefm 5.0 exclu 5.0 alat 6.0 ; run ; /* comparaison de courbes Roc */ proc import datafile='art_sniff14.xls' dbms=excel out=art_sniff14 replace ; proc means data=art_sniff14 ; var SNIFF8 Prediction_1 ; proc freq data=art_sniff14 ; table fcs ; %include 'x:\statgh.sas' ; %include 'x:\roc.sas' ; %include 'x:\rocplot.sas' ; %comp2roc(art_sniff14,fcs,SNIFF8,Prediction_1) ; /* comparaison de cohortes */ libname chu 'c:\Temp' ; options nodate LINESIZE=256 PAGESIZE=50 NOCENTER FORMDLIM=' ' FORMCHAR='-----------' nonumber ; %include 'x:\roc.sas' ; proc import datafile='cohorte1.xls' dbms=excel out=chu.cohorte1 replace ; proc import datafile='cohorte2.xls' dbms=excel out=chu.cohorte2 replace ; proc import datafile='cohortes1et2.xls' dbms=excel out=chu.cohortes1et2 replace ; /* en ligne 162 pas de FCS ? */ data cohorte1 ; set chu.cohorte1 ; if fcs=. then delete ; data chu.cohorte1 ; set cohorte1 ; data cohortes1et2 ; set chu.cohortes1et2 ; if fcs=. then delete ; data chu.cohortes1et2 ; set cohortes1et2 ; /* calculs de base */ title Description de la cohorte 1 ; proc means data=chu.cohorte1 n mean stddev cv min max maxdec=4 ; var SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15 ; proc freq data=chu.cohorte1 order=freq ; table fcs ; run ; title Description de la cohorte 2 ; proc means data=chu.cohorte2 n mean stddev cv min max maxdec=4 ; var SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15 ; proc freq data=chu.cohorte2 order=freq ; table fcs ; run ; title Description de la cohortes 1&2 ; proc means data=chu.cohortes1et2 n mean stddev cv min max maxdec=4 ; var SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15 ; proc freq data=chu.cohortes1et2 order=freq ; table fcs ; run ; /* comparaisons d'AUROCS série 1 */ title Delong sur les 6 tests : cohorte 1 ; * proc print data=chu.cohorte1 ; %roc(data=chu.cohorte1,var=SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15,response=FCS, details=YES) ; run ; title Delong sur les 6 tests : cohorte 2 ; * proc print data=chu.cohorte2 ; %roc(data=chu.cohorte2,var=SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15,response=FCS, details=YES) ; run ; title Delong sur les 6 tests : cohortes 1 et 2 ; * proc print data=chu.cohortes1et2 ; %roc(data=chu.cohortes1et2,var=SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15,response=FCS, details=YES) ; run ; /* comparaisons d'AUROCS série 2 */ title Delong sur 2 tests : cohorte 1 ; * proc print data=chu.cohorte1 ; %roc(data=chu.cohorte1,var=SNIFF8 MODEL15,response=FCS, details=YES) ; run ; title Delong sur 2 tests : cohorte 2 ; * proc print data=chu.cohorte2 ; %roc(data=chu.cohorte2,var=SNIFF8 MODEL15,response=FCS, details=YES) ; run ; title Delong sur 2 tests : cohortes 1 et 2 ; * proc print data=chu.cohortes1et2 ; %roc(data=chu.cohortes1et2,var=SNIFF8 MODEL15,response=FCS, details=YES) ; run ; /* conversion en variables qualitatives */ libname tmp 'c:\temp' ; * proc import datafile='rch2.xls' dbms=excel out=tmp.rch2 replace ; * proc contents data=tmp.rch2 ; /* ==> fichier rch2.sor */ data rch2 ; set tmp.rch2 ; array v1 numero ; array v2 metaf ; array v3 plaq ; array v4 asat ; array v5 ur_e ; array v6 hyalu ; array v7 tp ; array v8 a2m ; array v9 age ; * array v10 sexe ; if numero = . then delete ; if metaf = . then delete ; if plaq = . then delete ; if asat = . then delete ; if ur_e = . then delete ; if hyalu = . then delete ; if tp = . then delete ; if a2m = . then delete ; if age = . then delete ; if sexe = . then delete ; keep numero metaf plaq asat ur_e hyalu tp a2m age ; if (plaq<170) or (plaq>390) then do ; plaq = 1 ; end ; else do ; plaq = 0 ; end ; if (asat<10) or (asat>110) then do ; asat = 1 ; end ; else do ; asat = 0 ; end ; if (ur_e<1.9) or (ur_e>8.8) then do ; ur_e = 1 ; end ; else do ; ur_e = 0 ; end ; if (hyalu<2) or (hyalu>73) then do ; hyalu = 1 ; end ; else do ; hyalu = 0 ; end ; if (tp<88) or (tp>121) then do ; tp = 1 ; end ; else do ; tp = 0 ; end ; if (a2m<105) or (a2m>311) then do ; a2m = 1 ; end ; else do ; a2m = 0 ; end ; if (age<29) or (age>66) then do ; age = 1 ; end ; else do ; age = 0 ; end ; proc print data=rch2 ; /******************************************************************/ libname chu 'c:\Temp' ; options nodate LINESIZE=256 PAGESIZE=50 NOCENTER FORMDLIM=' ' FORMCHAR='-----------' nonumber ; %include 'x:\roc.sas' ; /* proc import datafile='cohorte1.xls' dbms=excel out=chu.cohorte1 replace ; proc import datafile='cohorte2.xls' dbms=excel out=chu.cohorte2 replace ; proc import datafile='cohortes1et2.xls' dbms=excel out=chu.cohortes1et2 replace ; */ /* en ligne 162 pas de FCS ? */ data cohorte1 ; set chu.cohorte1 ; if fcs=. then delete ; data chu.cohorte1 ; set cohorte1 ; data cohortes1et2 ; set chu.cohortes1et2 ; if fcs=. then delete ; data chu.cohortes1et2 ; set cohortes1et2 ; /* calculs de base */ title Description de la cohorte 1 ; proc means data=chu.cohorte1 n mean stddev cv min max maxdec=4 ; var SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15 ; proc freq data=chu.cohorte1 order=freq ; table fcs ; run ; title Description de la cohorte 2 ; proc means data=chu.cohorte2 n mean stddev cv min max maxdec=4 ; var SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15 ; proc freq data=chu.cohorte2 order=freq ; table fcs ; run ; title Description de la cohortes 1&2 ; proc means data=chu.cohortes1et2 n mean stddev cv min max maxdec=4 ; var SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15 ; proc freq data=chu.cohortes1et2 order=freq ; table fcs ; run ; /* comparaisons d'AUROCS série 1 */ title Delong sur les 6 tests : cohorte 1 ; * proc print data=chu.cohorte1 ; %roc(data=chu.cohorte1,var=SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15,response=FCS, details=YES) ; run ; title Delong sur les 6 tests : cohorte 2 ; * proc print data=chu.cohorte2 ; %roc(data=chu.cohorte2,var=SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15,response=FCS, details=YES) ; run ; title Delong sur les 6 tests : cohortes 1 et 2 ; * proc print data=chu.cohortes1et2 ; %roc(data=chu.cohortes1et2,var=SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15,response=FCS, details=YES) ; run ; /* comparaisons d'AUROCS série 2 */ title Delong sur 2 tests : cohorte 1 ; * proc print data=chu.cohorte1 ; %roc(data=chu.cohorte1,var=SNIFF8 MODEL15,response=FCS, details=YES) ; run ; title Delong sur 2 tests : cohorte 2 ; * proc print data=chu.cohorte2 ; %roc(data=chu.cohorte2,var=SNIFF8 MODEL15,response=FCS, details=YES) ; run ; title Delong sur 2 tests : cohortes 1 et 2 ; * proc print data=chu.cohortes1et2 ; %roc(data=chu.cohortes1et2,var=SNIFF8 MODEL15,response=FCS, details=YES) ; run ; %allcompRoc2a2(chu.cohortes1et2,SNIFF8 FIBTEST APRI HEPASCOR FIB4 MODEL15,FCS) ; /* TimeStamp (dos) : 31 Mai 08 21:15 ; coefficients de lin */ proc import datafile='pd150.xls' dbms=excel out=pd150 replace ; proc import datafile='md150.xls' dbms=excel out=md150 replace ; proc contents data=pd150 ; proc contents data=md150 ; /* variables à traiter : x CSI CSII PD */ %include 'X:\mccc.sas' ; /* concordance de lin */ %*mccc(md150,x,ratervars=CSI CSII,alpha=0.005) ; %include 'x:\concreg.sas' ; %concreg(md150,CSI,CSII) ; %concreg(md150,CSI,PD) ; %concreg(md150,CSII,PD) ; %concreg(pd150,CSI,CSII) ; %concreg(pd150,CSI,PD) ; %concreg(pd150,CSII,PD) ; /* TimeStamp (dos) : 01 Février 09 13:14 ; r:\sefbm\analyses\compressionjpeg_2\comp2.sas */ /* variables : Numero Compression MacroVac_MCR MacroVac_SM MacroVac_JC1 MacroVac_JC2 MicroVacMCR MicroVacSM MicroVacJC1 MicroVacJC2 Texture_Vac_MCR Texture_Vac_SM Texture_Vac_JC1 Texture_Vac_JC2 Fib_peri_MCR Fib_peri_SM Fib_peri_JC1 Fib_peri_JC2 Veines_MCR Veines_SM Veines_JC1 Veines_JC2 Compress_MCR Compress_SM Compress_JC1 Compress_JC2 */ libname comp2 "." ; %include 'x:\statgh.sas' ; /* on détruit l'ancien fichier */ filename delfile "subj3.xls" ; data _null_ ; rc = FDELETE('delfile') ; proc import datafile="subjective2.xls" out=comp2.subj dbms=excel replace ; data comp2.subj2 ; set comp2.subj ; if CompressMCR="oui" then ComprMCR=1 ; if CompressMCR="non" then ComprMCR=2 ; if CompressSM= "oui" then ComprSM =1 ; if CompressSM= "non" then ComprSM =2 ; if CompressJC1="oui" then ComprJC1=1 ; if CompressJC1="non" then ComprJC1=2 ; if CompressJC2="oui" then ComprJC2=1 ; if CompressJC2="non" then ComprJC2=2 ; numimg = numero ; image = substr(compression,1,index(compression,"_")-1) ; nature = substr(compression,index(compression,"_")+1,index(compression,".")-index(compression,"_")-1) ; qualite= -1 ; reste = "?????" ; idx = 0 ; if nature="tif" then do ; qualite = 100 ; end ; else do ; idx = index(nature,"Q") ; if idx>0 then do ; reste = substr(nature,idx+1,length(nature)) ; qualite = int( reste ) ; nature = substr(nature,1,idx-2) ; end ; end ; drop numero compression idx reste ; /* mais on garde numimg image nature qualite */ /* pour vérification : */ %tete(comp2.subj2) ; %queue(comp2.subj2) ; /* */ proc freq data=comp2.subj2 ; table _numeric_ ; */ proc contents data=comp2.subj2 ; /* macro pour passer de wide en long */ %macro w2l() ; %let juges = MCR SM JC1 JC2 ; %let nbj = %nbmots(&juges) ; %let cols = MacroVac MicroVac Texture_Vac Fib_peri Veines Compr ; %let nbc = %nbmots(&cols) ; %do idj=1 %to &nbj ; %let jug = %scan(&juges,&idj,' ') ; %let numj = %eval(&idj) ; %let macrovac = MacroVac&jug ; %let microvac = MicroVac&jug ; %let texturevac = TextureVac&jug ; %let fibperi = Fibperi&jug ; %let veines = Veines&jug ; %let compr = Compr&jug ; data tmp&numj ; array v1 $ numimg ; array v2 $ image ; array v3 $ nature ; array v4 qualite ; array v5 numj ; array v6 $ juge ; array v7 MacroVac ; array v8 MicroVac ; array v9 TextureVac ; array v10 FibPeri ; array v11 Veines arary v12 Compr ; numj = &numj ; juge = "&jug" ; label MacroVac = 'MacroVac' ; label MicroVac = 'MicroVac' ; label TextureVac = 'TextureVac' ; label FibPeri = 'FibPeri' ; label Veines = 'Veines' ; label Compr = 'Compr' ; set comp2.subj2 (rename=( ¯ovac=MacroVac µvac=MicroVac &texturevac=TextureVac &fibperi=FibPeri &veines=Veines &compr=Compr )) ; keep numimg image nature qualite numj juge MacroVac MicroVac TextureVac FibPeri Veines Compr ; run ; proc sort data=tmp&numj out=tmpT&numj ; by numimg ; %end ; %* fusion ; data comp2.subj3 ; set tmpT1 tmpT2 tmpT3 tmpT4 ; %tete(comp2.subj3) ; %queue(comp2.subj3) ; proc export data=comp2.subj3 outfile="subj3.xls" dbms=xls replace ; %mend w2l ; %w2l() ; /* conversion de dates */ data calculs ; set fbm.calculs ; keep an code dategh ; an = substr(code,1,2) ; dategh = (dateResultat/86400) + 25569 ; format dategh DDMMYY8. ; run ; data calculs ; set fbm.calculs ; keep an code dategh ; an = substr(code,1,2) ; dategh = (dateResultat/86400) - 21916 ; format dategh DDMMYY8. ; run ; data calculs ; set fbm.calculs ; keep an code dategh ; an = substr(code,1,2) ; dategh = (dateResultat/86400) + 25569 -21916 ; format dategh DDMMYY8. ; run ; /* CONVERSIONS DATE ET HEURE (Unix timestamp vs SAS time) */ data ed ; input jour ; informat jour mmddyy8. ; format jour mmddyy8. ; jour2 = jour ; jour3 = jour ; datalines ; 01/01/60 01/01/70 02/21/05 04/28/09 ; proc print data=ed ; /*************************************************/ data td ; input vd ; /* j m a date ; */ datalines ; -315619200 0 1109083439 1240410269 ; /* date = ((vd+315619200)/86400) + 25569 + 3653 ; */ data td2 ; set td ; date = ((vd+315619200)/86400) ; date2 = date ; format date2 mmddyy8. ; proc print data=td ; proc print data=td2 ; run ; /* Obs jour jour2 jour3 1 01/01/60 0 0 2 01/01/70 3653 3653 3 02/21/05 16488 16488 4 04/28/09 18015 18015 Obs vd date date2 1 -315619200 0.00 01/01/60 2 0 3653.00 01/01/70 3 1109083439 16489.61 02/22/05 4 1240410269 18009.60 04/22/09 */