Veröffentlicht am :
Statistik INTERNE_ERSTELLUNG

Berechnung des Prozentsatzes abgedeckter Tage (PDC) pro Patient

Dieser Code ist auch verfügbar auf: English Español Français
Wartet auf Validierung
Dieses SAS©-Skript implementiert einen Algorithmus zur Bewertung der Adhärenz an eine medikamentöse Behandlung. Es beginnt mit der Generierung eines fiktiven Datensatzes ('fills'), der Verschreibungen für 100 Patienten simuliert. Jeder Eintrag enthält eine Patienten-ID, das Abgabedatum und die Behandlungsdauer. Anschließend sortiert das Skript diese Daten nach Patient und Datum. Der Haupt-DATA-Schritt verarbeitet diese Daten Patient für Patient, um den PDC über mehrere aufeinanderfolgende Zeitintervalle (definiert durch die Makrovariablen &interv und &ninterv) zu berechnen. Der Algorithmus 'stapelt' die Abdeckungstage für jede Verschreibung, um eine kontinuierliche Abdeckung zu bestimmen. Das Endergebnis ist eine Tabelle ('pdc_ptlev'), die eine Zeile pro Patient enthält, mit dem für jedes Intervall berechneten PDC, was eine Analyse der Behandlungs continuity ermöglicht.
Datenanalyse

Type : INTERNE_ERSTELLUNG


Der Eingabedatensatz 'fills' wird im ersten DATA-Schritt vollständig prozedural generiert. Er hängt von keiner externen Datenquelle ab. Er dient ausschließlich als Beispiel für den PDC-Berechnungsalgorithmus.

1 Codeblock
DATA STEP Data
Erklärung :
Dieser Block erstellt einen Testdatensatz namens 'fills'. Er simuliert Verschreibungsdaten für 100 Patienten, indem er eine Kennung (patientICN), ein Abgabedatum (edate), eine Behandlungsdauer (days) und ein optionales Sterbedatum (dod) zur Zensur generiert. Die Werte werden zufällig generiert, um einen realistischen Datensatz für die Demonstration zu erstellen.
Kopiert!
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 Codeblock
PROC PRINT
Erklärung :
Zeigt die ersten 30 Beobachtungen des neu erstellten Datensatzes 'fills' an. Dies ermöglicht eine schnelle visuelle Überprüfung, um sicherzustellen, dass die Testdaten korrekt generiert wurden.
Kopiert!
1title 'first 50 obs of fake input
2data';
3PROC PRINT
4DATA=fills (obs=30);
5 
6RUN;
7 
3 Codeblock
PROC SORT
Erklärung :
Sortiert den Datensatz 'fills' nach Patienten-ID (patientICN) und dann nach Abgabedatum (edate). Dieser Schritt ist entscheidend für die sequentielle patientenweise Verarbeitung im nächsten Berechnungsblock.
Kopiert!
1PROC SORT DATA=fills; BY patientICN edate; RUN;
4 Codeblock
DATA STEP Data
Erklärung :
Dieser Block ist das Herzstück des Algorithmus. Er liest die sortierten Daten und berechnet für jeden Patienten die Tage der Medikamentenabdeckung. Unter Verwendung der Anweisungen `first.patientICN` und `last.patientICN` initialisiert und finalisiert er die Berechnungen für jedes Individuum. Er durchläuft die Verschreibungen, 'stapelt' die Abdeckungstage und inkrementiert den Zähler für das richtige Zeitintervall. Am Ende der Daten eines Patienten berechnet er den PDC für jedes Intervall und generiert eine einzige Ausgabezeile für diesen Patienten in der Tabelle 'pdc_ptlev'.
Kopiert!
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 Codeblock
PROC PRINT
Erklärung :
Zeigt die ersten 30 Beobachtungen des finalen Datensatzes 'pdc_ptlev' an. Jede Zeile repräsentiert einen Patienten, und die Spalten zeigen den PDC für jedes Intervall. Die Option `heading=v` ermöglicht eine vertikale Anzeige der Überschriften für bessere Lesbarkeit.
Kopiert!
1title 'first 30 obs of output -- one row/patient';
2PROC PRINT
3DATA=pdc_ptlev (obs=30) heading=v width=min;
4 
5RUN;
6title;
7 
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : J Smith Jul 2023