Skip to content

Commit 00cc94f

Browse files
Update NHS England CKD algorithm
1 parent ec2538b commit 00cc94f

File tree

1 file changed

+36
-46
lines changed

1 file changed

+36
-46
lines changed

NHS England CKD algorithm

+36-46
Original file line numberDiff line numberDiff line change
@@ -8,52 +8,49 @@ load ("sir.data.rda") #long format input file with 1 row per event entry
88
#Identify potential creatinine based CKD patients (individuals with any egfr<60)
99
#Isolate the first qualifying test for each patient
1010

11-
crea.rep$KDmarkE<-ifelse(!is.na(crea.rep$CKDEPIeGFR) & crea.rep$CKDEPIeGFR<60,1,0)
12-
CKsE<-crea.rep[crea.rep$KDmarkE==1,c("PatientID","EntryDate","KDmarkE")] #Kidney Injury flagged tests
11+
crea.rep$KDmark<-ifelse(!is.na(crea.rep$CKDEPIeGFR) & crea.rep$CKDEPIeGFR<60,1,0)
12+
CKs<-crea.rep[crea.rep$KDmark==1,c("PatientID","EntryDate","KDmark")] #Kidney Injury flagged tests
1313

1414
#Create a dataset including all data from patients with at least 1 KD flag:
15-
CKpotE<-crea.rep[crea.rep$PatientID %in% CKsE$PatientID,]
16-
CKpotE$EntryDate2<-as.Date(as.character(CKpotE$EntryDate),format="%Y%m%d")
15+
CKpot<-crea.rep[crea.rep$PatientID %in% CKs$PatientID,]
16+
CKpot$EntryDate2<-as.Date(as.character(CKpot$EntryDate),format="%Y%m%d")
1717

1818
#Mark a 90 day lookback period
19-
CKpotE$EntryDate1<-as.Date(as.character(CKpotE$EntryDate),format="%Y%m%d")-90
20-
CKpotE<-CKpotE[,c("PatientID","event.date","KDmarkE","EntryDate1","EntryDate2","CKDEPIeGFR")]
19+
CKpot$EntryDate1<-as.Date(as.character(CKpot$EntryDate),format="%Y%m%d")-90
20+
CKpot<-CKpot[,c("PatientID","event.date","KDmark","EntryDate1","EntryDate2","CKDEPIeGFR")]
2121

22-
##############################################################################################
22+
############################################################################################## CHECKED
2323
#Diagnose CKD
2424
#If eGFR under 60 is not sustained for 90 days, recode KDmark as 0
25-
for (i in 1:length(CKpotE$PatientID)){
26-
CKpotE$CKDE[i]<-min(crea.rep$KDmarkE[crea.rep$PatientID==CKpotE$PatientID[i] &
27-
crea.rep$event.date>CKpotE$EntryDate1[i] & crea.rep$event.date<=CKpotE$EntryDate2[i]])
28-
CKpotE$MaxCKDE[i]<-max(crea.rep$CKDEPIeGFR[crea.rep$PatientID==CKpotE$PatientID[i] &
29-
crea.rep$event.date>CKpotE$EntryDate1[i] & crea.rep$event.date<=CKpotE$EntryDate2[i]])
30-
CKpotE$MinCKDE[i]<-min(crea.rep$CKDEPIeGFR[crea.rep$PatientID==CKpotE$PatientID[i] &
31-
crea.rep$event.date>CKpotE$EntryDate1[i] & crea.rep$event.date<=CKpotE$EntryDate2[i]])
25+
for (i in 1:length(CKpot$PatientID)){
26+
CKpot$CKD[i]<-min(crea.rep$KDmark[crea.rep$PatientID==CKpot$PatientID[i] &
27+
crea.rep$event.date>CKpot$EntryDate1[i] & crea.rep$event.date<=CKpot$EntryDate2[i]])
28+
CKpot$MaxCKD[i]<-max(crea.rep$CKDEPIeGFR[crea.rep$PatientID==CKpot$PatientID[i] &
29+
crea.rep$event.date>CKpot$EntryDate1[i] & crea.rep$event.date<=CKpot$EntryDate2[i]])
30+
CKpot$MinCKD[i]<-min(crea.rep$CKDEPIeGFR[crea.rep$PatientID==CKpot$PatientID[i] &
31+
crea.rep$event.date>CKpot$EntryDate1[i] & crea.rep$event.date<=CKpot$EntryDate2[i]])
3232
}
3333
#CKD is 1 if the test qualifies and there is no normal test within 3 months prior
3434
#At this stage some are temporarily falsely positively identified that have no lookback test
3535

3636
#Near date match EntryDate1 (90 days prior date)- to entries from the full dataset
3737
#neardate preferably matches to a prior entry if one is available
3838
#if the closest match is before EntryDate1 (data from more than 90 days prior available), retain row.
39-
indx1<-neardate(CKpotE$PatientID,crea.rep$PatientID,CKpotE$EntryDate1,crea.rep$event.date,best="prior",nomatch=NA_integer_)
40-
CKpotE$Lookback<-crea.rep[indx1,"event.date"]
41-
CKpotE$CKDGEStage<-ifelse(CKpotE$Lookback<=CKpotE$EntryDate1 & CKpotE$CKDE==1,1,0)
42-
CKpotE<-CKpotE[CKpotE$CKDGEStage==1,]
39+
indx1<-neardate(CKpot$PatientID,crea.rep$PatientID,CKpot$EntryDate1,crea.rep$event.date,best="prior",nomatch=NA_integer_)
40+
CKpot$Lookback<-crea.rep[indx1,"event.date"]
41+
CKpot$CKDGStage<-ifelse(CKpot$Lookback<=CKpot$EntryDate1 & CKpot$CKDE==1,1,0)
42+
CKpot<-CKpot[CKpot$CKDGStage==1,]
4343
#CKpot is a subset table of CKD qualifying tests and their markers to be merged onto crea.rep
44-
CKpotE<-unique(CKpotE)
45-
46-
47-
crea.rep<-merge(crea.rep,CKpotE[,c(1,2,8:10)],all.x=TRUE)
44+
CKpot<-unique(CKpot)
45+
crea.rep<-merge(crea.rep,CKpot[,c(1,2,8:10)],all.x=TRUE)
4846
crea.rep$CKDGStage<-ifelse(!is.na(crea.rep$CKDGStage),2,0)
49-
crea.rep$CKDZStage<-ifelse(!is.na(crea.rep$CKDGStage),2,0)
5047
#Stage 1 is skipped here as it cannot be identified from creatinine only, start by coding all as stage 2
5148
table(crea.rep$CKDGStage)
5249

53-
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage>0&crea.rep$MaxCKDE>=30&crea.rep$MaxCKDE<45,3.5,crea.rep$CKDGStage)
54-
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage>0&crea.rep$MaxCKDE>=45&crea.rep$MaxCKDE<60,3,crea.rep$CKDGStage)
55-
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage>0&crea.rep$MaxCKDE>=15&crea.rep$MaxCKDE<30,4,crea.rep$CKDGStage)
56-
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage>0&crea.rep$MaxCKDE<15,5,crea.rep$CKDGStage)
50+
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage>0&crea.rep$MaxCKD>=30&crea.rep$MaxCKD<45,3.5,crea.rep$CKDGStage)
51+
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage>0&crea.rep$MaxCKD>=45&crea.rep$MaxCKD<60,3,crea.rep$CKDGStage)
52+
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage>0&crea.rep$MaxCKD>=15&crea.rep$MaxCKD<30,4,crea.rep$CKDGStage)
53+
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage>0&crea.rep$MaxCKD<15,5,crea.rep$CKDGStage)
5754
crea.rep$CKDGStage<-ifelse(is.na(crea.rep$CKDGStage),0,crea.rep$CKDGStage)
5855
table(crea.rep$CKDGStage)
5956

@@ -62,12 +59,6 @@ table(crea.rep$CKDGStage)
6259
crea.rep$CKDGStage<-ifelse(crea.rep$CKDGStage==3.5,paste("3b"),paste(crea.rep$CKDGStage))
6360
crea.rep$MaxCKDGStage<-ifelse(crea.rep$MaxCKDGStage==3.5,paste("3b"),paste(crea.rep$MaxCKDGStage))
6461

65-
crea.rep$CKDZStage<-ifelse(crea.rep$CKDZStage>0&crea.rep$MinCKDE>=30&crea.rep$MinCKDE<45,3.5,crea.rep$CKDZStage)
66-
crea.rep$CKDZStage<-ifelse(crea.rep$CKDZStage>0&crea.rep$MinCKDE>=45&crea.rep$MinCKDE<60,3,crea.rep$CKDZStage)
67-
crea.rep$CKDZStage<-ifelse(crea.rep$CKDZStage>0&crea.rep$MinCKDE>=15&crea.rep$MinCKDE<30,4,crea.rep$CKDZStage)
68-
crea.rep$CKDZStage<-ifelse(crea.rep$CKDZStage>0&crea.rep$MinCKDE<15,5,crea.rep$CKDZStage)
69-
crea.rep$CKDZStage<-ifelse(is.na(crea.rep$CKDZStage),0,crea.rep$CKDZStage)
70-
7162

7263
#########################################################################################################
7364

@@ -88,7 +79,6 @@ crea.rep$CKDAStage<-ifelse(crea.rep$UACratio>=3&crea.rep$UACratio<30&!crea.rep$C
8879
crea.rep$CKDAStage<-ifelse(crea.rep$UACratio>30&!crea.rep$CKDGStage=="0",3,crea.rep$CKDAStage)
8980

9081
#Stage CKD based on both UAC and creatinine data:
91-
crea.rep$CKDGStage<-crea.rep$CKDGEStage
9282
crea.rep$CKDPrognosis<-crea.rep$CKDGStage
9383
crea.rep$CKDPrognosis<-ifelse(crea.rep$CKDGStage<=2 & crea.rep$CKDAStage==2,1,crea.rep$CKDPrognosis)
9484
crea.rep$CKDPrognosis<-ifelse(crea.rep$CKDGStage<=2 & crea.rep$CKDAStage==3,2,crea.rep$CKDPrognosis)
@@ -97,17 +87,17 @@ crea.rep$CKDPrognosis<-ifelse(crea.rep$CKDGStage==3.5 & crea.rep$CKDAStage==1,2,
9787
crea.rep$CKDPrognosis<-ifelse(crea.rep$CKDGStage==3 & crea.rep$CKDAStage==1,1,crea.rep$CKDPrognosis)
9888
crea.rep$CKDPrognosis<-ifelse(crea.rep$CKDGStage==3 & crea.rep$CKDAStage==2,2,crea.rep$CKDPrognosis)
9989

100-
#Where CKD diagnosed based on creatinine, add metrics for summarised eGFR range for further phenotyping
101-
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE>=60&crea.rep$MaxCKDE<90,1,NA)
102-
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE>=45&crea.rep$MaxCKDE<60,2,crea.rep$CustomeGFR)
103-
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE>=30&crea.rep$MaxCKDE<45,3,crea.rep$CustomeGFR)
104-
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE>=15&crea.rep$MaxCKDE<30,4,crea.rep$CustomeGFR)
90+
#Where CKD diagnosed based on creatinine, add metric for summarised eGFR range for further phenotyping
91+
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE>=60 & crea.rep$MaxCKDE<90,1,NA)
92+
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 & crea.rep$MaxCKDE>=60 & crea.rep$MaxCKDE<90,1,NA)
93+
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE>=45 & crea.rep$MaxCKDE<60,2,crea.rep$CustomeGFR)
94+
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE>=30 & crea.rep$MaxCKDE<45,3,crea.rep$CustomeGFR)
95+
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE>=15 & crea.rep$MaxCKDE<30,4,crea.rep$CustomeGFR)
10596
crea.rep$CustomeGFR<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MaxCKDE<15,5,crea.rep$CustomeGFR)
10697

107-
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 & crea.rep$MinCKDE>=60 & crea.rep$MinCKDE<90,1,NA)
108-
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE>=45&crea.rep$MinCKDE<60,2,crea.rep$CustomeGFR2)
109-
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE>=30 & crea.rep$MinCKDE<45,3,crea.rep$CustomeGFR2)
110-
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE>=15 & crea.rep$MinCKDE<30,4,crea.rep$CustomeGFR2)
111-
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE<15,5,crea.rep$CustomeGFR2)
112-
113-
###################################################################################
98+
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE>=60 & crea.rep$MinCKDE<90,1,NA)
99+
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 & crea.rep$MinCKDE>=60 & crea.rep$MDRDeGFR<90,1,NA)
100+
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE>=45 & crea.rep$MDRDeGFR<60,2,crea.rep$CustomeGFR)
101+
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE>=30 & crea.rep$MDRDeGFR<45,3,crea.rep$CustomeGFR)
102+
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE>=15 & crea.rep$MDRDeGFR<30,4,crea.rep$CustomeGFR)
103+
crea.rep$CustomeGFR2<-ifelse(crea.rep$CKDPrognosis>0 &crea.rep$MinCKDE<15,5,crea.rep$CustomeGFR)

0 commit comments

Comments
 (0)