Skip to contents


A fundamental design principle of EndoMineR was that it should address the important categories of questions we all have in gastroenterology, and endoscopy in particular. These questions roughly fall into the following: surveillance, quality and also operational questions (eg patient flow through endoscopy).

##1. Surveillance functions


Surveillance tracking is difficult because it relies on assessment at several timepoint and then deciding on the next examination based on a ruleset. A basic question is often: ’How good are our surveillance programmes?” which really means “How good are we at making sure patients come back in a timely way for their endoscopy after a polyp removal or for Barrett’s surveillance”, for example?



Surveillance relates to the timing of a test relative to other tests or all tests done for a patient. To do this, the EndoMineR surveillance functions simply order the endoscopies by patient and date, and extract the date the first test was done, as well as the last test (of the same type) and the difference in timing between each test, always grouped by patient.


As all these functions are simply looking at the date of the test, they can take a raw dataset, as long as a date column is present and use that, rather than have a lot of pre-processing steps. Of course, the pre-processing steps explained in the EndoMineR vignette (mainly using the textPrep function) are recommended however as then the user will be able to perform any other additional analyses if needed.


The basic surveillance functions are simple but are the most used. SurveilTimeByRow will extract the time difference between each individual endoscopy for an individual patient. This is useful to see how adherent the surveillance endoscopy is to guidelines.


SurveilLastTest simply extracts the last and first test respectively for each patient so you can assess how long the patient has been surveilled for. This is likely to come in useful for future iterations of EndoMineR as patient Theographs are developed (work in progress).


em1<-SurveilTimeByRow(Myendo,'HospitalNumber','Dateofprocedure')


HospitalNumber TimeSinceLast
A1648588 3239 days
A1648588 3239 days
A1648588 3239 days
A1648588 3239 days
A1648588 3239 days


em3<-SurveilLastTest(Myendo,'HospitalNumber','Dateofprocedure')


HospitalNumber Dateofprocedure
J1337672 2013-03-25
Q7176341 2014-05-31
M5148114 2014-06-18
Q7729897 2014-07-19
R3882435 2014-11-15


em4<-SurveilFirstTest(Myendo,'HospitalNumber','Dateofprocedure')


HospitalNumber Dateofprocedure
F7957976 2001-01-03
Y8594667 2001-01-04
Z6299612 2001-01-08
R8004923 2001-01-15
U1759838 2001-01-16


Of course we may also want to know how many tests have been done over a time period and this is provided by the function HowManyTests


This function will return the number of tests by day, month and year so they can be easily graphed according to what you want.


how<-HowManyOverTime(Myendo,'Indications','Dateofprocedure','Surv')


day week month year freq MonthYear
25 4 1 2001 1 2001-01-01
27 4 1 2001 1 2001-01-01
23 12 3 2001 1 2001-03-01
11 15 4 2001 1 2001-04-01
20 16 4 2001 1 2001-04-01

2. Assessment of quality functions


Quality is measured in a variety of ways. For endoscopy it is measured according to the adherence to a) standards for endoscopic documentation as well as b) detection of certain pathological conditions such as dysplasia (best summarised as lesion recognition)


a) Documentation Quality


As regards adherence to documentation for example, a generic function is provided that will look up the presence of words presented in a list in a target column. It will then output the proportion of reports that have these words, as well as a barchart to show what proportion of the endoscopies showed these words. The list can be comprised of terms that should be mentioned in a report.


Input

HospitalNumber PatientName Findings
J6044658 Jargon, Victoria No evidence of Barrett’s oesophagus, short 2 cn hiatus hernia ,Oesophageal biopsies taken from three levels as requested ,OGD today to assess for ulceration/ongoing bleeding ,Diaphragmatic pinch:40cm ,She has a small hiatus hernia ,We will re-book for 2 weeks, rebanding ,Tiny erosions at the antrum ,Biopsies taken from top of stricture-metal marking clips in situ ,The varices flattened well with air insufflation ,He is on Barrett’s Screeling List in October 2017 at St Thomas’ HALO 90 done with good effect
Y6417773 Powell, Destiny Duodenum: Duodenitis with a small erosion ,STOMACH: diffuse gastritis with angiodysplasia and punctate bleeding site on greater curve mid body - no obvious ulcer- antrum scar ?,No immediate complications ,Z-line at: 38cm - Bravo placed at 32cm- good positionat check endoscopy
B6072011 Martinez-Santos, Ana Stomach- Body Polyp- Pedunculated ,Several erosions/small ulcers in inflammed antrum ,Lax cardia with small hiatus hernia but no erosive oesophagitis ,DUODENUM: Normal to D3
G1449886 Lopez, Maria STOMACH: Small amount of bright red blood that seems to have refluxed back through the pylorus
V1607560 al-Rahimi, Rif’a Coffee ground vomit ,OESOPHAGUS: the previous subepithelial lesion measuring 1 TTS HALO to area
I8031481 Forrest, Dazheea Stomach- Pylorus ,No cervical inlet patch


In this example we are looking for the words Barrett’s and coeliac as perhaps we have chosen the macroscopic recognition of these features to denote what an endoscopist should always describe in the endoscopy report:


library(tm)
myNotableWords <- c("barrett", "coeliac")
ListLookup(Myendo,'Findings',myNotableWords)
##        X2  Prop
## 1 barrett 18.05
## 2 coeliac  6.20



So we can see that the terms are present in the minority of reports across endoscopists, so perhaps we can look into this further..


b) Endoscopic Quality

Sedation Usage


Another measure of quality is the assessment of those factors that are recorded at endoscopy such as degree of sedation used etc. Rather than provide a function for each metric, again a generic function is provided that uses any quantifiable metric and plots it against the endoscopist. This function returns a list with two elements- the plot and the table:


#We have to attach the output of EndoscMeds to the original dataframe
MyendoNew<-cbind(EndoscMeds(Myendo$Medications),Myendo)
#Average Fentanyl use by endoscopist:
Mytable<-MetricByEndoscopist(MyendoNew,'Endoscopist','Fent')


MyendoNew.Endoscopist MyendoNew.Fent
Dr Sullivan, Shelby NA
Dr Kekich, Annabelle 125
Dr Sullivan, Shelby 125
Dr Avitia-Ramirez, Alondra NA
Dr Greimann, Phoua 75
Dr Avitia-Ramirez, Alondra 150
Dr Martinez, Maegen 125
Dr Anderson, Alana 75
Dr Anderson, Alana 25
Dr Ives, Rashiah 150




4.Patient flow functions


Sankey plots


We often like to get an overview of how patients are flowing through a system overall. This can give a nice visual representation of whether which patients diverge from the normal flow through a system so we can study them further. There are two ways to look at this. Sankey plots give good timepoint by timepoint representation of flow. This really works with more than one type of event at each timepoint.


For example, if we have a dataset with events such as ‘radiofrequency ablation’ and ‘endoscopic mucosal resection’ or ‘nothing’ we can use the Sankey plot to determine the order of events over a large patient population. You choose the column in the dataframe that describes the Procedure type (“EMR”,“RFA”,“nothing” in this case)


#how<-SurveySankey(Myendo,"ProcedurePerformed")



Circos plots


We may need something even more aggregated. Perhaps we want to see the overall number of patients that go from one event to another regardless of which timepoint it is at. To do this we can use a circos plot, which makes use of the circlize library, as follows:

#flow<-PatientFlow_CircosPlots(v,"Date.y","pHospitalNum","ProcedurePerformed")