Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- libname SOURCE "/folders/myFolders/Miniprojet/source"; /* endroit où se trouvent tous les datasets sources et les formats */
- options fmtsearch=( SOURCE WORK);
- options ls=256;
- /*1 : Import des données*/
- proc contents data=source.demography short;
- proc contents data=source.physical_exam short;
- proc contents data=source.vital_signs short;
- proc contents data=source.treatment_assignment short;
- run;
- /*------------------------------------------------------2.1----------------------------------------------------------*/
- /* 2.1.1 : Age Today*/
- DATA source.DM;
- TITLE "Demography w/ current age";
- SET source.demography;
- ATTRIB AGE_TODAY LABEL="Age today" LENGTH=3;
- AGE_TODAY=year(today()) - birthdtyy;
- run;
- /* 2.1.2 : Fusion DM et Treatment_assignment*/
- DATA source.DM;
- TITLE "Demography merged w/ treatment";
- MERGE source.dm source.treatment_assignment;
- BY USUBJID;
- RUN;
- /* 2.1.3 : Age moyen max et min pour chaque groupe de traitement*/
- PROC MEANS DATA=source.DM VAR MAX MIN NONOBS
- MAXDEC=2;
- VAR age;
- CLASS trtcd;
- ;
- title "Age statistics by treatment grp";
- /*-----------------------------------------------2.2------------------------------------------------------------*/
- /*2.2.1*/
- DATA source.TAILLE;
- SET SOURCE.PHYSICAL_EXAM;
- WHERE HGT is not null;
- KEEP USUBJID HGT;
- RUN;
- /*On récupere le poids et l'id de la visite correspondante*/
- DATA source.POIDS;
- SET SOURCE.PHYSICAL_EXAM;
- WHERE WGT is not null;
- KEEP USUBJID WGT WGTU VISID;
- RUN;
- /*Récupération des dates des visites*/
- DATA source.DATE;
- SET SOURCE.DATE_OF_VISIT;
- KEEP USUBJID VISID VISDT;
- RUN;
- /*Tri par USUBJID pour la fusion des 3 tables*/
- PROC SORT DATA=source.TAILLE;
- BY USUBJID;
- RUN;
- PROC SORT DATA=source.POIDS;
- BY USUBJID VISID;
- RUN;
- PROC SORT DATA=source.DATE;
- BY USUBJID VISID;
- RUN;
- /*Fusion du poids et de la date de visite*/
- DATA source.imc;
- MERGE source.POIDS (IN=mark1) source.DATE (IN=mark2);
- BY USUBJID VISID;
- if mark1 and mark2 then output;
- RUN;
- /*Fusion de la taille et de la table imc*/
- DATA source.imc;
- MERGE source.TAILLE source.imc;
- BY USUBJID;
- RUN;
- /*Tri pour avoir la dernière visite en premier*/
- PROC SORT DATA=source.imc;
- BY USUBJID DESCENDING VISDT;
- RUN;
- /*Supprime les doublons pour garder seulement la dernière visite de chaque individu*/
- PROC SORT DATA=source.imc nodupkey;
- BY USUBJID;
- RUN;
- /* creer un nouveau dataset ou il y a l'imc calcule*/
- DATA source.CalculImc;
- SET source.imc;
- ATTRIB imc
- LABEL="IMC"
- LENGTH=3
- ;
- imc= (WGT/((HGT/100)*(HGT/100)));
- RUN;
- /*2.2.2*/
- /*fusion de physical exam et de la date de visite*/
- DATA source.Physicalvisit;
- MERGE source.physical_exam (IN=mark1) source.DATE (IN=mark2);
- BY USUBJID VISID;
- if mark1 and mark2 then output;
- RUN;
- /*fusion de physicalvisit avec dm pour avoir le dataset PE*/
- DATA source.PE;
- MERGE source.physicalvisit source.dm;
- BY USUBJID;
- RUN;
- /*2.2.3*/
- /*On fusionne pour que les groupes de traitements et les imc soient dans la meme table*/
- DATA source.IMC_moyen;
- MERGE source.calculimc source.treatment_assignment;
- BY USUBJID;
- RUN;
- /*on cherche donc l'imc moyen pour chaque groupe de traitement*/
- PROC MEANS DATA=source.IMC_moyen
- MEDIAN STDDEV
- MAXDEC=3;
- VAR imc;
- CLASS TRTDESC;
- RUN;
- /*représentation graphique de l'IMC pour les différents groupes de traitement*/
- PROC SGPLOT DATA=source.imc_moyen;
- VBAR TRTDESC / RESPONSE= imc STAT=MEAN;
- TITLE 'Graphique de l IMC par groupes';
- RUN;
- /*2.2.4*/
- /*a) On définit Ho pour qui l'imc calculé depend du traitement avec le mentalor 50mg, le mentalor 120mg et le placebo
- Il faut vérifier la variable continue, pour chaque groupe, suit une distribution normal et il faut aussi vérifier
- l'égalité des variances.
- */
- ODS GRAPHICS ON;
- PROC ANOVA DATA=SOURCE.imc_moyen;
- CLASS TRTDESC;
- MODEL imc = TRTDESC;
- TITLE"Hypothèses: les IMC sont égales";
- RUN;
- /*P > 0.05 donc l'hypothèse est rejetée, l'imc ne dépend pas du groupe de traitement*/
- /*2.2.5*/
- /*On crée un nouveau dataset qui contient l'imc et le sex*/
- DATA source.PEimc;
- MERGE source.imc_moyen source.dm;
- BY USUBJID;
- RUN;
- /*tri par sex et par groupe de traitement*/
- PROC SORT data=source.peimc;
- by TRTCD SEX;
- run;
- /*Analyse des valeurs numériques par sexe */
- proc means data=source.peimc maxdec=2;
- var age wgt hgt imc;
- CLASS sex;
- run;
- /*On remarque grâce a ces resultats qu'en moyenne, quelque soit le groupe, le poids, la taille, l'imc sont superieur pour les hommes a celle des femmes.
- Pour ce qui est des autres variables on voit que l'age des femmes est superieur a celui des hommes */
- /*représentation graphique des valeurs numériques pour les différents groupes de traitement*/
- PROC SGPLOT DATA=source.peimc;
- VBAR TRTDESC / RESPONSE= age STAT=MEAN;
- TITLE 'Graphique de l age par groupes de traitement';
- RUN;
- PROC SGPLOT DATA=source.peimc;
- VBAR TRTDESC / RESPONSE= wgt STAT=MEAN;
- TITLE 'Graphique du poids par groupes de traitement';
- RUN;
- PROC SGPLOT DATA=source.peimc;
- VBAR TRTDESC / RESPONSE= hgt STAT=MEAN;
- TITLE 'Graphiquede la taille par groupes de traitement';
- RUN;
- PROC SGPLOT DATA=source.peimc;
- VBAR TRTDESC / RESPONSE= imc STAT=MEAN;
- TITLE 'Graphique de l imc par groupes de traitement';
- RUN;
- /*-----------------------------------------------2.3------------------------------------------------------------*/
- /*2.3.1 : Tension et 2.3.2 : Diagnostic*/
- DATA source.Tension;
- TITLE "Tension";
- SET source.vital_signs;
- ATTRIB tension label="Diagnostique tension" LENGTH=$40;
- IF SYS > 180 OR DIA > 110 THEN
- tension = "Hypertension sévère";
- ELSE IF SYS > 159 OR DIA > 99 THEN
- tension = "Hypertension modérée";
- ELSE IF SYS > 139 OR DIA > 89 THEN
- tension = "Hypertension légère";
- ELSE IF SYS > 129 OR DIA > 84 THEN
- tension = "Tension normale élevée";
- ELSE IF SYS > 119 OR DIA > 79 THEN
- tension = "Tension normale";
- ELSE tension = "Tension optimale";
- run;
- /*2.3.3 : Fusion avec Date_of_visit*/
- DATA source.VS;
- TITLE "Tension merged w/ Date_of_visit";
- MERGE source.Tension source.Date_of_visit;
- BY USUBJID;
- IF SYS=. OR DIA =. THEN tension = "Non calculé";
- run;
- /*PROC PRINT DATA=source.Tension LABEL NOOBS;
- run;*/
- /*2.3.4 : Fusion VS et PE*/
- PROC SORT data=source.PE;
- BY USUBJID;
- run;
- PROC SORT data=source.VS;
- BY USUBJID;
- run;
- DATA source.VS_PE;
- TITLE "VS merged w/ PE";
- MERGE source.VS source.PE;
- BY USUBJID;
- run;
- /*2.3.5 : Fréquence paramètres*/
- PROC SORT DATA=source.vs_pe OUT = source.vs_pe;
- BY TRTCD;
- run;
- PROC FREQ DATA=source.vs_pe ORDER=freq;
- TABLES SYS*TEMP / LIST NOCUM OUT=source.sys_avg_by_trtmntgrp;
- BY TRTCD;
- run;
- /*2.3.6 : Égalité moyenne tension systolique */
- PROC ANOVA DATA=source.vs_pe;
- CLASS TRTCD;
- MODEL SYS = TRTCD;
- run;
- PROC FREQ DATA=source.vs_pe;
- TABLE SYS / chisq;
- run;
- /*-----------------------------------------------2.4------------------------------------------------------------*/
- /* Tri de la table mmse_result par patient et numéro de visite */
- /* SORTSEQ + numeric_collation : permet le tri de la colonne visdesc */
- PROC SORT DATA = Source.mmse_result OUT = SOurce.mmse_result_ordered SORTSEQ=linguistic (numeric_collation=on);
- BY USUBJID VISID;
- RUN ;
- /* 2.4.1 */
- PROC SORT DATA = Source.mmse_result OUT = source.tableTriee ;
- BY USUBJID VISID ;
- RUN ;
- PROC TRANSPOSE DATA = Source.tableTriee OUT = Source.qst ;
- BY USUBJID VISID;
- VAR MMSED1 MMSED2 MMSED3 MMSED5 MMSED6 MMSED7 MMSED8 MMSED9 MMSED10 MMSED11 MMSED12 ;
- RUN ;
- PROC TRANSPOSE DATA = Source.tableTriee OUT = Source.score PREFIX=Score ;
- BY USUBJID VISID ;
- VAR MMSES1 MMSES2 MMSES3 MMSES5 MMSES6 MMSES7 MMSES8 MMSES9 MMSES10 MMSES11 MMSES12;
- RUN ;
- DATA Source.FIN ;
- MERGE Source.qst Source.score ;
- BY USUBJID VISID ;
- RUN ;
- /*2.4.2*/
- /* Transposition des scores par visites */
- PROC TRANSPOSE DATA=Source.mmse_result_ordered OUT=Source.mmse_transposed_visit_answer(DROP=_name_ _label_) PREFIX=Visite_ ;
- BY usubjid;
- VAR MMSES1-MMSES3 MMSES5-MMSES12;
- ID visid;
- RUN;
- /* Fusion des deux tables */
- /* On réexploite la table transposée des questions */
- DATA Source.mmse_merged_2412; /* 2412 référence le # de question */
- MERGE Source.fin(IN=mark1) Source.mmse_transposed_visit_answer(IN=mark2);
- BY usubjid;
- IF mark1 THEN OUTPUT;
- RUN;
- /* Affichage de la table de résultat */
- /* missing : remplace les valeures nulles */
- Option missing="";
- DATA Source.mmse_q LABEL;
- SET Source.mmse_merged_2412;
- DROP visid;
- ATTRIB usubjid
- LABEL = "N° du patient";
- ATTRIB Q1
- LABEL = "Question";
- RUN;
- /* 2.4.3 */
- PROC SORT DATA= Source.mmse_result OUT=source.int;
- BY USUBJID VISID;
- RUN;
- PROC TRANSPOSE DATA = Source.int OUT = Source.deux PREFIX=sco ;
- BY USUBJID VISID;
- VAR MMSES1 MMSES2 MMSES3 MMSES5 MMSES6 MMSES7 MMSES8 MMSES9 MMSES10 MMSES11 MMSES12;
- RUN;
- proc sort data=Source.deux;
- by USUBJID VISID;
- run;
- data Source.MMSE_ScoreInt(keep=USUBJID VISID score);
- set Source.deux;
- retain score;
- by USUBJID VISID;
- if first.VISID then score=sco1;
- else score=score+sco1;
- if last.VISID;
- run;
- DATA Source.groupesT;
- SET Source.treatment_assignment(Keep=USUBJID TRTCD);
- RUN;
- DATA Source.groupesT2;
- SET Source.groupesT;
- Attrib numGroupe LABEL="Numéro de groupe en Numérique";
- numGroupe = input(TRTCD,20.6);
- numGroupe=TRTCD;
- RUN;
- PROC SQL ;
- create table Source.MMSE_Score as
- select a.*, b.*
- from Source.MMSE_ScoreInt as a left join Source.groupesT2 as b on a.USUBJID=b.USUBJID
- ORDER BY USUBJID, VISID;
- QUIT ;
- /*2.4.4*/
- PROC CORR DATA=Source.MMSE_Score KENDALL;
- /*Proche de 0, donc il y a une corrélation*/
- RUN;
- /*2.4.5*/
- /*VAR score numGroupe;*/
- PROC SQL ;
- create table Source.MMSE_freq as
- Select score
- from Source.MMSE_Score
- where VISID = (Select min(VISID)
- From Source.MMSE_Score)
- GROUP BY USUBJID;
- QUIT;
- data Source.MMSE_freq ;
- set Source.MMSE_SCORE;
- by USUBJID;
- if first.USUBJID or last.USUBJID;
- run;
- /*2.4.6*/
- PROC TRANSPOSE DATA = Source.MMSE_freq OUT = Source.SixFin ;
- BY USUBJID ;
- VAR score ;
- RUN ;
- proc freq data=Source.SixFin;
- table COL1*COL2/ norow nocol;
- ;
- run;
- /*-----------------------------------------------2.5------------------------------------------------------------*/
- /*Question 2.5.1 : création d'un dataset adverse_event2, copie d'adverse-event
- avec les dates complétés de début et fin de chaque événement indésirable */
- data SOURCE.adverse_event2;
- SET SOURCE.adverse_event;
- ATTRIB ae_start_date
- LABEL="DATE début"
- Format=nldate.;
- ATTRIB ae_end_date
- LABEL="DATE fin"
- Format=nldate.;
- ae_start_date = aestdt;
- ae_end_date = AEENDT;
- if AESTDTMO = 'JAN' then
- num_month = 01;
- else if AESTDTMO = 'FEB' then
- num_month = 02;
- else if AESTDTMO = 'MAR' then
- num_month = 03;
- else if AESTDTMO = 'APR' then
- num_month = 04;
- else if AESTDTMO = 'MAI' then
- num_month = 05;
- else if AESTDTMO = 'JUN' then
- num_month = 06;
- else if AESTDTMO = 'JUL' then
- num_month = 07;
- else if AESTDTMO = 'AUG' then
- num_month = 08;
- else if AESTDTMO = 'SEP' then
- num_month = 09;
- else if AESTDTMO = 'OCT' then
- num_month = 10;
- else if AESTDTMO = 'NOV' then
- num_month = 11;
- else if AESTDTMO = 'DEC' then
- num_month = 12;
- if AESTDTDD = ' ' && AESTDTMO = ' ' then /* jour et mois vide pour date début*/
- ae_start_date = mdy(01,01,AESTDTYY); /* mois/jour/année */
- else if AESTDTDD = ' ' then /* si seulement le jour est vide */
- ae_start_date = mdy(num_month,01,AESTDTYY);
- else if AESTDTMO = ' ' then /*si seulement le mois est vide*/
- ae_start_date = mdy(01,AESTDTDD,AESTDTYY);
- if AEENDTMO = 'JAN' then
- num_month_fin = 01;
- else if AEENDTMO = 'FEB' then
- num_month_fin = 02;
- else if AEENDTMO = 'MAR' then
- num_month_fin = 03;
- else if AEENDTMO = 'APR' then
- num_month_fin = 04;
- else if AEENDTMO = 'MAI' then
- num_month_fin = 05;
- else if AEENDTMO = 'JUN' then
- num_month_fin = 06;
- else if AEENDTMO = 'JUL' then
- num_month_fin = 07;
- else if AEENDTMO = 'AUG' then
- num_month_fin = 08;
- else if AEENDTMO = 'SEP' then
- num_month_fin = 09;
- else if AEENDTMO = 'OCT' then
- num_month_fin = 10;
- else if AEENDTMO = 'NOV' then
- num_month_fin = 11;
- else if AEENDTMO = 'DEC' then
- num_month_fin = 12;
- /*Pour avoir le dernier jour du mois */
- aeendtc1= cats(AEENDTYY,'-',num_month_fin);
- aeendtc2=input(aeendtc1,anydtdte7.);
- lastDay=intnx ('month',aeendtc2,0,'E');
- if AEENDTDD = ' ' && AEENDTMO = ' ' then /* jour et mois vide pour date fin*/
- ae_end_date = mdy(12,31,AEENDTYY);
- else if AEENDTDD = ' ' then /* si seulement le jour est vide */
- ae_end_date = lastDay;
- else if AEENDTMO = ' ' then /*si seulement le mois est vide*/
- ae_end_date = mdy(12,AEENDTDD,AEENDTYY);
- RUN;
- /*Question 2.5.2 : on enlève les varibles "intermédiaires" utilisées
- pour la question 2.5.1*/
- data SOURCE.adverse_event2(drop = num_month num_month_fin aeendtc1 aeendtc2 lastDay);
- set SOURCE.adverse_event2;
- RUN;
- /* Question 2.5.2 : fusion entre le dataset AE et treatment_assignment, pour avoir le groupe
- de traitement*/
- data source.AE;
- merge source.adverse_event2 (IN=mark1) source.treatment_assignment(keep=TRTCD ASGNDTTM USUBJID IN=mark2);
- by USUBJID;
- if mark1 then output;
- RUN;
- /* Question 2.5.2 : récupération de la dernière visite pour chaque patient
- dans un nouveau dataset "lastvisit"*/
- proc sql undo_policy=none;
- create table source.lastVisit as
- select USUBJID, max(VISDT) as VISDT format=nldate.
- from source.date_of_visit
- group by USUBJID;
- quit;
- /*Question 2.5.2 :fusion entre les deux datasets pour avoir la date
- de dernière visite dans le dataset AE*/
- data source.AE;
- merge source.AE(IN=mark1) source.lastVisit(IN=mark2);
- by USUBJID;
- if mark1 then output;
- RUN;
- /*Questions 2.5.3 : séparation des données en 3 tableaux difdérents suivant le groupe de traitement*/
- data source.AE1;
- set source.AE (WHERE=(TRTCD="1"));
- RUN;
- data source.AE2;
- set source.AE (WHERE=(TRTCD="2"));
- RUN;
- data source.AE3;
- set source.AE (WHERE=(TRTCD="3"));
- RUN;
- /*Questions 2.5.3 + 2.5.4 : création et affichage des graphiques pour chaque groupe de traitement*/
- title "AE de chaque patient en fonction du temps du groupe de traitement 1";
- proc sgplot data=source.AE1 ;
- highlow y=USUBJID low=ae_start_date high=ae_end_date /
- group=AESEV
- type=bar
- barwidth=0.4;
- yaxis label="Patient ID";
- xaxis label="Time" min= '01jan05'd;
- scatter x=ae_start_date y=USUBJID / markerattrs=graphdatadefault(size=6px symbol=trianglefilled color=blue);
- scatter x=VISDT y=USUBJID / markerattrs=graphdatadefault(size=6px symbol=circlefilled color=green);
- run;
- title "AE de chaque patient en fonction du temps du groupe de traitement 2";
- proc sgplot data=source.AE2 ;
- highlow y=USUBJID low=ae_start_date high=ae_end_date /
- group=AESEV
- type=bar
- barwidth=0.4;
- yaxis label="Patient ID";
- xaxis label="Time" min= '01jan05'd;
- scatter x=ae_start_date y=USUBJID / markerattrs=graphdatadefault(size=6px symbol=trianglefilled color=blue);
- scatter x=VISDT y=USUBJID / markerattrs=graphdatadefault(size=6px symbol=circlefilled color=green);
- run;
- title "AE de chaque patient en fonction du temps du groupe de traitement 3";
- proc sgplot data=source.AE3 ;
- highlow y=USUBJID low=ae_start_date high=ae_end_date /
- group=AESEV
- type=bar
- barwidth=0.4;
- yaxis label="Patient ID";
- xaxis label="Time" min= '01jan05'd;
- scatter x=ae_start_date y=USUBJID / markerattrs=graphdatadefault(size=6px symbol=trianglefilled color=blue);
- scatter x=VISDT y=USUBJID / markerattrs=graphdatadefault(size=6px symbol=circlefilled color=green);
- run;
- /*Question 2.5.5* : récupération du nombre de chaque soccode pour chaque groupe de traitement*/
- proc sql undo_policy=none;
- create table source.freqsoc as
- select TRTCD, SOCCODE, count(SOCCODE) as frequence
- from source.AE
- group by SOCCODE, TRTCD
- order by TRTCD;
- quit;
- /*Question 2.5.5 : graphique représentant la proportion des soc termes en fonctions du groupe de traitement*/
- title "Proportions des « SOC termes » en fonction du groupe traitement";
- proc sgplot data=source.freqsoc;
- vbar TRTCD / group=SOCCODE response=frequence seglabel seglabelattrs=(size=12);
- run;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement