Le jeu de données d'entrée 'fills' est entièrement généré de manière procédurale dans la première étape DATA. Il ne dépend d'aucune source de données externe. Il sert uniquement d'exemple pour l'algorithme de calcul du PDC.
1 Bloc de code
DATA STEP Data
Explication : Ce bloc crée un jeu de données de test nommé 'fills'. Il simule les données de prescription pour 100 patients en générant un identifiant (patientICN), une date de délivrance (edate), une durée de traitement (days), et une date de décès optionnelle (dod) pour la censure. Les valeurs sont générées aléatoirement pour créer un jeu de données réaliste pour la démonstration.
Copié !
data fills;
length patientICN 5 dod edate days 5;
format edate date9.;
array T {5} _temporary_ (30, 30, 30, 90, 10);
do i=1 to 100;
patientICN=1000+i;
edate='01Jan2020'd + int(ranuni(0)*100);
slack=int(rand('erlang', 2)*10);
dod=.;
if ranuni(0)<0.15 then dod=edate+int(ranuni(0)*730);
do while (1);
days=T[int(ranuni(0)*dim(T)+1)];
output;
edate+max(1,int(days+rand('normal')*5))+slack;
if ranuni(0)<.05 then leave;
end;
end;
drop i;
run;
1
DATA fills;
2
LENGTH patientICN 5 dod edate days 5;
3
FORMAT edate date9.;
4
array T {5} _temporary_ (30, 30, 30, 90, 10);
5
DO i=1 to 100;
6
patientICN=1000+i;
7
edate='01Jan2020'd + int(ranuni(0)*100);
8
slack=int(rand('erlang', 2)*10);
9
dod=.;
10
IF ranuni(0)<0.15THEN dod=edate+int(ranuni(0)*730);
11
DO while (1);
12
days=T[int(ranuni(0)*dim(T)+1)];
13
OUTPUT;
14
edate+max(1,int(days+rand('normal')*5))+slack;
15
IF ranuni(0)<.05THEN leave;
16
END;
17
END;
18
drop i;
19
RUN;
2 Bloc de code
PROC PRINT
Explication : Affiche les 30 premières observations du jeu de données 'fills' qui vient d'être créé. Cela permet une vérification visuelle rapide pour s'assurer que les données de test ont été générées correctement.
Copié !
title 'first 50 obs of fake input data';
proc print data=fills (obs=30); run;
1
title 'first 50 obs of fake input
2
data';
3
PROC PRINT
4
DATA=fills (obs=30);
5
6
RUN;
7
3 Bloc de code
PROC SORT
Explication : Trie le jeu de données 'fills' par identifiant patient (patientICN) puis par date de délivrance (edate). Cette étape est cruciale pour le traitement séquentiel par patient effectué dans le bloc de calcul suivant.
Copié !
proc sort data=fills; by patientICN edate; run;
1
PROC SORTDATA=fills; BY patientICN edate; RUN;
4 Bloc de code
DATA STEP Data
Explication : Ce bloc est le cœur de l'algorithme. Il lit les données triées et, pour chaque patient, calcule les jours de couverture de médicament. En utilisant les instructions `first.patientICN` et `last.patientICN`, il initialise et finalise les calculs pour chaque individu. Il parcourt les prescriptions, 'empile' les jours de couverture, et incrémente le compteur du bon intervalle de temps. À la fin des données d'un patient, il calcule le PDC pour chaque intervalle et génère une seule ligne de sortie pour ce patient dans la table 'pdc_ptlev'.
Copié !
%let interv=90; * number of days in interval ;
%let ninterv=12; * number of intervals ;
data pdc_ptlev;
set fills;
by patientICN edate;
length currend 5 currpos 3 bndry 3 pdc_p1-pdc_p&ninterv 5;
retain currend currpos pdc_:;
array p {*} pdc_:;
array ends {&ninterv} _temporary_;
array D {&ninterv} _temporary_;
if first.patientICN then do;
currend=.;
currpos=1;
bndry=0;
do i=1 to dim(p);
p[i]=0;
bndry+&interv;
ends[i]=edate+bndry;
D[i]=min(&interv,max(0/(DOD>.),&interv-(ends[i]-DOD)));
end;
end;
currend=max(currend, edate);
do while (days>0);
currend+1;
days=days-1;
if currend>ends[dim(ends)] or .<dod<=currend then leave;
do while (ends[currpos]<=currend and currpos<dim(ends));
currpos+1;
end;
p[currpos]+1;
end;
if last.patientICN then do;
do i=1 to dim(p);
p[i]=p[i]/D[i];
end;
output;
end;
keep patientICN pdc_:;
format pdc_: percent8.1;
run;
Explication : Affiche les 30 premières observations du jeu de données final 'pdc_ptlev'. Chaque ligne représente un patient et les colonnes montrent le PDC pour chaque intervalle. L'option `heading=v` permet un affichage vertical des en-têtes pour une meilleure lisibilité.
Copié !
title 'first 30 obs of output -- one row/patient';
proc print data=pdc_ptlev (obs=30) heading=v width=min; run;
title;
1
title 'first 30 obs of output -- one row/patient';
2
PROC PRINT
3
DATA=pdc_ptlev (obs=30) heading=v width=min;
4
5
RUN;
6
title;
7
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.