Skip to content

Gaps In Care

Matthew Gramigna edited this page Mar 23, 2022 · 25 revisions

Overview

A gap in care is defined as a discrepancy between recommended best practices and the services that are actually provided and documented for a given patient. For example, a gap in care would be identified if a patient was supposed to have a colonoscopy, landing them in the numerator, but that procedure was never performed.

More simply, gaps give information as to why a patient does not land in the numerator. If a patient is not in the numerator, our prototype attempts to give detailed information as to why that is the case.

The measure’s improvement notation determines whether an increase or decrease in score is the preferred result. For a positive improvement measure, patients in the denominator are considered, but patients in the numerator are not considered when calculating the gaps in care. If, instead, a negative improvement measure is specified, patients in the numerator will be considered when calculating the gaps in care.

Our current implementation only supports proportion-based scoring and does not support an episode of care of continuous variable. If you would like to read more about Gaps in Care concepts/workflows, see the DEQM implementation guide.

Types of Gaps:

  • OR Gaps - A set of gaps for which only one gap of potentially many needs to be closed in order for the patient to meet standards for quality of care. "Or" gaps are represented by a single DetectedIssue resource, with multiple GuidanceResponses, indicating that any of the nested GuidanceResponses would satisfy the DetectedIssue.

  • AND Gaps -The converse is an "And" gap (which we define as any non-Or gap, at the moment), where you need each of several gaps to be addressed to put the patient into the desired population. "And" gaps are represented by multiple DetectedIssue resources, each with a single GuidanceResponse

Further information on "Or"/"And" gaps is provided in this Pull Request description.

Representing Gaps

Representing different types of care gaps

Gaps are presented as a resource known as a "GuidanceResponse" as part of a Gaps Bundle containing information for each detected issue. It is important to note that multiple guidance responses can exist for each detected issue.

In order to showcase the relevant information for each gap, make use of reasonCode and dataRequirement elements. Instructions on generating this resource can be found here.


Value Filter -A value filter determines whether the resource has a value within a certain range. Currently this is supported using an extension . This allows for additional value-based filters to be specified as part of a data requirement. An example of what this might look like:

{
  "resourceType": "GuidanceResponse",
  "id": "e3505055-e235-401d-9487-e9e250cc16dd",
  "status": "data-required",
  "moduleUri": "http://hl7.org/fhir/us/cqfmeasures/Measure/EXM130",
  "dataRequirement": [
    {
      "type": "Observation",
      "codeFilter": [
        {
          "path": "code",
          "valueSet": "http://example.com/test-vs"
        }
      ],
      "extension": [
        {
          "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-valueFilter",
          "extension": [
            {
              "url": "path",
              "valueString": "value"
            },
            {
              "url": "comparator",
              "valueCode": "eq"
            },
            {
              "url": "value",
              "valueRange": {
                "high": {
                  "value": 9,
                  "unit": "%"
                }
              }
            }
          ]
        }
      ]
    }
  ],
  "reasonCode": [
    {
      "coding": [
        {
          "system": "CareGapReasonCodeSystem",
          "code": "ValueOutOfRange",
          "display": "Data element was found, but value was out of range"
        }
      ]
    }
  ]
}

Example using EXM130

The Colorectal Cancer Screening eCQM (EXM130) measures the percentage of adults 50-75 years of age who had appropriate screening for colorectal cancer within certain time bounds of the measurement period. Below are two relevant snippets of CQL from this measure that show what could cause a patient to fall into the numerator:

define "Colonoscopy Performed":
 [Procedure: "Colonoscopy"] Colonoscopy
   where Colonoscopy.status = 'completed'
     and Global."Normalize Interval"(Colonoscopy.performed) ends 10 years
       or less on or before end of "Measurement Period"


define "Numerator":
	exists "Colonoscopy Performed"
		or exists "Fecal Occult Blood Test Performed"
		or exists "Flexible Sigmoidoscopy Performed"
		or exists "Fecal Immunochemical Test DNA"
		or exists "CT Colonography Performed"

A patient who does not have any of the data elements queried for by the numerator would generate a GuidanceResponse with code NotFound, as no data elements could be located. For example:

