Friday, August 17, 2012

I know not vs. I Don't Know: Allergies

One of the most common requests I get is on dealing with how to express two different issues with allergies:
  1. I know the patient is not allergic to anything.
  2. I don't know whether the patient is allergic to anything.
These are confusing even in speech.  Grahame Grieve recently discussed these in his blog post on NEHTA Exclusion Statements, and adds a third:  
  1. I didn't ask whether the patient was allergic to anything.
I have a slightly different approach to what Grahame proposes for using the CCDA.  It achieves the same functionality, in a slightly different way, and purposefully ignores the fine points of semantics that he made.  Either you know NOT, or you don't know.  The "why" you wrote it that way is not material to the conversation for MOST use cases.

1. I know (or the patient asserts) a lack of allergies:
<observation classCode="OBS" moodCode="EVN" negationInd="true">
  <templateId root="2.16.840.1.113883.10.20.22.4.7"/>
  <id root="..."/>
  <code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4"/>
  <effectiveTime>
    <!-- Use value or nullFlavor, not both -->
    <low value="..." nullFlavor="UNK"/>
  </effectiveTime>
  <statusCode code="completed"/>
  <value xsi:type="CD" code="419199007"
    codeSystem="2.16.840.1.113883.6.96" displayName="Allergy to Substance"/>
</observation>

2. I don't know whether there are any allergies:
<observation classCode="OBS" moodCode="EVN" nullFlavor="NI">
  <templateId root="2.16.840.1.113883.10.20.22.4.7"/>
  <id root="..."/>
  <code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4"/>
  <effectiveTime>
    <!-- Use value or nullFlavor, not both -->
    <low value="..." nullFlavor="UNK"/>
  </effectiveTime>
  <statusCode code="completed"/>
  <value xsi:type="CD" code="419199007"
    codeSystem="2.16.840.1.113883.6.96" displayName="Allergy to Substance"/>
</observation>

3. I didn't ask whether there are any allergies (and have no other information):
<observation classCode="OBS" moodCode="EVN" nullFlavor="NASK">
  <templateId root="2.16.840.1.113883.10.20.22.4.7"/>
  <id root="..."/>
  <code code="ASSERTION" codeSystem="2.16.840.1.113883.5.4"/>
  <effectiveTime>
    <!-- Use value or nullFlavor, not both -->
    <low value="..." nullFlavor="UNK"/>
  </effectiveTime>
  <statusCode code="completed"/>
  <value xsi:type="CD" code="419199007"
    codeSystem="2.16.840.1.113883.6.96" displayName="Allergy to Substance"/>
</observation>

There's not much difference between these three representations, so be careful in processing them.  I don't see many existing EHRs distinguishing between case 2 and case 3, but some do. Don't expect the "I didn't ask" variation to be preserved on import to all systems as anything more than "I don't know".

A couple of additional notes:
id: You may have one (especially if there is a statement in your database about the patient not having any allergies), or you may not (if there's no data).  If you have an id, fill it out, otherwise, use an appropriate nullFlavor.
effectiveTime: Use the value for when the information was recorded/reported in effectiveTime/low.  If there is an effectiveTime/high, it means that the clinical statement stops being assured of being true after effectiveTime/high, which means that we could either be no longer ignorant (in case 2 or 3), or we have new and possibly contrary information (case 1).  So, these three patterns shouldn't be used with an effectiveTime/high element.
value: If you want to be more specific, e.g., to report on medication allergies, you can use a different SNOMED CT Code in the value element (e.g., 416098002 Drug Allergy).  See the Allergy/Adverse Event Type value set.

Found a Bug in CCDA?
It's not hard to believe that a 500 page document might have a few errors in it.  While writing this post, I found one.  If you'd like to report a bug in CCDA, please do so here on the DSTU comments page.  That way, anyone can look for, and read about the issues.  Anyone with an HL7 Login (not membership, just a login) should be able to create reports on DSTUs.

7 comments:

  1. Hi Keith,

    Can you help me understand why `effectiveTime/low` is the right place for the observation time? To my mind, "the clinical statement stops being assured of being true" immediately after it's made: the statement is part of a clinical *history*, after all.

    To put it another way: If I say on 2012-08-22 that "The patient has no allergies," then it would seem to me that anyone in the future should read this statement and know that "on (or until?) 2012-08-22, the patient had no known allergies". This would suggest putting the observation time in a point-time, or perhaps in `effectiveTime/high`.

    Am I just thinking backwards here? (It's been known to happen!)

    ReplyDelete
    Replies
    1. If there is an effectiveTime/high, it signals (according to CCDA), the time at which the allergy was no longer a concern. You could use effectiveTime/value, making this a point in time, and I think that might be a better way to handle these cases. If you split them up into low/high, as I did, the [clinically effective] starting time of an observation goes into effectiveTime/low. The ending time goes into effectiveTime/high. If there's not a high value, you either don't know it or don't have it. Its absence provides no information in either direction.

      Delete
  2. Hi Keith,

    Thanks for presenting options for 3 subtle variations..

    A quick thought. I think adding SNOWMED-CT code '160244002' - 'No known allergies' to the 'Allergy/Adverse Event Type Value Set' would be a better way to go. Then the 'negationind' case can be eliminated. The NullFlavors can aid in explaining the scenario in more specific detail.

    Another reason for coming up with this suggestion is that in the C-CDA, the explanation for the codes is specified in a certain order(or atleast that's how I read):
    1. specific medication
    2. class of medication(s)
    3. food or substance.

    Given that the use of the code 419199007 (I understand that this is the best generic option available in the value-set..), indicates a non-medication category.. Of course it can be construed that substance can be anything...

    What would be your thoughts ?

    Thanks
    Rama Ramakrishnan

    ReplyDelete
  3. Is this still valid? was it approved? does it pass MU2? is leaving the section with no entries an option?

    ReplyDelete
  4. Keith,

    Very helpful post that I find myself pointing people to quite a bit lately as the topic of "no information" is active on both the HL7 listserv and the TTT Google Group.

    As per my comments on the HL7 listserv, I think you need to ammend your samples above so that effectiveTime/high is present with @nullFlavor set to "UNK" (like you did with effectieTime/low). The reason for that is because a statusCode of "completed" really should go along with the presence of effectiveTime/high - and in the case of the outer Allergy Problem Act template that you are not showing in your samples above (but have to be there in C-CDA) CONF:10085 forces that. So, best to be consistent, I believe...

    ReplyDelete
    Replies
    1. effectiveTime is independent of status. effectiveTime is when the observation is believed to hold. This is independent of whether the observation is "complete" - i.e. the observer is done making their decision. The time when the observation is made is the activityTime - though it's generally common to just capture author.time.

      Delete
  5. Where can I read documentation which explains all the segments of XML?

    ReplyDelete