Publicado el :
Estadística CREATION_INTERNE

Cálculo del Porcentaje de Días Cubiertos (PDC) por paciente

Este código también está disponible en: Deutsch English Français
En espera de validación
Este script SAS© implementa un algoritmo para evaluar la adherencia a un tratamiento farmacológico. Comienza generando un conjunto de datos ficticio ('fills') que simula prescripciones para 100 pacientes. Cada registro contiene un identificador de paciente, la fecha de dispensación y la duración del tratamiento. Luego, el script ordena estos datos por paciente y por fecha. La etapa DATA principal procesa estos datos paciente por paciente para calcular el PDC en varios intervalos de tiempo consecutivos (definidos por las macrovariables &interv y &ninterv). El algoritmo 'apila' los días de cobertura para cada prescripción con el fin de determinar la cobertura continua. El resultado final es una tabla ('pdc_ptlev') que contiene una fila por paciente, con el PDC calculado para cada intervalo, permitiendo un análisis de la continuidad del tratamiento.
Análisis de datos

Type : CREATION_INTERNE


El conjunto de datos de entrada 'fills' se genera completamente de forma procedimental en la primera etapa DATA. No depende de ninguna fuente de datos externa. Sirve únicamente como ejemplo para el algoritmo de cálculo del PDC.

1 Bloque de código
DATA STEP Data
Explicación :
Este bloque crea un conjunto de datos de prueba llamado 'fills'. Simula los datos de prescripción para 100 pacientes generando un identificador (patientICN), una fecha de dispensación (edate), una duración del tratamiento (days) y una fecha de fallecimiento opcional (dod) para la censura. Los valores se generan aleatoriamente para crear un conjunto de datos realista para la demostración.
¡Copiado!
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 Bloque de código
PROC PRINT
Explicación :
Muestra las primeras 30 observaciones del conjunto de datos 'fills' recién creado. Esto permite una verificación visual rápida para asegurar que los datos de prueba se generaron correctamente.
¡Copiado!
1title 'first 50 obs of fake input
2data';
3PROC PRINT
4DATA=fills (obs=30);
5 
6RUN;
7 
3 Bloque de código
PROC SORT
Explicación :
Ordena el conjunto de datos 'fills' por identificador de paciente (patientICN) y luego por fecha de dispensación (edate). Este paso es crucial para el procesamiento secuencial por paciente realizado en el siguiente bloque de cálculo.
¡Copiado!
1PROC SORT DATA=fills; BY patientICN edate; RUN;
4 Bloque de código
DATA STEP Data
Explicación :
Este bloque es el corazón del algoritmo. Lee los datos ordenados y, para cada paciente, calcula los días de cobertura de medicación. Utilizando las instrucciones `first.patientICN` y `last.patientICN`, inicializa y finaliza los cálculos para cada individuo. Recorre las prescripciones, 'apila' los días de cobertura e incrementa el contador del intervalo de tiempo correcto. Al final de los datos de un paciente, calcula el PDC para cada intervalo y genera una sola línea de salida para ese paciente en la tabla 'pdc_ptlev'.
¡Copiado!
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 Bloque de código
PROC PRINT
Explicación :
Muestra las primeras 30 observaciones del conjunto de datos final 'pdc_ptlev'. Cada fila representa un paciente y las columnas muestran el PDC para cada intervalo. La opción `heading=v` permite una visualización vertical de los encabezados para una mejor legibilidad.
¡Copiado!
1title 'first 30 obs of output -- one row/patient';
2PROC PRINT
3DATA=pdc_ptlev (obs=30) heading=v width=min;
4 
5RUN;
6title;
7 
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
Información de copyright : J Smith Jul 2023