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!
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 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!
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 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!
proc sort data=fills; by patientICN edate; run;
1
PROC SORTDATA=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!
%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;
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!
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
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.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.