280 likes | 452 Views
Progress on Object-Oriented Guideline Expression Language (GELLO). Overview. Goal of demonstrating use of GELLO ability to recode decision logic of existing MLMs new knowledge-based constructs that are possible simplifications possible when used with a VMR
E N D
Progress on Object-Oriented Guideline Expression Language (GELLO)
Overview • Goal of demonstrating use of GELLO • ability to recode decision logic of existing MLMs • new knowledge-based constructs that are possible • simplifications possible when used with a VMR • Four new MLMs were encoded and a previously encoded MLM updated • admission alert for acute coronary artery disease • alert when physician orders CT study with contrast in a patient with renal failure • alert if product of blood calcium and phosphorus exceeds a certain threshold (possible renal failure) • reminder to staff to draw ABG at appropriate time • screen for hypokalemia with digoxin therapy • VMR classes used • provided by Samson Tu & Peter Johnson Decision Systems Group –Harvard/Brigham
Acute coronary artery disease Arden Syntax (data) admission := event {'32511','32467'; '32511','32472'}; inpatient_case := read last {'evoking','dam'="GYDAPMP",'constraints'=" I***";"HCASE";"K"}; diagnosis_text := read {'evoking','dam'="GYDAPMP"; "HDIAGNOS"; "HDIAGTXT"}; target_diagnoses := ("MI","R/O MI","MYOCARDIAL INFARCTION", "CARDIOGENIC SHOCK","CHEST PAIN","CP","ANGINA", "CHEST PAIN NOS","INTERMED CORONARY SYND","UNSTABLE ANGINA","CAD", "ANGINA PECTORIS NOS","CHR ISCHEMIC HRT DIS NEC", "RULE OUT MI","R/O MYOCARDIAL INFARCTION", "ACUTE MI", "SUBENDO INFARCT","UNSTABLE ANGINA/MI", "ANGINA PECTORIS","CORONARY ARTERY DISEASE"); Decision Systems Group –Harvard/Brigham
Acute coronary artery disease GELLO // Assumption: VMR has a notion of an admission event AbsoluteTimeadmission_time := admission_event.recording_time; // Retrieve the reasons for admission, encoded as Observations // Assumes the particular Intervention in question is admission List<Observation>reasons_for_admission := select adm.reason from Intervention as adm where adm.reason.recording_time.equals(admission_time); // Create a Concept representing acute ischemia using a UMLS source vocabulary Conceptacute_ischemia := new Concept("MTH","CXXXXXXX"); // Select diagnoses from reasons for admission as coded Concepts List<Concept>diagnosis_text := select coded_concept from reasons_for_admission; Decision Systems Group –Harvard/Brigham
Acute coronary artery disease Arden Syntax (logic) if inpatient_case is null then conclude false; endif; if any (diagnosis_text are in target_diagnoses) then conclude true; else conclude false; endif; Decision Systems Group –Harvard/Brigham
Acute coronary artery disease GELLO if reasons_for_admission.is_empty() then conclude false; endif; // Indicate that we want diagnoses that have an “is a” relationship to acute ischemia if diagnosis_text.has_relationship(acute_ischemia, "is a") then conclude true; else conclude false; endif; Decision Systems Group –Harvard/Brigham
Acute coronary artery disease MLM ISSUES • Need for an HL7/Arden Syntax SIG specification of the event model for an MLM • to encode the GELLO queries so that they have the same semantics as in the Arden version • VMR assumes actions are performed on a known patient • Where does context for patient identity as used in an MLM come from? • GELLO encoding of MLM is different from institution-derived encoding • Not possible to encode free-text diagnoses with current VMR model • However, use of data dictionary could ensure institution-independent encoding Decision Systems Group –Harvard/Brigham
ASTM CT contrast Arden Syntax (data) last_creat := read last {"Creatinine level"}; last_BUN := read last {"BUN level"}; GELLO QuantitativeObservationlast_creat := last(select obs from QuantitativeObservation as obs where obs.coded_concept.equals(new Concept("MTH", "C0600061")) order by ascending obs.recording_time); QuantitativeObservationlast_BUN := last(select obs from QuantitativeObservation as obs where obs.coded_concept.equals(new Concept("MTH", "C0005845")) order by ascending obs.recording_time); Decision Systems Group –Harvard/Brigham
ASTM CT contrast Arden Syntax (logic) if last_creat is null and last_BUN is null then alert_text := "No recent serum creatinine available. Consider patient's kidney function before ordering contrast studies."; conclude true; elseif last_creat > 1.5 or last_BUN > 30 then alert_text := "Consider impaired kidney function when ordering contrast studies for this patient."; conclude true; else conclude false; endif; Decision Systems Group –Harvard/Brigham
ASTM CT contrast GELLO String alert; PhysicalQuantity creat_threshold := new PhysicalQuantity(1.5, "mg/dl",""); PhysicalQuantity BUN_threshold := new PhysicalQuantity(30, "mg/dl",""); if is null(last_creat) and is null(last_BUN) then alert := "No recent serum creatinine available. Consider patient's kidney function before ordering contrast studies."; conclude true; elseif last_creat.observed_quantity.gt(creat_threshold) or last_BUN.observed_quantity.gt(BUN_threshold) alert := "Consider impaired kidney function when ordering contrast studies for this patient."; conclude true; else conclude false; endif; Decision Systems Group –Harvard/Brigham
Calcium phosphate product Arden Syntax (data) creatinine := read last {'dam'="PDQRES2",'constraints'="C****"; ;'32752'}; calcium := read last {'dam'="PDQRES2",'constraints'="C****"; ;'32109'}; phosphate := read last {'dam'="PDQRES2",'constraints'="C****"; ;'33824'}; creatinine_threshold := 2; product_threshold := 70; Decision Systems Group –Harvard/Brigham
Calcium phosphate product GELLO QuantitativeObservation creatinine := last(select obs from QuantitativeObservation as obs where obs.coded_concept.equals(new Concept("RCD99", "C0428279")) order by ascending obs.recording_time); QuantitativeObservation calcium := last(select obs from QuantitativeObservation as obs where obs.coded_concept.equals(new Concept("RCD99", "C0428302")) order by ascending obs.recording_time); QuantitativeObservation phosphate := last(select obs from QuantitativeObservation as obs where obs.coded_concept.equals(new Concept("RCD99", "C0428304")) order by ascending obs.recording_time); PhysicalQuantity creatinine_threshold := new PhysicalQuantity(2.0, "mg/dl",""); Double product_threshold := 70.0; Decision Systems Group –Harvard/Brigham
Calcium phosphate product Arden Syntax (logic) if (creatinine is not number) or (calcium is not number) or (phosphate is not number) then conclude false; endif; product := calcium * phosphate; if (creatinine >= creatinine_threshold) and (product >= product_threshold) then conclude true; else conclude false; endif; Decision Systems Group –Harvard/Brigham
Calcium phosphate product GELLO if is null(creatinine) or is null(calcium) or is null(phosphate) then conclude false; endif; Double product := calcium.observed_quantity.value * phosphate.observed_quantity.value; if creatinine.observed_quantity.gte(creatinine_threshold) and (product >= product_threshold) then conclude true; else conclude false; endif; Decision Systems Group –Harvard/Brigham
Extubate blood gas reminder Arden Syntax (data) // only patients explicitly on protocol patient_on_protocol := {/* patient is on protocol */}; has_abg := read exist {/*abg where it occurred within last 2 hours */}; Decision Systems Group –Harvard/Brigham
Extubate blood gas reminder GELLO AbsoluteTime t := new AbsoluteTime(); AbsoluteTime threshold_time := t.before_now(new Duration(2, hours)); Procedure abg_done := last(select abg from Procedure as abg where abg.recording_time.is_after(threshold_time) order by ascending abg.recording_time); Decision Systems Group –Harvard/Brigham
Extubate blood gas reminder Arden Syntax (logic) if not patient_on_protocol then conclude false; elseif has_abg then conclude false; else conclude true; endif; Decision Systems Group –Harvard/Brigham
Extubate blood gas reminder GELLO if not(is null(abg_done)) then conclude false; else conclude true; endif; Decision Systems Group –Harvard/Brigham
Extubate gas reminder Issue A VMR-implicit assumption is that data collected is for a particular patient The MLM, on the other hand, needs to survey data from a collection of patients on a protocol In this case we assume we are performing the reminder for a particular patient who is already on the protocol Decision Systems Group –Harvard/Brigham
Hypokalemia and Digoxin Arden Syntax (data) /* read the potassium that evoked the MLM */ potassium := READ LAST {potassium level}; /* get the last active digoxin or digitoxin order */ digoxin_order := read last {digoxin order}; Decision Systems Group –Harvard/Brigham
Hypokalemia and Digoxin GELLO /* read the potassium that evoked the MLM */ QuantitativeObservation potassium := last (select obs from QuantitativeObservation as obs where obs.coded_concept.equals(new Concept("MTH", "C0543465")) order by descending obs.recording_time); /* get the last active digoxin or digitoxin order */ List<Medication>digoxin_orders := select meds from Medication as meds where meds.coded_concept.equals(new Concept("MTH", "C0012265")); PhysicalQuantity potassium_threshold := new PhysicalQuantity(3.3, "mEq/l", ""); Decision Systems Group –Harvard/Brigham
Hypokalemia and Digoxin Arden Syntax (logic) /* exit if the potassium value is invalid */ if potassium is not number then conclude false; endif; /* exit if there is no hypokalemia */ if potassium >= 3.3 then conclude false; endif; /* exit if indication of digoxin use cannot be found */ if (digoxin_order is null) then conclude false; endif; /* send an alert */ conclude true; Decision Systems Group –Harvard/Brigham
Hypokalemia and Digoxin GELLO if is null (potassium) then conclude false; endif; /* alert if patient has hypokalemia and is on digoxin */ if potassium.lt(potassium_threshold) and not(digoxin_orders.is_empty()) then conclude true; endif; conclude false; Decision Systems Group –Harvard/Brigham
Discussion • Knowledge modeling is facilitated by GELLO • Example is acute MI term class in first MLM translation • This can provide advantages in using drug interaction databases, etc. • Guidelines present other issues, not covered in MLMs • These include scoping, implied gets, etc. • We have chosen not to focus on these now, because they relate to guideline modeling, not to the expression language • VMR not yet stable • As it evolves, it should be possible to converge on stable MLM representations across institutions • Note that this cannot be done with curly braces Decision Systems Group –Harvard/Brigham
Authoring in GELLO Query and expression writing can be simplified using editing GUIs that provide templates and object navigators • Example of such an editing GUI: QuickRules Builder (http://www.yasutech.com/rules-engine-components.htm) Decision Systems Group –Harvard/Brigham