It is good news that Siemens still remains as #3 EHR vendor
according to Forbes article here:
It is good news that Siemens still remains as #3 EHR vendor
according to Forbes article here:
In November 2012 I (Vojtech Huser) did another tutorial with Harm Scherpbier on workflow technology. Slides as PPT file are available here:
http://www.slideshare.net/vojtech_huser/presentations
Also one video from the tutorial is here: (thanks to Dr. Harm Scherpbier)
To read more about a very good recent textbook about workflow technology: go to a JBI book review here:
In order to do process mining in healthcare, one soon discovers that simplifying a log is important.
Maybe you don’t need all individual vital signs – but just an event that vital signs action were taken by some clinician.
For that you will need your coded events replaced by some higher level concept (blood pressure – vital signs, respiratory rate – vital signs).
Than you simply collapse events happening within a certain time frame (e.g., 10 minutes) into just one event (vital signs).
Several terminology problems arise with that.
For more fun, google SA-MXML
The number of available process mining algorithms keeps getting higher and you might be wondering which one to start with.
Well, try the Fuzzy miner, dressed up in a more user friendly package. More info here http://fluxicon.com/blog/2012/05/say-hello-to-disco/
In a CDISC SDM-XML standard, there are interesting examples of workflow.
Look here:
http://www.cdisc.org/study-trial-design
And an HTML generated out of their example XML file is here:
http://healthflow.googlecode.com/files/Study%20Design_%20Xanomeline%20%28LY246708%29.pdf
Flowcharts can be used to represent phenomes.
This new site: http://phekb.org tries to capture those.
They specify the EHR algorithms to determine a phenotype using mostly ICD9, LOINC and RxNorm terms.
They also use this flowchart sw: http://www.knime.org/screenshots
HL7 Arden Syntax group is working on representing immunization rules.
There is an example MLM available here:
http://wiki.hl7.org/images/1/17/2012-01-17_Arden_Syntax_WG_Minutes_San_Antonio.zip
We represented the same logic in HealhFlow framework (using XPDL)
See the screenshot here:
the image file is also here:
http://commons.wikimedia.org/wiki/File:HealthFlow_example_flowchart_hepatitis_A_immunization_005.jpg
The full XPDL file is available here:
http://healthflow.googlecode.com/files/Hep_A_immunization003_Vojtech_Huser_HealthFlow.xpdl
Use this newer version of the editor and switch to Settings –> Configuration –> Shark to see the conditions fully displayed (on the arrows)
http://sourceforge.net/projects/jawe/
More info about HealthFlow is also here
http://en.wikipedia.org/wiki/HealthFlow
The original MLM is publicly available.
However, in case the link brakes, here is the full logic:
maintenance:
title: Hepatitis A Immunization MLM;;
mlmname: Hep_A_Immunization;;
arden: Version 2.8;;
version: 1.00;;
institution: Intermountain Health Care;;
author: Peter Haug, M.D.;;
specialist: Peter Haug M.D.;;
date: 2011-09-10;;
validation: testing;;
library:
purpose: Suggest initial dose of Hepatitis A vaccine schedule.;;
explanation: ;;
keywords: Hepatitis A; vaccine; immunization;;
citations: to be added. ;;
links: to be added;;
knowledge:
type: data_driven;;
data:
/* text within curly brackets would be replaced with an institution’s own query */Let PatientIDRecord BE OBJECT [AccountNum, Name, Birthdate, Sex];
LET Patient BE Read As PatientIDRecord Latest {select accountnum, name, dateofbirth, sex from EHR} ;LET outpatient_visit BE EVENT {storage of ambulatory registration}
LET Medication BE OBJECT [Drug_Name, Form, Dosage, Route, Schedule]
LET VAQTA BE Read As Medication {select med, form, dose, route, schedule from EHR where med = ‘VAQTA’} ;
LET HAVRIX BE Read As Medication {select med, form, dose, route, schedule from EHR where med = ‘HAVRIX’} ;
LET TWINRIX BE Read As Medication {select med, form, dose, route, schedule from EHR where med = ‘TWINRIX’} ;
Let GenericMessage BE OBJECT [MessageID, MessageCode, Message_Text];
Let Vaccine_Message BE New GenericMessage;
;;
evoke: outpatient_visit;;
logic:
/* Check age */
if
Patient_Age Is Null
then
Patient_Age := Now – Patient.Birthdate;
endif;if
Patient_Age Less Than 12 months
then
Conclude False ;
endif;
/* Young Patient */
if
Patient_Age Greater Than 12 months and
Patient_Age Less Than or Equal 18 years
then
Apply_young_patient_rules := true;
endif;
/* Older Patient */
if
Patient_Age Greater Than 18 years
then
Apply_older_patient_rules := true;
endif;
/* Rules-no previous vaccine. */
if
Exist(VAQTA) or Exist(HAVRIX) or Exist(TWINRIX)
then
Hepatitis_vaccination:= true;
endif;
if
Apply_young_patient_rules and
Not Hepatitis_vaccination
then
Vaccine_Message.Message_Text := "Give VAQTA vaccine, 25U, IM now and repeat in 6 to 18 months.";
Conclude true;
endif;
if
Apply_older_patient_rules and
Not Hepatitis_vaccination
then
Vaccine_Message.Message_Text := "Give VAQTA vaccine, 50U, IM now and repeat in 6 to 18 months.";
Conclude true;
endif;
/* Rules-one previous vaccination. */
if
Count(VAQTA) + Count(HAVRIX) + Count(TWINRIX) = 1
then
Needs_second_dose := true;
endif;/* Second dose young people */
if
Apply_young_patient_rules and
Needs_second_dose and
Exist(VAQTA) and
Latest VAQTA Occurred Before 6 months Ago
then
Vaccine_Message.Message_Text := "Give VAQTA vaccine, 25U, IM now. This completes Hepatitis A vaccinations.";
Conclude true;
endif;
if
Apply_young_patient_rules and
Needs_second_dose and
Exist(HAVRIX) and
Latest HAVRIX Occurred Before 6 months Ago
then
Vaccine_Message.Message_Text := "Give HAVRIX vaccine, 720EL.U, IM now. This completes Hepatitis A vaccinations.";
Conclude true;
endif;
if
Apply_young_patient_rules and
Needs_second_dose and
Exist(TWINRIX) and
Latest TWINRIX Occurred Before 1 months Ago
then
Vaccine_Message.Message_Text := "Give TWINRIX vaccine, 720 EL.U/20ug, IM now. This is the second Hepatitis A/B vaccination.";
Conclude true;
endif;/* Second dose Older people */
if
Apply_older_patient_rules and
Needs_second_dose and
Exist(VAQTA) and
Latest VAQTA Occurred Before 6 months Ago
then
Vaccine_Message.Message_Text := "Give VAQTA vaccine, 50 U, IM now. This completes Hepatitis A vaccinations.";
Conclude true;
endif;
if
Apply_older_patient_rules and
Needs_second_dose and
Exist(HAVRIX) and
Latest HAVRIX Occurred Before 6 months Ago
then
Vaccine_Message.Message_Text := "Give HAVRIX vaccine, 1440 U, IM now. This completes Hepatitis A vaccinations.";
Conclude true;
endif;
if
Apply_older_patient_rules and
Needs_second_dose and
Exist(TWINRIX) and
Latest TWINRIX Occurred Before 1 months Ago
then
Vaccine_Message.Message_Text := "Give TWINRIX vaccine, 720EL.U/20ug, IM now. This is the second Hepatitis A/B vaccination.";
Conclude true;
endif;
/* Third dose of TWINRIX */
if
Exist(TWINRIX) and Count(TWINRIX) = 2 and
Latest(TWINRIX) Occurred Before 5 months Ago
then
Vaccine_Message.Message_Text := "Give TWINRIX vaccine, 720EL.U/20ug, IM now. This completes Hepatitis A/B vaccinations.";
Conclude true;
endif;
;;
action:
write Vaccine_Message.Message_Text;;
end:
In a recent process mining effort, I saw and interesting problem.
In order to simplify a log, it is important to transform events (e.g., Ultrasound of Abdomen) to a less granular events in order to make the process instances more similar to each other. But how to choose the correct ancestor concept for that – should it be Ultrasound study or Radiology Report (any one of them) or should be imaging of abdomen.
The two approaches I ended up with is a choosing a preferred hierarchy level for a given domain (e.g., anti-infectives level for drugs) or go by parent with a certain among of descendant concepts. (e.g., concepts with 500 descendant concepts are too broad parents) Solving it for any concept is not so trivial.
Does your IDR support well terminology abstractions of this kind?