Publié le :
Statistique CREATION_INTERNE

Calcul du Pourcentage de Jours Couverts (PDC) par patient

Ce code est également disponible en : Deutsch English Español
En attente de validation
Ce script SAS© met en œuvre un algorithme pour évaluer l'adhérence à un traitement médicamenteux. Il commence par générer un jeu de données factice ('fills') simulant des prescriptions pour 100 patients. Chaque enregistrement contient un identifiant patient, la date de délivrance et la durée du traitement. Ensuite, le script trie ces données par patient et par date. L'étape DATA principale traite ces données patient par patient pour calculer le PDC sur plusieurs intervalles de temps consécutifs (définis par les macro-variables &interv et &ninterv). L'algorithme 'empile' les jours de couverture pour chaque prescription afin de déterminer la couverture continue. Le résultat final est une table ('pdc_ptlev') contenant une ligne par patient, avec le PDC calculé pour chaque intervalle, permettant une analyse de la continuité du traitement.
Analyse des données

Type : CREATION_INTERNE


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é !
1DATA fills;
2LENGTH patientICN 5 dod edate days 5;
3FORMAT edate date9.;
4array T {5} _temporary_ (30, 30, 30, 90, 10);
5DO 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.15 THEN 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)<.05 THEN leave;
16 END;
17END;
18drop i;
19RUN;
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é !
1title 'first 50 obs of fake input
2data';
3PROC PRINT
4DATA=fills (obs=30);
5 
6RUN;
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é !
1PROC SORT DATA=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é !
1%let interv=90; * number of days in interval ;
2%let ninterv=12; * number of intervals ;
3 
4DATA pdc_ptlev;
5SET fills;
6BY patientICN edate;
7LENGTH currend 5 currpos 3 bndry 3 pdc_p1-pdc_p&ninterv 5;
8retain currend currpos pdc_:;
9array p {*} pdc_:;
10array ends {&ninterv} _temporary_;
11array D {&ninterv} _temporary_;
12IF first.patientICN THEN DO;
13 currend=.;
14 currpos=1;
15 bndry=0;
16 DO i=1 to dim(p);
17 p[i]=0;
18 bndry+&interv;
19 ends[i]=edate+bndry;
20 D[i]=min(&interv,max(0/(DOD>.),&interv-(ends[i]-DOD)));
21 END;
22END;
23 
24currend=max(currend, edate);
25DO while (days>0);
26 currend+1;
27 days=days-1;
28 IF currend>ends[dim(ends)] or .THEN leave;
29 DO while (ends[currpos]<=currend and currpos
30 currpos+1;
31 END;
32 p[currpos]+1;
33END;
34 
35IF last.patientICN THEN DO;
36 DO i=1 to dim(p);
37 p[i]=p[i]/D[i];
38 END;
39 OUTPUT;
40END;
41keep patientICN pdc_:;
42FORMAT pdc_: percent8.1;
43RUN;
5 Bloc de code
PROC PRINT
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é !
1title 'first 30 obs of output -- one row/patient';
2PROC PRINT
3DATA=pdc_ptlev (obs=30) heading=v width=min;
4 
5RUN;
6title;
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.
Informations de Copyright : J Smith Jul 2023