Categories
Medicine Pharmacovigilance toolkit Semantic search

Label/document search using medical synonyms

In medicine we repeatedly need answers to the following kinds of questions:

Based on a set of documents (like an H&P, a few progress notes, perhaps the results of a few lab tests), does a patient have or not have a clinical condition, eg, things like significant cardiac disease, risk factors for seizure, etc?

Based on a set of documents (like drug labels, perhaps the results of a couple of additional studies), has a given drug been associated with clinical conditions, eg, things like significant cardiac risk, risk of renal effects, etc?

This is a time-consuming problem. Usually the clinician ultimately must carefully read the chart, labels, or study to make such an assessment. But an intelligent search of such documents could assist the clinician’s evaluation.

Unfortunately, it’s a hard problem for software to provide any kind of definitive guidance. A first naive pass might include searching the relevant documents for phrases like “myocardial infarction” and “conduction disorder”, or “head injury” and “epilepsy”.

It helps to use standardized synonyms for various conditions and automatically search documents for all such synonyms. Examples of synonym sources include the UMLS Metathesaurus and National Library of Medicine. A second approach is then to search using all the synonyms for a clinical condition.

Here is an experimental search of drug labels using medical synonyms from the National Library of Medicine.

Example:

  • Enter “stribild” as drug
  • Press “Fetch label(s)” button (or just press enter)
  • Enter “pain” as search term
  • Press “Get synonyms for search terms” button (or just press enter)
  • Press “Search with synonyms”

Ultimately what is needed is semantic search, which may be amenable to hybrid approaches using these kinds of simple synonym searches combined with machine learning. For example, biologically-oriented BERT models provide some semantic search capability and are the subject of active research.

Categories
Medicine

Anemia diagnosis with a forward-chaining rules engine

To better understand the use of a rules engine for support of clinical decision-making, an app for a simple diagnostic task was implemented in Clojure(script) using a forward-chaining rules engine (Clara) based on the Rete algorithm.

The app reflects well-known diagnostic approaches to anemia (see for example, Leung et al [1]), which are typically implemented imperatively, but here is based on a series of forward-chaining rules providing a functional approach.

Here are example rules:

(defrule anemic
[:or
[Lab (= test-name 'hct) (lab-low? hct-nl value)]
[Lab (= test-name 'hgb) (lab-low? hgb-nl value)]
[Lab (= test-name 'rbc-count) (lab-low? rbc-count-nl value)]]
=>
(insert! (->Diagnoses "pt-0" "anemia")))
(defrule microcytic-anemia
[Diagnoses (= diagnosis "anemia")]
[Lab (= test-name 'mcv) (lab-low? mcv-nl value)]
=>
(insert! (->Diagnoses "pt-0" "microcytic anemia")))
(defrule microcytic-but-no-iron-studies
[Diagnoses (= diagnosis "microcytic anemia")]
[:not [Lab (= test-name 'fe)]]
[:not [Lab (= test-name 'tibc)]]
[:not [Lab (= test-name 'ferritin)]]
=>
(insert! (->Diagnoses "pt-0" "Advise getting iron studies.")))
(defrule macrocytic-anemia
[Diagnoses (= diagnosis "anemia")]
[Lab (= test-name 'mcv) (lab-high? mcv-nl value)]
=>
(insert! (->Diagnoses "pt-0" "macrocytic anemia")))
(defrule macrocytic-but-no-workup
[Diagnoses (= diagnosis "macrocytic anemia")]
[:not [Lab (= test-name 'b12)]]
[:not [Lab (= test-name 'folate)]]
=>
(insert! (->Diagnoses "pt-0" "Advise obtaining vitamin B12 and folate levels.")))
(defrule b12-deficiency-anemia
[Diagnoses (= diagnosis "macrocytic anemia")]
[Lab (= test-name 'b12) (lab-low? b12-nl value)]
[Lab (= test-name 'methylmalonate) (lab-low? methylmalonate-nl value)]
[Lab (= test-name 'homocysteine) (lab-high? homocysteine-nl value)]
=>
(insert! (->Diagnoses "pt-0" "B12 deficiency anemia")))

(defrule fe-deficiency-anemia
[Diagnoses (= diagnosis "microcytic anemia")]
[Lab (= test-name 'fe) (lab-low? fe-nl value)]
[Lab (= test-name 'tibc) (lab-high? tibc-nl value)]
[Lab (= test-name 'ferritin) (lab-low? ferritin-nl value)]
=>
(insert! (->Diagnoses "pt-0" "Iron deficiency anemia: find cause")))

(defrule sideroblastic-anemia
;; Microcytic anemia with iron overload, siderocytes/sideroblasts
[Diagnoses (= diagnosis "microcytic anemia")]
[:or
[Lab (= test-name 'fe) (lab-normal? fe-nl value)]
[Lab (= test-name 'fe) (lab-high? fe-nl value)]]
[:or
[Lab (= test-name 'ferritin) (lab-high? ferritin-nl value)]
[Lab (= test-name 'ferritin) (lab-normal? ferritin-nl value)]]
[:or
[Lab (= test-name 'sideroblasts)]
[Lab (= test-name 'siderocytes)]]
=>
(insert! (->Diagnoses "pt-0" "Sideroblastic anemia; find cause")))
(defrule thalassemias
;; Microcytic anemia with signs of α or β thalassemia
[Diagnoses (= diagnosis "microcytic anemia")]
[:or
[Lab (= test-name 'fe) (lab-normal? fe-nl value)]
[Lab (= test-name 'fe) (lab-high? fe-nl value)]]
[:or
[Lab (= test-name 'ferritin) (lab-high? ferritin-nl value)]
[Lab (= test-name 'ferritin) (lab-normal? ferritin-nl value)]]
[:or
[Lab (= test-name 'teardrops)]
[Lab (= test-name 'targetcells)]
[Lab (= test-name 'splenomegaly)]]
=>
(insert! (->Diagnoses "pt-0" "α or β thalassemia; get Hgb electrophoresis")))

The example app (demonstration purposes only; not suitable for clinical use) is here.

Complete source is available.

[1] Leung LL et al.”Approach to the adult with anemia.” Waltham, MA: UpToDate Inc. https://www.uptodate.com/contents/diagnostic-approach-to-anemia-in-adults (Accessed February 15, 2021.)

Categories
Medicine Ontology Pharmacovigilance toolkit SPARQL

Pharmacological Actions

Interface to National Library of Medicine MESH SPARQL endpoint to obtain the pharmacological action of a medication, using the following type of query:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX meshv: <http://id.nlm.nih.gov/mesh/vocab#>
PREFIX mesh: <http://id.nlm.nih.gov/mesh/>
PREFIX mesh2020: <http://id.nlm.nih.gov/mesh/2020/>
PREFIX mesh2019: <http://id.nlm.nih.gov/mesh/2019/>
PREFIX mesh2018: <http://id.nlm.nih.gov/mesh/2018/>
PREFIX : <urn:ex:>
SELECT DISTINCT ?paLabel
FROM <http://id.nlm.nih.gov/mesh>
WHERE {
?s ?p ?n . 
?possible_concepts (:|!:){,3} ?s . 
BIND (?possible_concepts as ?fresh_possible_concepts) .
?fresh_possible_concepts (:|!:){,3} ?n . 
?fresh_possible_concepts rdf:type meshv:TopicalDescriptor .
?fresh_possible_concepts meshv:pharmacologicalAction ?pa .
?pa rdfs:label ?paLabel .} '

Compare the results obtained via MESH with results obtainable via US FDA National Drug Code (NDC) Directory data:

MESH results for ‘Stribild’:

  • Anti-HIV Agents

US FDA NDC results for ‘Stribild’:

  • Mechanism of Action
    • HIV Integrase Inhibitors
    • Cytochrome P450 2C9 Inducers
    • Cytochrome P450 3A Inhibitors
    • P-Glycoprotein Inhibitors
    • Cytochrome P450 2D6 Inhibitors
    • Organic Anion Transporting Polypeptide 1B1 Inhibitors
    • Organic Anion Transporting Polypeptide 1B3 Inhibitors
    • Breast Cancer Resistance Protein Inhibitors
    • Nucleoside Reverse Transcriptase Inhibitors
    • Nucleoside Reverse Transcriptase Inhibitors
  • Established Pharmacological Class
    • Human Immunodeficiency Virus Integrase Strand Transfer Inhibitor
    • Cytochrome P450 3A Inhibitor
    • Human Immunodeficiency Virus Nucleoside Analog Reverse Transcriptase Inhibitor
    • Human Immunodeficiency Virus Nucleoside Analog Reverse Transcriptase Inhibitor
    • Hepatitis B Virus Nucleoside Analog Reverse Transcriptase Inhibitor
  • Chemical Structure
    • Nucleosides