{
  "resourceType": "GuidanceResponse",
  "id": "0106786e-5c24-4c8a-aa03-868e180d787a",
  "status": "data-required",
  "moduleUri": "http://hl7.org/fhir/us/cqfmeasures/Measure/EXM130",
  "dataRequirement": [
    {
      "type": "Procedure",
      "codeFilter": [
        {
          "path": "code",
          "valueSet": "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.108.12.1020"
        },
        {
          "path": "status",
          "code": [
            {
              "code": "completed",
              "system": "http://hl7.org/fhir/event-status"
            }
          ]
        }
      ],
      "dateFilter": [
        {
          "path": "performed.end",
          "valuePeriod": {
            "start": "2009-12-31T00:00:00.000Z",
            "end": "2019-12-31T00:00:00.000Z"
          }
        }
      ]
    }
  ],
  "reasonCode": [
    {
      "coding": [
        {
          "system": "CareGapReasonCodeSystem",
          "code": "NotFound",
          "display": "Data Element Not Found"
        }
      ]
    }
  ]
}

The above example is a basic gap for this measure. Since no data was present on the hypothetical patient's record, we could only say that the data was NotFound for that gap. Now, consider a case where a different patient has a Colonoscopy procedure on their record, e.g.:

{
  "resourceType": "Procedure",
  "id": "denom-EXM130-2",
  "meta": {
    "profile": ["http://hl7.org/fhir/us/core/StructureDefinition/us-core-procedure"]
  },
  "status": "completed",
  "code": {
    "coding": [
      {
        "system": "http://www.ama-assn.org/go/cpt",
        "code": "44393",
        "display": "Colonoscopy through stoma; with ablation of tumor(s), polyp(s), or other lesion(s) not amenable to removal by hot biopsy forceps, bipolar cautery or snare technique"
      }
    ]
  },
  "subject": {
    "reference": "Patient/denom-EXM130"
  },
  "performedPeriod": {
    "start": "2009-12-30T12:00:00",
    "end": "2009-12-30T13:00:00"
  }
}

Note that the performedPeriod of this Procedure is 2009-12-30T12:00:00 - 2009-12-30T13:00:00. For a measurement period of 2019-01-01 - 2019-12-31, this Procedure falls just outside of the range asked for by the "Colonoscopy Performed" CQL statement:

define "Colonoscopy Performed":
 [Procedure: "Colonoscopy"] Colonoscopy
   where Colonoscopy.status = 'completed'
     and Global."Normalize Interval"(Colonoscopy.performed) ends 10 years
       or less on or before end of "Measurement Period"

When running gaps in care for this specific patient, the engine can add some more detail to the GuidanceResponse that conveys information beyond the fact that no matching data element for the Numerator logic was found. This concept is referred to as "Reason Detail". The following GuidanceResponse demonstrates this (note the different reasonCode):

{
  "resourceType": "GuidanceResponse",
  "id": "8268f280-26f6-487b-9042-4afd8105f909",
  "status": "data-required",
  "moduleUri": "http://hl7.org/fhir/us/cqfmeasures/Measure/EXM130",
  "dataRequirement": [
    {
      "type": "Procedure",
      "codeFilter": [
        {
          "path": "code",
          "valueSet": "http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.108.12.1020"
        },
        {
          "path": "status",
          "code": [
            {
              "code": "completed",
              "system": "http://hl7.org/fhir/event-status"
            }
          ]
        }
      ],
      "dateFilter": [
        {
          "path": "performed.end",
          "valuePeriod": {
            "start": "2009-12-31T00:00:00.000Z",
            "end": "2019-12-31T00:00:00.000Z"
          }
        }
      ]
    }
  ],
  "reasonCode": [
    {
      "coding": [
        {
          "system": "CareGapReasonCodeSystem",
          "code": "DateOutOfRange",
          "display": "Date is out of specified range",
          "extension": [
            {
              "url": "ReasonDetail",
              "extension": [
                {
                  "url": "reference",
                  "valueReference": {
                    "reference": "Procedure/denom-EXM130-2"
                  }
                },
                {
                  "url": "path",
                  "valueString": "performed.end"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

We use a custom ReasonDetail extension (actual definition is still a work in progress) that indicates which specific piece of data is causing the DateOutOfRange reason (Procedure/denom-EXM130-2), as well as which property on that resource (performed.end).