Skip to main content

Time-dependent variables and SAS PHREG

There are several ways to include time-dependent variables in a call to SAS' Proc PHREG: Programming statements within PHREG or data steps combined with PHREG counting process format, i.e. in the model statement we use the syntax

model (t_in,t_out)*censored(0) = X1 ... Xn;

instead of

model t*censored(0) = X1 ... Xn;

Click the title to download the following SAS macro I have written. If you find an error please report it, otherwise you are free to use it. Another macro that can be used for the purpose of splitting a data set according to time-dependent variables is the Lexis macro developed by Bendix Carstensen %LEXIS


/*Macro for splitting data according to 0-1 time dependent variables*/

%macro split_time(
filein, /*Data set file containing td_date among other variables*/
id, /*Patient id - needed since we sort wrt. id and datein - could be removed */
td_var, /*Created 0-1 time-dependent variable*/
td_date, /*Date for update of timedependent variable*/
datein, /*Entry date*/
dateout, /*Exit date*/
cenvar, /*Censored 0 yes 1 no*/
fileout, /*Output file*/
labeltext /*td_var label - plain text - no quotes!*/
);


proc sort data=&filein out=temp; by id &datein; run;

data temp1;
set temp;
if (&dateout GT &td_date) then do;
&td_var=1;
&datein=max(&td_date,&datein);
end;
else delete;
run;

data temp3;
set temp;
if (&dateout LE &td_date) then &td_var=0;
else delete;
run;

data temp2;
set temp;
if (&dateout GT &td_date GT &datein) then do;
&dateout=&td_date;
&cenvar=0;
&td_var=0;
end;
else delete;
run;


data temp;
set temp1 temp2 temp3;
label &td_var="&labeltext";
run;

proc sort data=temp out=&fileout;
by &id &datein;
run;

%mend split_time;


/*Example of its use - three dates included on the input file are used*/
%inc 'Z:\split_time.sas';

proc sort data=lv.litval;
by id dateDep dateCon datePsy;
run;

%split_time(
lv.litval,
id,
conDep,
dateDep,
dateFirstPurchase,
eventTimeHosp,
censoredHosp,
outDataDep,
Concomitant use of antidepressants
);

%split_time(
outDataDep,
id,
conCon,
dateCon,
dateFirstPurchase,
eventTimeHosp,
censoredHosp,
outDataCon,
Concomitant use of anticonvulsants
);

%split_time(
outDataCon,
id,
conPsy,
datePsy,
dateFirstPurchase,
eventTimeHosp,
censoredHosp,
lv.litvalHosp,
Concomitant use of antipsychotics
);

Comments

Popular posts from this blog

HackRF on Windows 8

This technical note is based on  an extract from thread . I have made several changes and added recommendations. I have experienced lot of latency using GnuRadio and HackRF on Pentoo Linux, so I wanted to try out GnuRadio on Windows. HackRF One is a transceiver, so besides SDR capabilities, it can also transmit signals, inkluding sweeping a given range, uniform and Gaussian signals. Pentoo Linux provides the most direct access to HackRF and toolboxes. Install Pentoo Linux on a separate drive, then you can use osmocom_siggen from a terminal to transmit signals such as near-field GSM bursts, which will only be detectable within a meter. Installation of MGWin and cmake: Download and install the following packages: - MinGW Setup (Go to the Installer directory and download setup file) - CMake (I am using CMake 3.2.2 and I installed it in C:\CMake, this path is important in the commands we must send in the MinGW shell) Download and extract the packages

Alder/korrekt århundrede udfra cpr nummer

De fleste, der arbejder med registre eller databaser, står ofte med problemstillingen, at alder er uoplyst, medens cpr-nummer er kendt. Hvordan regner man den ud? Følgende regel er gældende: Hvis syvende ciffer er 0, 1, 2 eller 3 er man født i det 20. århunderede (1900-tallet) Ligeledes, hvis syvende ciffer er 4 eller 9, og årstallet (femte og sjette ciffer) er større end eller lig 37. Endelig er man født i det 19. århundrede (1800-tallet) hvis syvende ciffer er 5, 6, 7 eller 8 og årstallet er større end eller lig 58. Nedenfor finder du eksempel i SAS kode: En lille makro, der udover fødselsdato også udregner køn samt den præcise alder givet datovariabel. Kilde: Opbygning af CPR nummeret, cpr.dk proc format library=work; value gender 0="Female" 1="Male" ; run; %macro agefromCPR(cpr,datevar=inddto,birthvar=birth,agevar=age); dy_temp=input(substrn(&cpr,1,2),2.); mt_temp=input(substrn(&cpr,3,2),2.); yr_temp=input(substrn(&cpr,5,2),

Comorbidity indexes in SQL

Generating Elixhauser comorbidity index from Danish National Health Register as relational database. ( ICD 10 Coding  in SAS) A lookup-table based version of Charlson comorbidity index I made in SQL. A similar approach can be applied to Elixhauser. SELECT V_CPR, MAX(EI1)+MAX(EI2)+MAX(EI3)+MAX(EI4)+MAX(EI5)+ MAX(EI6)+MAX(EI7)+MAX(EI8)+MAX(EI9)+MAX(EI10)+ MAX(EI11)+MAX(EI12)+MAX(EI13)+MAX(EI14)+MAX(EI15)+ MAX(EI16)+MAX(EI17)+MAX(EI18)+MAX(EI19)+MAX(EI20)+ MAX(EI21)+MAX(EI22)+MAX(EI23)+MAX(EI24)+MAX(EI25)+ MAX(EI26)+MAX(EI27)+MAX(EI28)+MAX(EI29)+MAX(EI30)+MAX(EI31) AS Elixhauser FROM (SELECT V_CPR, -- Congestive Heart Failure CASE WHEN DIAG LIKE 'DI099%' OR DIAG LIKE 'DI110%' OR DIAG LIKE 'DI130%' OR DIAG LIKE 'DI132%' OR DIAG LIKE 'DI255%' OR DIAG LIKE 'DI420%' OR DIAG LIKE 'DI425%' OR DIAG LIKE 'DI426%' OR DIAG LIKE 'DI427%' OR DIAG LIKE 'DI428%' OR DIAG LIKE 'DI429%' OR D