R4 Draft for Comment

This page is part of the FHIR Specification (v3.2.0: R4 Ballot 1). The current version which supercedes this version is 5.0.0. For a full list of available versions, see the Directory of published versions . Page versions: R5 R4B R4 R3 R2

10.1 Resource Observation - Content

Orders and Observations Work GroupMaturity Level: 5 Normative Compartments: Device, Encounter, Patient, Practitioner, RelatedPerson

Normative Candidate Note: This page is candidate normative content for R4 in the Observation Package. Once normative, it will lose it's Maturity Level, and breaking changes will no longer be made.

Measurements and simple assertions made about a patient, device or other subject.

STU Note: The Orders and Observations work-group wants to draw the attention of reviewers and implementers to the following significant changes to this resource for feedback prior to the Normative ballot:

We are seeking input on:

  1. The guidance on using code value pairs to represent observations in FHIR
  2. Breaking Change The replacement of the .related complex element with direct inline elements based on the types listed in ObservationRelationshipType : This change allows for more flexibility in adding additional reference targets as well as a simplifying the structure. The other relationship types were considered to be outside the 80% and only sequel-to and replaces were made into standard extensions referencing a target Observation.
  3. Breaking Change The removal of the Attachment data type as a choice for .value[x]. As a result of 2, direct links to Media were added. Observations that require the attachment data types are represented by the Media resource. This change eliminates the ambiguity and duplication on how to represent multimedia observations.
  4. Substantive Change The promotion of the event-partOf extension to an inline element. This allows a direct reference to an event in which the observation was made (for example a procedure).
  5. Review of the standard event extensions which are the result of alignment with the workflow Event pattern

This resource is an event resource from a FHIR workflow perspective - see Workflow.

Observations are a central element in healthcare, used to support diagnosis, monitor progress, determine baselines and patterns and even capture demographic characteristics. Most observations are simple name/value pair assertions with some metadata,but some observations group other observations together logically, or even are multi-component observations.Note that the DiagnosticReportresource providess a clinical or workflow context for a set of observations and the Observation resource is referenced by DiagnosticReport to represent lab, imaging, and other clinical and diagnostic data to form a complete report.

Uses for the Observation resource include:

The following core profiles for the Observation resource have been defined as well. If implementations use this Resource when expressing the profile-specific concepts as structured data, they SHALL conform to the following profiles:

Profile Description
Vital signs The FHIR Vital Signs profile sets a minimum expectations for the Observation Resource to record, search and fetch the vital signs (e.g. temperature, blood pressure, respiration rate, etc) associated with a patient

The Media resource captures a specific type of observation whose value is audio, video or image data. This resource is used instead of Observation to represent such forms of information as it exposes the metadata relevant for interpreting the information. See Media's boundaries section to see how Media (and Observation) differs from ImagingStudy and DocumentReference.

In contrast to the Observation resource, the DiagnosticReport resource typically includes additional clinical context and some mix of atomic results, images, imaging reports, textual and coded interpretation, and formatted representations. Laboratory reports, pathology reports, and imaging reports should be represented using the DiagnosticReport resource. The Observation resource is referenced by the DiagnosticReport to provide the atomic results for a particular investigation. "Laboratories routinely have a variable that is summative across a series of discrete variables - these are usually called 'impressions' or 'interpretations'. Sometimes they are algorithmically specified and sometimes they have the imprimatur of pathologists and they are conveyed in Observation or DiagnosticReport instead of the Clinical Impression resource. However, the Observation resources should not be used to record clinical diagnosis about a patient or subject that are typically captured in the Condition resource or the ClinicalImpression resource. The Observation resource is often referenced by the Condition resource to provide specific subjective and objective data to support its assertions.

Many other resources can be considered "specializations" of the Observation resource and should be used for those specific contexts and use cases. For example, the AllergyIntolerance resource represents a patient allergies, MedicationStatement resource: medications taken by a patient, FamilyMemberHistory resource: a patient's family history, Procedure resource: information about a procedure, and QuestionnaireResponse resource: a set of answers to a set of questions. In some cases, such as when source data is coming from an HL7 v2 feed, a system might not have information that allows it to distinguish diagnosis, allergy and other "specialized" types of observations from lab, vital sign and other observation types intended to be conveyed with this resource. In those circumstances, such specialized observations may also appear using this resource.

This resource is referenced by AdverseEvent, CarePlan, ChargeItem, ClinicalImpression, Communication, CommunicationRequest, Condition, DeviceRequest, DeviceUseStatement, DiagnosticReport, FamilyMemberHistory, Goal, MedicationAdministration, MedicationRequest, MedicationStatement, Procedure, QuestionnaireResponse, Sequence, ServiceRequest and SupplyRequest

Structure

NameFlagsCard.TypeDescription & Constraintsdoco
.. Observation INDomainResourceMeasurements and simple assertions
+ If Observation.code is the same as a Observation.component.code then the value element associated with the code SHALL NOT be present
+ dataAbsentReason SHALL only be present if Observation.value[x] is not present
Elements defined in Ancestors: id, meta, implicitRules, language, text, contained, extension, modifierExtension
... identifier Σ0..*IdentifierBusiness Identifier for observation
... basedOn Σ0..*Reference(CarePlan | DeviceRequest | ImmunizationRecommendation | MedicationRequest | NutritionOrder | ServiceRequest)Fulfills plan, proposal or order
... partOf Σ0..*Reference(MedicationAdministration | MedicationDispense | MedicationStatement | Procedure | Immunization | ImagingStudy)Part of referenced event
... status ?!Σ1..1coderegistered | preliminary | final | amended +
ObservationStatus (Required)
... category 0..*CodeableConceptClassification of type of observation
Observation Category Codes (Preferred)
... code Σ1..1CodeableConceptType of observation (code / type)
LOINC Codes (Example)
... subject Σ0..1Reference(Patient | Group | Device | Location)Who and/or what this is about
... context 0..1Reference(Encounter | EpisodeOfCare)Healthcare event during which this observation is made
... effective[x] Σ0..1Clinically relevant time/time-period for observation
.... effectiveDateTimedateTime
.... effectivePeriodPeriod
.... effectiveTimingTiming
... issued Σ0..1instantDate/Time this version was made available
... performer Σ0..*Reference(Practitioner | PractitionerRole | Organization | CareTeam | Patient | RelatedPerson)Who is responsible for the observation
... value[x] ΣI0..1Actual result
.... valueQuantityQuantity
.... valueCodeableConceptCodeableConcept
.... valueStringstring
.... valueBooleanboolean
.... valueIntegerinteger
.... valueRangeRange
.... valueRatioRatio
.... valueSampledDataSampledData
.... valueTimetime
.... valueDateTimedateTime
.... valuePeriodPeriod
... dataAbsentReason I0..1CodeableConceptWhy the result is missing
Observation Value Absent Reason (Extensible)
... interpretation 0..1CodeableConceptHigh, low, normal, etc.
Observation Interpretation Codes (Extensible)
... comment 0..1stringComments about result
... bodySite 0..1CodeableConceptObserved body part
SNOMED CT Body Structures (Example)
... method 0..1CodeableConceptHow it was done
Observation Methods (Example)
... specimen 0..1Reference(Specimen)Specimen used for this observation
... device 0..1Reference(Device | DeviceComponent | DeviceMetric)(Measurement) Device
... referenceRange I0..*BackboneElementProvides guide for interpretation
+ Must have at least a low or a high or text
.... low I0..1SimpleQuantityLow Range, if relevant
.... high I0..1SimpleQuantityHigh Range, if relevant
.... type 0..1CodeableConceptReference range qualifier
Observation Reference Range Meaning Codes (Extensible)
.... appliesTo 0..*CodeableConceptReference range population
Observation Reference Range Applies To Codes (Example)
.... age 0..1RangeApplicable age range, if relevant
.... text 0..1stringText based reference range in an observation
... hasMember Σ0..*Reference(Observation | QuestionnaireResponse | Sequence)Related resource that belongs to the Observation group
... derivedFrom Σ0..*Reference(DocumentReference | ImagingStudy | Media | QuestionnaireResponse | Observation | Sequence)Related measurements the observation is made from
... component Σ0..*BackboneElementComponent results
.... code Σ1..1CodeableConceptType of component observation (code / type)
LOINC Codes (Example)
.... value[x] Σ0..1Actual component result
..... valueQuantityQuantity
..... valueCodeableConceptCodeableConcept
..... valueStringstring
..... valueBooleanboolean
..... valueIntegerinteger
..... valueRangeRange
..... valueRatioRatio
..... valueSampledDataSampledData
..... valueTimetime
..... valueDateTimedateTime
..... valuePeriodPeriod
.... dataAbsentReason I0..1CodeableConceptWhy the component result is missing
Observation Value Absent Reason (Extensible)
.... interpretation 0..1CodeableConceptHigh, low, normal, etc.
Observation Interpretation Codes (Extensible)
.... referenceRange 0..*see referenceRangeProvides guide for interpretation of component result

doco Documentation for this format

UML Diagram (Legend)

Observation (DomainResource)A unique identifier assigned to this observationidentifier : Identifier [0..*]A plan, proposal or order that is fulfilled in whole or in part by this eventbasedOn : Reference [0..*] « CarePlan|DeviceRequest| ImmunizationRecommendation|MedicationRequest|NutritionOrder| ServiceRequest »A larger event of which this particular Observation is a component or step. For example, an observation as part of a procedurepartOf : Reference [0..*] « MedicationAdministration| MedicationDispense|MedicationStatement|Procedure|Immunization| ImagingStudy »The status of the result value (this element modifies the meaning of other elements)status : code [1..1] « Codes providing the status of an observation. (Strength=Required)ObservationStatus! »A code that classifies the general type of observation being madecategory : CodeableConcept [0..*] « Codes for high level observation categories. (Strength=Preferred)Observation Category ? »Describes what was observed. Sometimes this is called the observation "name"code : CodeableConcept [1..1] « Codes identifying names of simple observations. (Strength=Example)LOINC ?? »The patient, or group of patients, location, or device whose characteristics (direct or indirect) are described by the observation and into whose record the observation is placed. Comments: Indirect characteristics may be those of a specimen, fetus, donor, other observer (for example a relative or EMT), or any observation made about the subjectsubject : Reference [0..1] « Patient|Group|Device|Location »The healthcare event (e.g. a patient and healthcare provider interaction) during which this observation is madecontext : Reference [0..1] « Encounter|EpisodeOfCare »The time or time-period the observed value is asserted as being true. For biological subjects - e.g. human patients - this is usually called the "physiologically relevant time". This is usually either the time of the procedure or of specimen collection, but very often the source of the date/time is not known, only the date/time itselfeffective[x] : Type [0..1] « dateTime|Period|Timing »The date and time this version of the observation was made available to providers, typically after the results have been reviewed and verifiedissued : instant [0..1]Who was responsible for asserting the observed value as "true"performer : Reference [0..*] « Practitioner|PractitionerRole| Organization|CareTeam|Patient|RelatedPerson »The information determined as a result of making the observation, if the information has a simple valuevalue[x] : Type [0..1] « Quantity|CodeableConcept|string|boolean| integer|Range|Ratio|SampledData|time|dateTime|Period »Provides a reason why the expected value in the element Observation.value[x] is missingdataAbsentReason : CodeableConcept [0..1] « Codes specifying why the result (Observation.value[x]) is missing. (Strength=Extensible)Observation Value Absent Reas...+ »The assessment made based on the result of the observation. Intended as a simple compact code often placed adjacent to the result value in reports and flow sheets to signal the meaning/normalcy status of the result. Otherwise known as abnormal flaginterpretation : CodeableConcept [0..1] « Codes identifying interpretations of observations. (Strength=Extensible)Observation Interpretation + »May include statements about significant, unexpected or unreliable values, or information about the source of the value where this may be relevant to the interpretation of the resultcomment : string [0..1]Indicates the site on the subject's body where the observation was made (i.e. the target site)bodySite : CodeableConcept [0..1] « Codes describing anatomical locations. May include laterality. (Strength=Example)SNOMED CT Body Structures?? »Indicates the mechanism used to perform the observationmethod : CodeableConcept [0..1] « Methods for simple observations. (Strength=Example)Observation Methods?? »The specimen that was used when this observation was madespecimen : Reference [0..1] « Specimen »The device used to generate the observation datadevice : Reference [0..1] « Device|DeviceComponent|DeviceMetric »This observation is a group observation (e.g. a battery, a panel of tests, a set of vital sign measurements) that includes the target as a member of the grouphasMember : Reference [0..*] « Observation|QuestionnaireResponse| Sequence »The target resource that represents a measurement from which this observation value is derived. For example, a calculated anion gap or a fetal measurement based on an ultrasound imagederivedFrom : Reference [0..*] « DocumentReference|ImagingStudy| Media|QuestionnaireResponse|Observation|Sequence »ReferenceRangeThe value of the low bound of the reference range. The low bound of the reference range endpoint is inclusive of the value (e.g. reference range is >=5 - <=9). If the low bound is omitted, it is assumed to be meaningless (e.g. reference range is <=2.3)low : Quantity(SimpleQuantity) [0..1]The value of the high bound of the reference range. The high bound of the reference range endpoint is inclusive of the value (e.g. reference range is >=5 - <=9). If the high bound is omitted, it is assumed to be meaningless (e.g. reference range is >= 2.3)high : Quantity(SimpleQuantity) [0..1]Codes to indicate the what part of the targeted reference population it applies to. For example, the normal or therapeutic rangetype : CodeableConcept [0..1] « Code for the meaning of a reference range. (Strength=Extensible)Observation Reference Range M...+ »Codes to indicate the target population this reference range applies to. For example, a reference range may be based on the normal population or a particular sex or raceappliesTo : CodeableConcept [0..*] « Codes identifying the population the reference range applies to. (Strength=Example)Observation Reference Range A...?? »The age at which this reference range is applicable. This is a neonatal age (e.g. number of weeks at term) if the meaning says soage : Range [0..1]Text based reference range in an observation which may be used when a quantitative range is not appropriate for an observation. An example would be a reference value of "Negative" or a list or table of 'normals'text : string [0..1]ComponentDescribes what was observed. Sometimes this is called the observation "code"code : CodeableConcept [1..1] « Codes identifying names of simple observations. (Strength=Example)LOINC ?? »The information determined as a result of making the observation, if the information has a simple valuevalue[x] : Type [0..1] « Quantity|CodeableConcept|string|boolean| integer|Range|Ratio|SampledData|time|dateTime|Period »Provides a reason why the expected value in the element Observation.component.value[x] is missingdataAbsentReason : CodeableConcept [0..1] « Codes specifying why the result (Observation.value[x]) is missing. (Strength=Extensible)Observation Value Absent Reas...+ »The assessment made based on the result of the observation. Intended as a simple compact code often placed adjacent to the result value in reports and flow sheets to signal the meaning/normalcy status of the result. Otherwise known as abnormal flaginterpretation : CodeableConcept [0..1] « Codes identifying interpretations of observations. (Strength=Extensible)Observation Interpretation + »Guidance on how to interpret the value by comparison to a normal or recommended rangereferenceRange[0..*]Guidance on how to interpret the value by comparison to a normal or recommended rangereferenceRange[0..*]Some observations have multiple component observations. These component observations are expressed as separate code value pairs that share the same attributes. Examples include systolic and diastolic component observations for blood pressure measurement and multiple component observations for genetics observationscomponent[0..*]

XML Template

<Observation xmlns="http://hl7.org/fhir"> doco
 <!-- from Resource: id, meta, implicitRules, and language -->
 <!-- from DomainResource: text, contained, extension, and modifierExtension -->
 <identifier><!-- 0..* Identifier Business Identifier for observation --></identifier>
 <basedOn><!-- 0..* Reference(CarePlan|DeviceRequest|ImmunizationRecommendation|
   MedicationRequest|NutritionOrder|ServiceRequest) Fulfills plan, proposal or order --></basedOn>
 <partOf><!-- 0..* Reference(MedicationAdministration|MedicationDispense|
   MedicationStatement|Procedure|Immunization|ImagingStudy) Part of referenced event --></partOf>
 <status value="[code]"/><!-- 1..1 registered | preliminary | final | amended + -->
 <category><!-- 0..* CodeableConcept Classification of  type of observation --></category>
 <code><!-- 1..1 CodeableConcept Type of observation (code / type) --></code>
 <subject><!-- 0..1 Reference(Patient|Group|Device|Location) Who and/or what this is about --></subject>
 <context><!-- 0..1 Reference(Encounter|EpisodeOfCare) Healthcare event during which this observation is made --></context>
 <effective[x]><!-- 0..1 dateTime|Period|Timing Clinically relevant time/time-period for observation --></effective[x]>
 <issued value="[instant]"/><!-- 0..1 Date/Time this version was made available -->
 <performer><!-- 0..* Reference(Practitioner|PractitionerRole|Organization|
   CareTeam|Patient|RelatedPerson) Who is responsible for the observation --></performer>
 <value[x]><!-- ?? 0..1 Quantity|CodeableConcept|string|boolean|integer|Range|Ratio|
   SampledData|time|dateTime|Period Actual result --></value[x]>
 <dataAbsentReason><!-- ?? 0..1 CodeableConcept Why the result is missing --></dataAbsentReason>
 <interpretation><!-- 0..1 CodeableConcept High, low, normal, etc. --></interpretation>
 <comment value="[string]"/><!-- 0..1 Comments about result -->
 <bodySite><!-- 0..1 CodeableConcept Observed body part --></bodySite>
 <method><!-- 0..1 CodeableConcept How it was done --></method>
 <specimen><!-- 0..1 Reference(Specimen) Specimen used for this observation --></specimen>
 <device><!-- 0..1 Reference(Device|DeviceComponent|DeviceMetric) (Measurement) Device --></device>
 <referenceRange>  <!-- 0..* Provides guide for interpretation -->
  <low><!-- ?? 0..1 Quantity(SimpleQuantity) Low Range, if relevant --></low>
  <high><!-- ?? 0..1 Quantity(SimpleQuantity) High Range, if relevant --></high>
  <type><!-- 0..1 CodeableConcept Reference range qualifier --></type>
  <appliesTo><!-- 0..* CodeableConcept Reference range population --></appliesTo>
  <age><!-- 0..1 Range Applicable age range, if relevant --></age>
  <text value="[string]"/><!-- 0..1 Text based reference range in an observation -->
 </referenceRange>
 <hasMember><!-- 0..* Reference(Observation|QuestionnaireResponse|Sequence) Related resource that belongs to the Observation group --></hasMember>
 <derivedFrom><!-- 0..* Reference(DocumentReference|ImagingStudy|Media|
   QuestionnaireResponse|Observation|Sequence) Related measurements the observation is made from --></derivedFrom>
 <component>  <!-- 0..* Component results -->
  <code><!-- 1..1 CodeableConcept Type of component observation (code / type) --></code>
  <value[x]><!-- 0..1 Quantity|CodeableConcept|string|boolean|integer|Range|
    Ratio|SampledData|time|dateTime|Period Actual component result --></value[x]>
  <dataAbsentReason><!-- ?? 0..1 CodeableConcept Why the component result is missing --></dataAbsentReason>
  <interpretation><!-- 0..1 CodeableConcept High, low, normal, etc. --></interpretation>
  <referenceRange><!-- 0..* Content as for Observation.referenceRange Provides guide for interpretation of component result --></referenceRange>
 </component>
</Observation>

JSON Template

{doco
  "resourceType" : "Observation",
  // from Resource: id, meta, implicitRules, and language
  // from DomainResource: text, contained, extension, and modifierExtension
  "identifier" : [{ Identifier }], // Business Identifier for observation
  "basedOn" : [{ Reference(CarePlan|DeviceRequest|ImmunizationRecommendation|
   MedicationRequest|NutritionOrder|ServiceRequest) }], // Fulfills plan, proposal or order
  "partOf" : [{ Reference(MedicationAdministration|MedicationDispense|
   MedicationStatement|Procedure|Immunization|ImagingStudy) }], // Part of referenced event
  "status" : "<code>", // R!  registered | preliminary | final | amended +
  "category" : [{ CodeableConcept }], // Classification of  type of observation
  "code" : { CodeableConcept }, // R!  Type of observation (code / type)
  "subject" : { Reference(Patient|Group|Device|Location) }, // Who and/or what this is about
  "context" : { Reference(Encounter|EpisodeOfCare) }, // Healthcare event during which this observation is made
  // effective[x]: Clinically relevant time/time-period for observation. One of these 3:
  "effectiveDateTime" : "<dateTime>",
  "effectivePeriod" : { Period },
  "effectiveTiming" : { Timing },
  "issued" : "<instant>", // Date/Time this version was made available
  "performer" : [{ Reference(Practitioner|PractitionerRole|Organization|
   CareTeam|Patient|RelatedPerson) }], // Who is responsible for the observation
  // value[x]: Actual result. One of these 11:
  "valueQuantity" : { Quantity },
  "valueCodeableConcept" : { CodeableConcept },
  "valueString" : "<string>",
  "valueBoolean" : <boolean>,
  "valueInteger" : <integer>,
  "valueRange" : { Range },
  "valueRatio" : { Ratio },
  "valueSampledData" : { SampledData },
  "valueTime" : "<time>",
  "valueDateTime" : "<dateTime>",
  "valuePeriod" : { Period },
  "dataAbsentReason" : { CodeableConcept }, // C? Why the result is missing
  "interpretation" : { CodeableConcept }, // High, low, normal, etc.
  "comment" : "<string>", // Comments about result
  "bodySite" : { CodeableConcept }, // Observed body part
  "method" : { CodeableConcept }, // How it was done
  "specimen" : { Reference(Specimen) }, // Specimen used for this observation
  "device" : { Reference(Device|DeviceComponent|DeviceMetric) }, // (Measurement) Device
  "referenceRange" : [{ // Provides guide for interpretation
    "low" : { Quantity(SimpleQuantity) }, // C? Low Range, if relevant
    "high" : { Quantity(SimpleQuantity) }, // C? High Range, if relevant
    "type" : { CodeableConcept }, // Reference range qualifier
    "appliesTo" : [{ CodeableConcept }], // Reference range population
    "age" : { Range }, // Applicable age range, if relevant
    "text" : "<string>" // Text based reference range in an observation
  }],
  "hasMember" : [{ Reference(Observation|QuestionnaireResponse|Sequence) }], // Related resource that belongs to the Observation group
  "derivedFrom" : [{ Reference(DocumentReference|ImagingStudy|Media|
   QuestionnaireResponse|Observation|Sequence) }], // Related measurements the observation is made from
  "component" : [{ // Component results
    "code" : { CodeableConcept }, // R!  Type of component observation (code / type)
    // value[x]: Actual component result. One of these 11:
    "valueQuantity" : { Quantity },
    "valueCodeableConcept" : { CodeableConcept },
    "valueString" : "<string>",
    "valueBoolean" : <boolean>,
    "valueInteger" : <integer>,
    "valueRange" : { Range },
    "valueRatio" : { Ratio },
    "valueSampledData" : { SampledData },
    "valueTime" : "<time>",
    "valueDateTime" : "<dateTime>",
    "valuePeriod" : { Period },
    "dataAbsentReason" : { CodeableConcept }, // C? Why the component result is missing
    "interpretation" : { CodeableConcept }, // High, low, normal, etc.
    "referenceRange" : [{ Content as for Observation.referenceRange }] // Provides guide for interpretation of component result
  }]
}

Turtle Template

@prefix fhir: <http://hl7.org/fhir/> .doco


[ a fhir:Observation;
  fhir:nodeRole fhir:treeRoot; # if this is the parser root

  # from Resource: .id, .meta, .implicitRules, and .language
  # from DomainResource: .text, .contained, .extension, and .modifierExtension
  fhir:Observation.identifier [ Identifier ], ... ; # 0..* Business Identifier for observation
  fhir:Observation.basedOn [ Reference(CarePlan|DeviceRequest|ImmunizationRecommendation|MedicationRequest|
  NutritionOrder|ServiceRequest) ], ... ; # 0..* Fulfills plan, proposal or order
  fhir:Observation.partOf [ Reference(MedicationAdministration|MedicationDispense|MedicationStatement|Procedure|
  Immunization|ImagingStudy) ], ... ; # 0..* Part of referenced event
  fhir:Observation.status [ code ]; # 1..1 registered | preliminary | final | amended +
  fhir:Observation.category [ CodeableConcept ], ... ; # 0..* Classification of  type of observation
  fhir:Observation.code [ CodeableConcept ]; # 1..1 Type of observation (code / type)
  fhir:Observation.subject [ Reference(Patient|Group|Device|Location) ]; # 0..1 Who and/or what this is about
  fhir:Observation.context [ Reference(Encounter|EpisodeOfCare) ]; # 0..1 Healthcare event during which this observation is made
  # Observation.effective[x] : 0..1 Clinically relevant time/time-period for observation. One of these 3
    fhir:Observation.effectiveDateTime [ dateTime ]
    fhir:Observation.effectivePeriod [ Period ]
    fhir:Observation.effectiveTiming [ Timing ]
  fhir:Observation.issued [ instant ]; # 0..1 Date/Time this version was made available
  fhir:Observation.performer [ Reference(Practitioner|PractitionerRole|Organization|CareTeam|Patient|RelatedPerson) ], ... ; # 0..* Who is responsible for the observation
  # Observation.value[x] : 0..1 Actual result. One of these 11
    fhir:Observation.valueQuantity [ Quantity ]
    fhir:Observation.valueCodeableConcept [ CodeableConcept ]
    fhir:Observation.valueString [ string ]
    fhir:Observation.valueBoolean [ boolean ]
    fhir:Observation.valueInteger [ integer ]
    fhir:Observation.valueRange [ Range ]
    fhir:Observation.valueRatio [ Ratio ]
    fhir:Observation.valueSampledData [ SampledData ]
    fhir:Observation.valueTime [ time ]
    fhir:Observation.valueDateTime [ dateTime ]
    fhir:Observation.valuePeriod [ Period ]
  fhir:Observation.dataAbsentReason [ CodeableConcept ]; # 0..1 Why the result is missing
  fhir:Observation.interpretation [ CodeableConcept ]; # 0..1 High, low, normal, etc.
  fhir:Observation.comment [ string ]; # 0..1 Comments about result
  fhir:Observation.bodySite [ CodeableConcept ]; # 0..1 Observed body part
  fhir:Observation.method [ CodeableConcept ]; # 0..1 How it was done
  fhir:Observation.specimen [ Reference(Specimen) ]; # 0..1 Specimen used for this observation
  fhir:Observation.device [ Reference(Device|DeviceComponent|DeviceMetric) ]; # 0..1 (Measurement) Device
  fhir:Observation.referenceRange [ # 0..* Provides guide for interpretation
    fhir:Observation.referenceRange.low [ Quantity(SimpleQuantity) ]; # 0..1 Low Range, if relevant
    fhir:Observation.referenceRange.high [ Quantity(SimpleQuantity) ]; # 0..1 High Range, if relevant
    fhir:Observation.referenceRange.type [ CodeableConcept ]; # 0..1 Reference range qualifier
    fhir:Observation.referenceRange.appliesTo [ CodeableConcept ], ... ; # 0..* Reference range population
    fhir:Observation.referenceRange.age [ Range ]; # 0..1 Applicable age range, if relevant
    fhir:Observation.referenceRange.text [ string ]; # 0..1 Text based reference range in an observation
  ], ...;
  fhir:Observation.hasMember [ Reference(Observation|QuestionnaireResponse|Sequence) ], ... ; # 0..* Related resource that belongs to the Observation group
  fhir:Observation.derivedFrom [ Reference(DocumentReference|ImagingStudy|Media|QuestionnaireResponse|Observation|Sequence) ], ... ; # 0..* Related measurements the observation is made from
  fhir:Observation.component [ # 0..* Component results
    fhir:Observation.component.code [ CodeableConcept ]; # 1..1 Type of component observation (code / type)
    # Observation.component.value[x] : 0..1 Actual component result. One of these 11
      fhir:Observation.component.valueQuantity [ Quantity ]
      fhir:Observation.component.valueCodeableConcept [ CodeableConcept ]
      fhir:Observation.component.valueString [ string ]
      fhir:Observation.component.valueBoolean [ boolean ]
      fhir:Observation.component.valueInteger [ integer ]
      fhir:Observation.component.valueRange [ Range ]
      fhir:Observation.component.valueRatio [ Ratio ]
      fhir:Observation.component.valueSampledData [ SampledData ]
      fhir:Observation.component.valueTime [ time ]
      fhir:Observation.component.valueDateTime [ dateTime ]
      fhir:Observation.component.valuePeriod [ Period ]
    fhir:Observation.component.dataAbsentReason [ CodeableConcept ]; # 0..1 Why the component result is missing
    fhir:Observation.component.interpretation [ CodeableConcept ]; # 0..1 High, low, normal, etc.
    fhir:Observation.component.referenceRange [ See Observation.referenceRange ], ... ; # 0..* Provides guide for interpretation of component result
  ], ...;
]

Changes since DSTU2

Observation
Observation.basedOn
  • Added Element
Observation.partOf
  • Added Element
Observation.category
  • Max Cardinality changed from 1 to *
Observation.context
  • Renamed from encounter to context
  • Add Reference(EpisodeOfCare)
Observation.effective[x]
  • Add Timing
Observation.performer
  • Add Reference(PractitionerRole), Add Reference(CareTeam)
Observation.value[x]
  • Remove Attachment, Add boolean, Add integer
Observation.comment
  • Renamed from comments to comment
Observation.device
  • Add Reference(DeviceComponent)
Observation.referenceRange.type
  • Added Element
Observation.referenceRange.appliesTo
  • Renamed from meaning to appliesTo
  • Max Cardinality changed from 1 to *
Observation.hasMember
  • Added Element
Observation.derivedFrom
  • Added Element
Observation.component.value[x]
  • Remove Attachment, Add boolean, Add integer
Observation.component.interpretation
  • Added Element
Observation.related
  • deleted

See the Full Difference for further information

This analysis is available as XML or JSON.

See R2 <--> R3 Conversion Maps (status = 34 tests that all execute ok. All tests pass round-trip testing and 15 r3 resources are invalid (58 errors).).

Structure

NameFlagsCard.TypeDescription & Constraintsdoco
.. Observation INDomainResourceMeasurements and simple assertions
+ If Observation.code is the same as a Observation.component.code then the value element associated with the code SHALL NOT be present
+ dataAbsentReason SHALL only be present if Observation.value[x] is not present
Elements defined in Ancestors: id, meta, implicitRules, language, text, contained, extension, modifierExtension
... identifier Σ0..*IdentifierBusiness Identifier for observation
... basedOn Σ0..*Reference(CarePlan | DeviceRequest | ImmunizationRecommendation | MedicationRequest | NutritionOrder | ServiceRequest)Fulfills plan, proposal or order
... partOf Σ0..*Reference(MedicationAdministration | MedicationDispense | MedicationStatement | Procedure | Immunization | ImagingStudy)Part of referenced event
... status ?!Σ1..1coderegistered | preliminary | final | amended +
ObservationStatus (Required)
... category 0..*CodeableConceptClassification of type of observation
Observation Category Codes (Preferred)
... code Σ1..1CodeableConceptType of observation (code / type)
LOINC Codes (Example)
... subject Σ0..1Reference(Patient | Group | Device | Location)Who and/or what this is about
... context 0..1Reference(Encounter | EpisodeOfCare)Healthcare event during which this observation is made
... effective[x] Σ0..1Clinically relevant time/time-period for observation
.... effectiveDateTimedateTime
.... effectivePeriodPeriod
.... effectiveTimingTiming
... issued Σ0..1instantDate/Time this version was made available
... performer Σ0..*Reference(Practitioner | PractitionerRole | Organization | CareTeam | Patient | RelatedPerson)Who is responsible for the observation
... value[x] ΣI0..1Actual result
.... valueQuantityQuantity
.... valueCodeableConceptCodeableConcept
.... valueStringstring
.... valueBooleanboolean
.... valueIntegerinteger
.... valueRangeRange
.... valueRatioRatio
.... valueSampledDataSampledData
.... valueTimetime
.... valueDateTimedateTime
.... valuePeriodPeriod
... dataAbsentReason I0..1CodeableConceptWhy the result is missing
Observation Value Absent Reason (Extensible)
... interpretation 0..1CodeableConceptHigh, low, normal, etc.
Observation Interpretation Codes (Extensible)
... comment 0..1stringComments about result
... bodySite 0..1CodeableConceptObserved body part
SNOMED CT Body Structures (Example)
... method 0..1CodeableConceptHow it was done
Observation Methods (Example)
... specimen 0..1Reference(Specimen)Specimen used for this observation
... device 0..1Reference(Device | DeviceComponent | DeviceMetric)(Measurement) Device
... referenceRange I0..*BackboneElementProvides guide for interpretation
+ Must have at least a low or a high or text
.... low I0..1SimpleQuantityLow Range, if relevant
.... high I0..1SimpleQuantityHigh Range, if relevant
.... type 0..1CodeableConceptReference range qualifier
Observation Reference Range Meaning Codes (Extensible)
.... appliesTo 0..*CodeableConceptReference range population
Observation Reference Range Applies To Codes (Example)
.... age 0..1RangeApplicable age range, if relevant
.... text 0..1stringText based reference range in an observation
... hasMember Σ0..*Reference(Observation | QuestionnaireResponse | Sequence)Related resource that belongs to the Observation group
... derivedFrom Σ0..*Reference(DocumentReference | ImagingStudy | Media | QuestionnaireResponse | Observation | Sequence)Related measurements the observation is made from
... component Σ0..*BackboneElementComponent results
.... code Σ1..1CodeableConceptType of component observation (code / type)
LOINC Codes (Example)
.... value[x] Σ0..1Actual component result
..... valueQuantityQuantity
..... valueCodeableConceptCodeableConcept
..... valueStringstring
..... valueBooleanboolean
..... valueIntegerinteger
..... valueRangeRange
..... valueRatioRatio
..... valueSampledDataSampledData
..... valueTimetime
..... valueDateTimedateTime
..... valuePeriodPeriod
.... dataAbsentReason I0..1CodeableConceptWhy the component result is missing
Observation Value Absent Reason (Extensible)
.... interpretation 0..1CodeableConceptHigh, low, normal, etc.
Observation Interpretation Codes (Extensible)
.... referenceRange 0..*see referenceRangeProvides guide for interpretation of component result

doco Documentation for this format

UML Diagram (Legend)

Observation (DomainResource)A unique identifier assigned to this observationidentifier : Identifier [0..*]A plan, proposal or order that is fulfilled in whole or in part by this eventbasedOn : Reference [0..*] « CarePlan|DeviceRequest| ImmunizationRecommendation|MedicationRequest|NutritionOrder| ServiceRequest »A larger event of which this particular Observation is a component or step. For example, an observation as part of a procedurepartOf : Reference [0..*] « MedicationAdministration| MedicationDispense|MedicationStatement|Procedure|Immunization| ImagingStudy »The status of the result value (this element modifies the meaning of other elements)status : code [1..1] « Codes providing the status of an observation. (Strength=Required)ObservationStatus! »A code that classifies the general type of observation being madecategory : CodeableConcept [0..*] « Codes for high level observation categories. (Strength=Preferred)Observation Category ? »Describes what was observed. Sometimes this is called the observation "name"code : CodeableConcept [1..1] « Codes identifying names of simple observations. (Strength=Example)LOINC ?? »The patient, or group of patients, location, or device whose characteristics (direct or indirect) are described by the observation and into whose record the observation is placed. Comments: Indirect characteristics may be those of a specimen, fetus, donor, other observer (for example a relative or EMT), or any observation made about the subjectsubject : Reference [0..1] « Patient|Group|Device|Location »The healthcare event (e.g. a patient and healthcare provider interaction) during which this observation is madecontext : Reference [0..1] « Encounter|EpisodeOfCare »The time or time-period the observed value is asserted as being true. For biological subjects - e.g. human patients - this is usually called the "physiologically relevant time". This is usually either the time of the procedure or of specimen collection, but very often the source of the date/time is not known, only the date/time itselfeffective[x] : Type [0..1] « dateTime|Period|Timing »The date and time this version of the observation was made available to providers, typically after the results have been reviewed and verifiedissued : instant [0..1]Who was responsible for asserting the observed value as "true"performer : Reference [0..*] « Practitioner|PractitionerRole| Organization|CareTeam|Patient|RelatedPerson »The information determined as a result of making the observation, if the information has a simple valuevalue[x] : Type [0..1] « Quantity|CodeableConcept|string|boolean| integer|Range|Ratio|SampledData|time|dateTime|Period »Provides a reason why the expected value in the element Observation.value[x] is missingdataAbsentReason : CodeableConcept [0..1] « Codes specifying why the result (Observation.value[x]) is missing. (Strength=Extensible)Observation Value Absent Reas...+ »The assessment made based on the result of the observation. Intended as a simple compact code often placed adjacent to the result value in reports and flow sheets to signal the meaning/normalcy status of the result. Otherwise known as abnormal flaginterpretation : CodeableConcept [0..1] « Codes identifying interpretations of observations. (Strength=Extensible)Observation Interpretation + »May include statements about significant, unexpected or unreliable values, or information about the source of the value where this may be relevant to the interpretation of the resultcomment : string [0..1]Indicates the site on the subject's body where the observation was made (i.e. the target site)bodySite : CodeableConcept [0..1] « Codes describing anatomical locations. May include laterality. (Strength=Example)SNOMED CT Body Structures?? »Indicates the mechanism used to perform the observationmethod : CodeableConcept [0..1] « Methods for simple observations. (Strength=Example)Observation Methods?? »The specimen that was used when this observation was madespecimen : Reference [0..1] « Specimen »The device used to generate the observation datadevice : Reference [0..1] « Device|DeviceComponent|DeviceMetric »This observation is a group observation (e.g. a battery, a panel of tests, a set of vital sign measurements) that includes the target as a member of the grouphasMember : Reference [0..*] « Observation|QuestionnaireResponse| Sequence »The target resource that represents a measurement from which this observation value is derived. For example, a calculated anion gap or a fetal measurement based on an ultrasound imagederivedFrom : Reference [0..*] « DocumentReference|ImagingStudy| Media|QuestionnaireResponse|Observation|Sequence »ReferenceRangeThe value of the low bound of the reference range. The low bound of the reference range endpoint is inclusive of the value (e.g. reference range is >=5 - <=9). If the low bound is omitted, it is assumed to be meaningless (e.g. reference range is <=2.3)low : Quantity(SimpleQuantity) [0..1]The value of the high bound of the reference range. The high bound of the reference range endpoint is inclusive of the value (e.g. reference range is >=5 - <=9). If the high bound is omitted, it is assumed to be meaningless (e.g. reference range is >= 2.3)high : Quantity(SimpleQuantity) [0..1]Codes to indicate the what part of the targeted reference population it applies to. For example, the normal or therapeutic rangetype : CodeableConcept [0..1] « Code for the meaning of a reference range. (Strength=Extensible)Observation Reference Range M...+ »Codes to indicate the target population this reference range applies to. For example, a reference range may be based on the normal population or a particular sex or raceappliesTo : CodeableConcept [0..*] « Codes identifying the population the reference range applies to. (Strength=Example)Observation Reference Range A...?? »The age at which this reference range is applicable. This is a neonatal age (e.g. number of weeks at term) if the meaning says soage : Range [0..1]Text based reference range in an observation which may be used when a quantitative range is not appropriate for an observation. An example would be a reference value of "Negative" or a list or table of 'normals'text : string [0..1]ComponentDescribes what was observed. Sometimes this is called the observation "code"code : CodeableConcept [1..1] « Codes identifying names of simple observations. (Strength=Example)LOINC ?? »The information determined as a result of making the observation, if the information has a simple valuevalue[x] : Type [0..1] « Quantity|CodeableConcept|string|boolean| integer|Range|Ratio|SampledData|time|dateTime|Period »Provides a reason why the expected value in the element Observation.component.value[x] is missingdataAbsentReason : CodeableConcept [0..1] « Codes specifying why the result (Observation.value[x]) is missing. (Strength=Extensible)Observation Value Absent Reas...+ »The assessment made based on the result of the observation. Intended as a simple compact code often placed adjacent to the result value in reports and flow sheets to signal the meaning/normalcy status of the result. Otherwise known as abnormal flaginterpretation : CodeableConcept [0..1] « Codes identifying interpretations of observations. (Strength=Extensible)Observation Interpretation + »Guidance on how to interpret the value by comparison to a normal or recommended rangereferenceRange[0..*]Guidance on how to interpret the value by comparison to a normal or recommended rangereferenceRange[0..*]Some observations have multiple component observations. These component observations are expressed as separate code value pairs that share the same attributes. Examples include systolic and diastolic component observations for blood pressure measurement and multiple component observations for genetics observationscomponent[0..*]

XML Template

<Observation xmlns="http://hl7.org/fhir"> doco
 <!-- from Resource: id, meta, implicitRules, and language -->
 <!-- from DomainResource: text, contained, extension, and modifierExtension -->
 <identifier><!-- 0..* Identifier Business Identifier for observation --></identifier>
 <basedOn><!-- 0..* Reference(CarePlan|DeviceRequest|ImmunizationRecommendation|
   MedicationRequest|NutritionOrder|ServiceRequest) Fulfills plan, proposal or order --></basedOn>
 <partOf><!-- 0..* Reference(MedicationAdministration|MedicationDispense|
   MedicationStatement|Procedure|Immunization|ImagingStudy) Part of referenced event --></partOf>
 <status value="[code]"/><!-- 1..1 registered | preliminary | final | amended + -->
 <category><!-- 0..* CodeableConcept Classification of  type of observation --></category>
 <code><!-- 1..1 CodeableConcept Type of observation (code / type) --></code>
 <subject><!-- 0..1 Reference(Patient|Group|Device|Location) Who and/or what this is about --></subject>
 <context><!-- 0..1 Reference(Encounter|EpisodeOfCare) Healthcare event during which this observation is made --></context>
 <effective[x]><!-- 0..1 dateTime|Period|Timing Clinically relevant time/time-period for observation --></effective[x]>
 <issued value="[instant]"/><!-- 0..1 Date/Time this version was made available -->
 <performer><!-- 0..* Reference(Practitioner|PractitionerRole|Organization|
   CareTeam|Patient|RelatedPerson) Who is responsible for the observation --></performer>
 <value[x]><!-- ?? 0..1 Quantity|CodeableConcept|string|boolean|integer|Range|Ratio|
   SampledData|time|dateTime|Period Actual result --></value[x]>
 <dataAbsentReason><!-- ?? 0..1 CodeableConcept Why the result is missing --></dataAbsentReason>
 <interpretation><!-- 0..1 CodeableConcept High, low, normal, etc. --></interpretation>
 <comment value="[string]"/><!-- 0..1 Comments about result -->
 <bodySite><!-- 0..1 CodeableConcept Observed body part --></bodySite>
 <method><!-- 0..1 CodeableConcept How it was done --></method>
 <specimen><!-- 0..1 Reference(Specimen) Specimen used for this observation --></specimen>
 <device><!-- 0..1 Reference(Device|DeviceComponent|DeviceMetric) (Measurement) Device --></device>
 <referenceRange>  <!-- 0..* Provides guide for interpretation -->
  <low><!-- ?? 0..1 Quantity(SimpleQuantity) Low Range, if relevant --></low>
  <high><!-- ?? 0..1 Quantity(SimpleQuantity) High Range, if relevant --></high>
  <type><!-- 0..1 CodeableConcept Reference range qualifier --></type>
  <appliesTo><!-- 0..* CodeableConcept Reference range population --></appliesTo>
  <age><!-- 0..1 Range Applicable age range, if relevant --></age>
  <text value="[string]"/><!-- 0..1 Text based reference range in an observation -->
 </referenceRange>
 <hasMember><!-- 0..* Reference(Observation|QuestionnaireResponse|Sequence) Related resource that belongs to the Observation group --></hasMember>
 <derivedFrom><!-- 0..* Reference(DocumentReference|ImagingStudy|Media|
   QuestionnaireResponse|Observation|Sequence) Related measurements the observation is made from --></derivedFrom>
 <component>  <!-- 0..* Component results -->
  <code><!-- 1..1 CodeableConcept Type of component observation (code / type) --></code>
  <value[x]><!-- 0..1 Quantity|CodeableConcept|string|boolean|integer|Range|
    Ratio|SampledData|time|dateTime|Period Actual component result --></value[x]>
  <dataAbsentReason><!-- ?? 0..1 CodeableConcept Why the component result is missing --></dataAbsentReason>
  <interpretation><!-- 0..1 CodeableConcept High, low, normal, etc. --></interpretation>
  <referenceRange><!-- 0..* Content as for Observation.referenceRange Provides guide for interpretation of component result --></referenceRange>
 </component>
</Observation>

JSON Template

{doco
  "resourceType" : "Observation",
  // from Resource: id, meta, implicitRules, and language
  // from DomainResource: text, contained, extension, and modifierExtension
  "identifier" : [{ Identifier }], // Business Identifier for observation
  "basedOn" : [{ Reference(CarePlan|DeviceRequest|ImmunizationRecommendation|
   MedicationRequest|NutritionOrder|ServiceRequest) }], // Fulfills plan, proposal or order
  "partOf" : [{ Reference(MedicationAdministration|MedicationDispense|
   MedicationStatement|Procedure|Immunization|ImagingStudy) }], // Part of referenced event
  "status" : "<code>", // R!  registered | preliminary | final | amended +
  "category" : [{ CodeableConcept }], // Classification of  type of observation
  "code" : { CodeableConcept }, // R!  Type of observation (code / type)
  "subject" : { Reference(Patient|Group|Device|Location) }, // Who and/or what this is about
  "context" : { Reference(Encounter|EpisodeOfCare) }, // Healthcare event during which this observation is made
  // effective[x]: Clinically relevant time/time-period for observation. One of these 3:
  "effectiveDateTime" : "<dateTime>",
  "effectivePeriod" : { Period },
  "effectiveTiming" : { Timing },
  "issued" : "<instant>", // Date/Time this version was made available
  "performer" : [{ Reference(Practitioner|PractitionerRole|Organization|
   CareTeam|Patient|RelatedPerson) }], // Who is responsible for the observation
  // value[x]: Actual result. One of these 11:
  "valueQuantity" : { Quantity },
  "valueCodeableConcept" : { CodeableConcept },
  "valueString" : "<string>",
  "valueBoolean" : <boolean>,
  "valueInteger" : <integer>,
  "valueRange" : { Range },
  "valueRatio" : { Ratio },
  "valueSampledData" : { SampledData },
  "valueTime" : "<time>",
  "valueDateTime" : "<dateTime>",
  "valuePeriod" : { Period },
  "dataAbsentReason" : { CodeableConcept }, // C? Why the result is missing
  "interpretation" : { CodeableConcept }, // High, low, normal, etc.
  "comment" : "<string>", // Comments about result
  "bodySite" : { CodeableConcept }, // Observed body part
  "method" : { CodeableConcept }, // How it was done
  "specimen" : { Reference(Specimen) }, // Specimen used for this observation
  "device" : { Reference(Device|DeviceComponent|DeviceMetric) }, // (Measurement) Device
  "referenceRange" : [{ // Provides guide for interpretation
    "low" : { Quantity(SimpleQuantity) }, // C? Low Range, if relevant
    "high" : { Quantity(SimpleQuantity) }, // C? High Range, if relevant
    "type" : { CodeableConcept }, // Reference range qualifier
    "appliesTo" : [{ CodeableConcept }], // Reference range population
    "age" : { Range }, // Applicable age range, if relevant
    "text" : "<string>" // Text based reference range in an observation
  }],
  "hasMember" : [{ Reference(Observation|QuestionnaireResponse|Sequence) }], // Related resource that belongs to the Observation group
  "derivedFrom" : [{ Reference(DocumentReference|ImagingStudy|Media|
   QuestionnaireResponse|Observation|Sequence) }], // Related measurements the observation is made from
  "component" : [{ // Component results
    "code" : { CodeableConcept }, // R!  Type of component observation (code / type)
    // value[x]: Actual component result. One of these 11:
    "valueQuantity" : { Quantity },
    "valueCodeableConcept" : { CodeableConcept },
    "valueString" : "<string>",
    "valueBoolean" : <boolean>,
    "valueInteger" : <integer>,
    "valueRange" : { Range },
    "valueRatio" : { Ratio },
    "valueSampledData" : { SampledData },
    "valueTime" : "<time>",
    "valueDateTime" : "<dateTime>",
    "valuePeriod" : { Period },
    "dataAbsentReason" : { CodeableConcept }, // C? Why the component result is missing
    "interpretation" : { CodeableConcept }, // High, low, normal, etc.
    "referenceRange" : [{ Content as for Observation.referenceRange }] // Provides guide for interpretation of component result
  }]
}

Turtle Template

@prefix fhir: <http://hl7.org/fhir/> .doco


[ a fhir:Observation;
  fhir:nodeRole fhir:treeRoot; # if this is the parser root

  # from Resource: .id, .meta, .implicitRules, and .language
  # from DomainResource: .text, .contained, .extension, and .modifierExtension
  fhir:Observation.identifier [ Identifier ], ... ; # 0..* Business Identifier for observation
  fhir:Observation.basedOn [ Reference(CarePlan|DeviceRequest|ImmunizationRecommendation|MedicationRequest|
  NutritionOrder|ServiceRequest) ], ... ; # 0..* Fulfills plan, proposal or order
  fhir:Observation.partOf [ Reference(MedicationAdministration|MedicationDispense|MedicationStatement|Procedure|
  Immunization|ImagingStudy) ], ... ; # 0..* Part of referenced event
  fhir:Observation.status [ code ]; # 1..1 registered | preliminary | final | amended +
  fhir:Observation.category [ CodeableConcept ], ... ; # 0..* Classification of  type of observation
  fhir:Observation.code [ CodeableConcept ]; # 1..1 Type of observation (code / type)
  fhir:Observation.subject [ Reference(Patient|Group|Device|Location) ]; # 0..1 Who and/or what this is about
  fhir:Observation.context [ Reference(Encounter|EpisodeOfCare) ]; # 0..1 Healthcare event during which this observation is made
  # Observation.effective[x] : 0..1 Clinically relevant time/time-period for observation. One of these 3
    fhir:Observation.effectiveDateTime [ dateTime ]
    fhir:Observation.effectivePeriod [ Period ]
    fhir:Observation.effectiveTiming [ Timing ]
  fhir:Observation.issued [ instant ]; # 0..1 Date/Time this version was made available
  fhir:Observation.performer [ Reference(Practitioner|PractitionerRole|Organization|CareTeam|Patient|RelatedPerson) ], ... ; # 0..* Who is responsible for the observation
  # Observation.value[x] : 0..1 Actual result. One of these 11
    fhir:Observation.valueQuantity [ Quantity ]
    fhir:Observation.valueCodeableConcept [ CodeableConcept ]
    fhir:Observation.valueString [ string ]
    fhir:Observation.valueBoolean [ boolean ]
    fhir:Observation.valueInteger [ integer ]
    fhir:Observation.valueRange [ Range ]
    fhir:Observation.valueRatio [ Ratio ]
    fhir:Observation.valueSampledData [ SampledData ]
    fhir:Observation.valueTime [ time ]
    fhir:Observation.valueDateTime [ dateTime ]
    fhir:Observation.valuePeriod [ Period ]
  fhir:Observation.dataAbsentReason [ CodeableConcept ]; # 0..1 Why the result is missing
  fhir:Observation.interpretation [ CodeableConcept ]; # 0..1 High, low, normal, etc.
  fhir:Observation.comment [ string ]; # 0..1 Comments about result
  fhir:Observation.bodySite [ CodeableConcept ]; # 0..1 Observed body part
  fhir:Observation.method [ CodeableConcept ]; # 0..1 How it was done
  fhir:Observation.specimen [ Reference(Specimen) ]; # 0..1 Specimen used for this observation
  fhir:Observation.device [ Reference(Device|DeviceComponent|DeviceMetric) ]; # 0..1 (Measurement) Device
  fhir:Observation.referenceRange [ # 0..* Provides guide for interpretation
    fhir:Observation.referenceRange.low [ Quantity(SimpleQuantity) ]; # 0..1 Low Range, if relevant
    fhir:Observation.referenceRange.high [ Quantity(SimpleQuantity) ]; # 0..1 High Range, if relevant
    fhir:Observation.referenceRange.type [ CodeableConcept ]; # 0..1 Reference range qualifier
    fhir:Observation.referenceRange.appliesTo [ CodeableConcept ], ... ; # 0..* Reference range population
    fhir:Observation.referenceRange.age [ Range ]; # 0..1 Applicable age range, if relevant
    fhir:Observation.referenceRange.text [ string ]; # 0..1 Text based reference range in an observation
  ], ...;
  fhir:Observation.hasMember [ Reference(Observation|QuestionnaireResponse|Sequence) ], ... ; # 0..* Related resource that belongs to the Observation group
  fhir:Observation.derivedFrom [ Reference(DocumentReference|ImagingStudy|Media|QuestionnaireResponse|Observation|Sequence) ], ... ; # 0..* Related measurements the observation is made from
  fhir:Observation.component [ # 0..* Component results
    fhir:Observation.component.code [ CodeableConcept ]; # 1..1 Type of component observation (code / type)
    # Observation.component.value[x] : 0..1 Actual component result. One of these 11
      fhir:Observation.component.valueQuantity [ Quantity ]
      fhir:Observation.component.valueCodeableConcept [ CodeableConcept ]
      fhir:Observation.component.valueString [ string ]
      fhir:Observation.component.valueBoolean [ boolean ]
      fhir:Observation.component.valueInteger [ integer ]
      fhir:Observation.component.valueRange [ Range ]
      fhir:Observation.component.valueRatio [ Ratio ]
      fhir:Observation.component.valueSampledData [ SampledData ]
      fhir:Observation.component.valueTime [ time ]
      fhir:Observation.component.valueDateTime [ dateTime ]
      fhir:Observation.component.valuePeriod [ Period ]
    fhir:Observation.component.dataAbsentReason [ CodeableConcept ]; # 0..1 Why the component result is missing
    fhir:Observation.component.interpretation [ CodeableConcept ]; # 0..1 High, low, normal, etc.
    fhir:Observation.component.referenceRange [ See Observation.referenceRange ], ... ; # 0..* Provides guide for interpretation of component result
  ], ...;
]

Changes since DSTU2

Observation
Observation.basedOn
  • Added Element
Observation.partOf
  • Added Element
Observation.category
  • Max Cardinality changed from 1 to *
Observation.context
  • Renamed from encounter to context
  • Add Reference(EpisodeOfCare)
Observation.effective[x]
  • Add Timing
Observation.performer
  • Add Reference(PractitionerRole), Add Reference(CareTeam)
Observation.value[x]
  • Remove Attachment, Add boolean, Add integer
Observation.comment
  • Renamed from comments to comment
Observation.device
  • Add Reference(DeviceComponent)
Observation.referenceRange.type
  • Added Element
Observation.referenceRange.appliesTo
  • Renamed from meaning to appliesTo
  • Max Cardinality changed from 1 to *
Observation.hasMember
  • Added Element
Observation.derivedFrom
  • Added Element
Observation.component.value[x]
  • Remove Attachment, Add boolean, Add integer
Observation.component.interpretation
  • Added Element
Observation.related
  • deleted

See the Full Difference for further information

This analysis is available as XML or JSON.

See R2 <--> R3 Conversion Maps (status = 34 tests that all execute ok. All tests pass round-trip testing and 15 r3 resources are invalid (58 errors).).

 

Alternate definitions: Master Definition (XML, JSON), XML Schema/Schematron + JSON Schema, ShEx (for Turtle) + see the extensions & the dependency analysis

PathDefinitionTypeReference
Observation.status Codes providing the status of an observation.RequiredObservationStatus
Observation.category Codes for high level observation categories.PreferredObservation Category Codes
Observation.code
Observation.component.code
Codes identifying names of simple observations.ExampleLOINC Codes
Observation.dataAbsentReason
Observation.component.dataAbsentReason
Codes specifying why the result (Observation.value[x]) is missing.ExtensibleObservation Value Absent Reason
Observation.interpretation
Observation.component.interpretation
Codes identifying interpretations of observations.ExtensibleObservation Interpretation Codes
Observation.bodySite Codes describing anatomical locations. May include laterality.ExampleSNOMED CT Body Structures
Observation.method Methods for simple observations.ExampleObservation Methods
Observation.referenceRange.type Code for the meaning of a reference range.ExtensibleObservation Reference Range Meaning Codes
Observation.referenceRange.appliesTo Codes identifying the population the reference range applies to.ExampleObservation Reference Range Applies To Codes

  • obs-3: On Observation.referenceRange: Must have at least a low or a high or text (expression on Observation.referenceRange: low.exists() or high.exists() or text.exists())
  • obs-6: dataAbsentReason SHALL only be present if Observation.value[x] is not present (expression : dataAbsentReason.empty() or value.empty())
  • obs-7: If Observation.code is the same as a Observation.component.code then the value element associated with the code SHALL NOT be present (expression : value.empty() or component.code.where( (coding.code = %resource.code.coding.code) and (coding.system = %resource.code.coding.system)).empty())

At its simplest, a resource instances can consist of only a code and a value, and status flag. The relevance of other properties will vary based on the type of observation.

Profiles will be created to provide guidance on capturing certain types of simple observations. This resource focuses on the level of detail captured by most systems. However, any "simple" observation can easily be broken into numerous components and sub-components to provide additional information relevant in certain circumstances. As with other resources, extensions can be used to introduce this additional complexity.

Many observations have important relationships to other observations and need to be grouped together. These structures have been defined to do this: DiagnosticReport and DiagnosticReport.result, Observation and the elements: Observation.component, Observation.hasMember and Observation.derivedFrom. The sections below provides guidance around which structure to use. Because the idea of what to group together is often highly contextual and based upon the end user's point of view, the choice of which structure to use will be driven by jurisdiction, organizational practice and context. Profiling will normally be necessary for implementation.

DiagnosticReport relates directly to an order (ServiceRequest). The DiagnosticReport.code names the panel and serves as the grouping element, which is traditionally referred to as a "panel" or "battery" by laboratories. The DiagnosticReport.result element references the individual observations. Several examples demonstrate observation grouping using DiagnosticReport as the grouping structure.

Observation.component is used for any supporting result that cannot reasonably be interpreted and used outside the scope of the Observation it is a component of. Components should only be used when there is only one method, one observation, one performer, one device, and one time. Some use cases for using this structure include:

  1. Observations that are commonly produced and interpreted together. For example, systolic and diastolic blood pressure are represented as a single Blood pressure panel.
  2. Assessment tool results that are commonly produced and interpreted together. For example, a newborn Apgar score that is a single Observation with five components.
  3. Representing multiple answers to a question (relationship and boundaries between Observation and Questionnaire/QuestionnaireResponse). For example, reporting the types of alcohol consumed by a patient

On the other hand, any observations that are clinically relevant outside the context of being a component of another observation should be represented by separate Observation resources. For example a Body Mass Index (BMI) Observation should not contain components for height and weight because they are clinically relevant observations on their own and should be represented by separate Observation resources. See the Observation.related section below on how to relate independent Observations.

Note that the component.code may in some cases only be able to be understood in relation to the Observation.code (for example, see the $stats operation).

Observation.hasMember and Observation.derivedFrom and the core extensions: Observation-sequel-to and Observation-replaces are used for any supporting result that can be interpreted and used on its own and has one or more different values for method, observation, performer, device, time, and/or error conditions. Two common use cases for using this structure are:

  1. For grouping related observations as a "panel"or "battery". In this case the Observation.code represents the "panel" code, typically Observation.value[x] is not present, and the set of member Observations are listed in Observation.hasMember. This structure permits nested grouping when used with DiagnosticReport (e.g. complex micro isolate and sensitivities report).
  2. When linking to other Observations from which an Observation is derived. In this case both Observation.code and Observation.value[x] are present, and the linked observations are listed in Observation.derivedFrom. An example of this would be a Body Mass Index (BMI) Observation where the height and weight measurements are referenced.

When a result value is a represented as a predefined concept using a code, valueCodeableConcept is used. This element is bound to a value set comprised of a standard nomenclature such as SNOMED CT or a source system ("local") coded result values.

Results may be coded in multiple value sets based on different code systems and these may be mapped using the ConceptMap resource and/or given as translations directly in the element as shown in the example below.

For example the LOINC 43304-5 Chlamydia trachomatis rRNA [Presence] in Unspecified specimen by Probe and target amplification method is typically associated with coded presence/absence concepts. Using the coded value for 'negative' with a standard code translation, valueCodeableConcept would be:


	"valueCodeableConcept": {
		"coding": [
			{
				"system": "http://snomed.info/sct",
				"code": "260385009",
				"display": "Negative"
			}, {
				"system": "https://acme.lab/resultcodes",
				"code": "NEG",
				"display": "Negative"
			}
		],
		"text": "Negative for Chlamydia Trachomatis rRNA"
	}

	

When the data element is usually coded or the type associated with the code element defines a coded value, use valueCodeableConcept even if there is no appropriate code and only un-coded text is available. For example using text only, the valueCodeableConcept element would be:


	"valueCodeableConcept": {
		"text": "uncoded free text result"
	}

			

When a coded answer list includes a concept code for "other" and there is a free text description of the concept, the valueCodeableConcept.text element should be used to capture the full meaning of the source. In the example below, the answer code "Other" is provided in the valueCodeableConcept element and the text value supplied value in the CodeableConcept.text element.

{
	"resourceType": "Observation",
	... snip ...
	"code": {
		"coding": [
			{
				"system": "http://loinc.org",
				"code": "74076-1",
				"display": "Medication or substance involved"
			}
		]
	},
	.. snip ...
	"valueCodeableConcept": {
		"coding": [
			{
				"system": "http://loinc.org",
				"code": " LA20343-2",
				"display": "Other substance: PLEASE SPECIFY"
			}
		],
		"text": "Other: Blue pills I found under my couch"
	}
	.. snip ...
}
	   

A recurring issue for many observation events, regardless of the particular pattern, is determining how to populate observation.code and observation.value. While this is typically straight-forward for laboratory observations, it can get blurry for other types of observations, such as findings and disorders, family history observations, etc. This discussion focuses on the way in which the coded representation of such statements is expressed using the Observation.code and Observation.value elements.

There are two distinct facets that are central to a FHIR Observations:

  • The action taken to make the finding and/or the property about which the property was observed. For example: measurement of blood hemoglobin.
  • The result of the observation. For example: 14 g/dl.

Several different ways of representing the same information exist using different combinations of the Observation.code and Observation.value. Unconstrained use of the alternatives presents a major challenge for computation of semantic equivalence and for safe interpretation of observations originating from different applications and users. The following four patterns could reasonably represent the same case:

  1. Observation.code represents the nature of the observation and the Observation.value a code represents the non-numeric result value. These are two distinct facets that are central to a FHIR Observations. For example:
    • code=[Examination]
    • value=[Abdomen tender]
  2. Observation.code is nearly identical to 1) above, but the level of granularity is shifted from the value to code. For example:
    • code=[Abdominal examination]
    • value=[Tenderness]
  3. The Observation.code is also expressed in a way that does not specify the observation action, but indicates a statement about findings reduced to a single name (or term), as in the above item. In this example, the Observation.value is present and "qualifies" the finding typically confirming or refuting it. For example::
    • code=[Abdominal tenderness]
    • value=[found/true]
  4. in this example the Observation.code is expressed in a way that does not specify the observation action, but indicates a statement about findings reduced to a single name (or term). In this particular example in that context, the Observation.value is omitted. For example:
    • code=[Abdominal tenderness]
    • value element is omitted
  1. Recommended rules for case 1 and 2 patterns:
    • The Observation.code is preferably a LOINC concept code.
      • If a SNOMED CT concept code is used, the expression SHOULD represent a 363787002 (Observable entity(Observable entity)) or 386053000 (Evaluation procedure(evaluation procedure))
    • For non-numeric values, the Observation.value is preferably a SNOMED CT concept code.
  2. Recommended rules for case 3 pattern:
    • The Observation.code is preferably a SNOMED CT concept code where the concept is-a 404684003 (Clinical finding (finding)) , 413350009 (Finding with explicit context(finding)), or 272379006 (Event(event)).
    • The Observation.value is represented by either
  3. Recommended rules for case 4 pattern:
    • The Observation.code is preferably a SNOMED CT concept code where the concept is-a 404684003 (Clinical finding (finding)) , 413350009 (Finding with explicit context(finding)), or 272379006 (Event(event)).
    • The Observation.value is omitted. The default interpretation is the the concept (single code or expression) represented in Observation.code is present in the patient. A Observation.dataAbsentReason value of 'clinical-finding' SHOULD be used to indicate why the expected value is missing.
  4. SHOULD NOT use the Assertion pattern as described in HL7 Version 3 Implementation Guide: TermInfo - Using SNOMED CT in CDA R2 Models, Release 1 . ( The code is 'ASSERTION' and the value is a SNOMED CT concept or expression )
  • The element, Observation.value[x], has a variable name depending on the type as follows:
    • valueQuantity
    • valueCodeableConcept
    • valueString
    • valueBoolean
    • valueInteger
    • valueRange
    • valueRatio
    • valueSampledData
    • valueTime
    • valueDateTime
    • valuePeriod

  • See above section on Using codes for result values
  • The Boolean data type is rarely used for value[x] because most observations result values are never truly Boolean due to exceptional values such as "unknown", therefore they should use the CodeableConcept data type instead and select codes from http://hl7.org/fhir/ValueSet/v2-0136 (these "yes/no" concepts can be mapped to the display name "true/false" or other mutually exclusive terms that may be needed")
  • The special values "E" (error), "L" (below detection limit) and "U" (above detection limit) can be used are in the SampledData data type. However when using valueQuantity in an observation for above and below detection limit values, valueQuantity should be used by stating the limit along with the comparator. In addition, when there is an error the dataAbsentReason element should be used with the appropriate value ('error' or 'NaN'). For example if the value was below the lower limit of detection of <2.0 mmol/L the valueQuantity would be:
    	"valueQuantity": {
    		"value": 2.0,
    		"comparator": "<",
    		"unit": "mmol/l",
    		"system": "http://unitsofmeasure.org",
    		"code": "mmol/L"
    	}
    
    If the value was "NaN" (i.e. an error) the valueCodeableConcept element would be absent and dataAbsentReason element would be:
    	"dataAbsentReason": {
    		"coding": [
    			{
    				"system": "http://hl7.org/fhir/data-absent-reason",
    				"code": "NaN",
    				"display": "Not a Number"
    			}
    		]
    	}
    	
  • Because there are multiple types allowed for the value element, multiple value search parameters are defined. There is no standard parameter for searching values of type Ratio

The effectiveDateTime or effectivePeriod is the time that the observation is most relevant as an observation of the subject. For a biological subject (e.g. a human patient), this is the physiologically relevant time of the observation. In the case of an observation using a specimen, this represents the start and end of the specimen collection (e.g. 24 hour Urine Sodium), but if the collection time is sufficiently short, this is reported as a point in time value (e.g. normal venipuncture). In the case of an observation obtained directly from a subject (e.g. BP, Chest X-ray), this is the start and end time of the observation process, which again, is often reported as a single point in time.

Most common observations will only have one generic reference range. Reference ranges may be useful for lab tests and other measures like systolic blood pressure, but will have little relevance for something like "pregnancy status". Systems MAY choose to restrict to only supplying the relevant reference range based on knowledge about the patient (e.g. specific to the patient's age, gender, weight and other factors), but this might not be possible or appropriate. Whenever more than one reference range is supplied, the differences between them SHOULD be provided in the reference range and/or age properties.

If a measurement or test could not be completed (for example if the specimen is unsatisfactory or the provider cancelled the order), then the status value should be updated to "cancelled" and the specific details given - preferably as coded values in the dataAbsentReason or valueCodeableConcept element. Additional information may be provided in comments as well. The specimen reject example demonstrates this using a coded value for unsatisfactory specimen in dataAbsentReason.

Genetic reporting makes heavy use of the DiagnosticReport and Observation resources. A set of profiles have been defined for representing genetic results that can be found here.

The Clinical Genomics workgroup is currently exploring a couple of alternatives that are less dependent on extensions

  • The Harvard (Tangram) proposal is published as a customized version of the HL7 FHIR specification and provides a set of interrelated composable profiles
  • The NLM (genomics2) proposal is published as a FHIR implementation guide an approach that aligns with HL7's v2 clinical genomics implementation guide

These proposals are under active discussion within the Clinical Genomics WorkGroup . Feedback on these proposals can be provided to the workgroup by joining and posting to their list server, participating in a conference call or emailing the co-chairs.

The lastn query operation meets the common need for searching for the most recent or "last known" Observations for a subject. Examples where this query could be used:

  • Fetch the last 5 temperatures for a patient to view trends
  • Get the most recent lab results for patient
  • Fetch the last 3 results for all vitals for a patient

See the Last N Observations Query section in the Observation resource operations page for more information and examples

The stats operation performs a set of statistical calculations on a set of clinical measurements such as a blood pressure as stored on the server. This operation is focused on Observation resources with valueQuantity elements that have UCUM unit codes. Examples where this operation could be used:

  • Get the average, min, max and count of a series of BP measurements for a patient
  • Determine 20th or 80th percentile on a set of measurements over a time period
See the Observation Statistics section in the Observation resource operations page for more information and examples

Search parameters for this resource. The common parameters also apply. See Searching for more information about searching in REST, messaging, and services.

NameTypeDescriptionExpressionIn Common
based-onreferenceReference to the service request.Observation.basedOn
(CarePlan, MedicationRequest, NutritionOrder, DeviceRequest, ServiceRequest, ImmunizationRecommendation)
categorytokenThe classification of the type of observationObservation.category
codetokenThe code of the observation typeObservation.code8 Resources
code-value-conceptcompositeCode and coded value parameter pairObservation
code-value-datecompositeCode and date/time value parameter pairObservation
code-value-quantitycompositeCode and quantity value parameter pairObservation
code-value-stringcompositeCode and string value parameter pairObservation
combo-codetokenThe code of the observation type or component typeObservation.code | Observation.component.code
combo-code-value-conceptcompositeCode and coded value parameter pair, including in componentsObservation | Observation.component
combo-code-value-quantitycompositeCode and quantity value parameter pair, including in componentsObservation | Observation.component
combo-data-absent-reasontokenThe reason why the expected value in the element Observation.value[x] or Observation.component.value[x] is missing.Observation.dataAbsentReason | Observation.component.dataAbsentReason
combo-value-concepttokenThe value or component value of the observation, if the value is a CodeableConceptObservation.value.as(CodeableConcept) | Observation.component.value.as(CodeableConcept)
combo-value-quantityquantityThe value or component value of the observation, if the value is a Quantity, or a SampledData (just search on the bounds of the values in sampled data)Observation.value.as(Quantity) | Observation.component.value.as(Quantity)
component-codetokenThe component code of the observation typeObservation.component.code
component-code-value-conceptcompositeComponent code and component coded value parameter pairObservation.component
component-code-value-quantitycompositeComponent code and component quantity value parameter pairObservation.component
component-data-absent-reasontokenThe reason why the expected value in the element Observation.component.value[x] is missing.Observation.component.dataAbsentReason
component-value-concepttokenThe value of the component observation, if the value is a CodeableConceptObservation.component.value.as(CodeableConcept)
component-value-quantityquantityThe value of the component observation, if the value is a Quantity, or a SampledData (just search on the bounds of the values in sampled data)Observation.component.value.as(Quantity)
contextreferenceHealthcare event (Episode-of-care or Encounter) related to the observationObservation.context
(EpisodeOfCare, Encounter)
data-absent-reasontokenThe reason why the expected value in the element Observation.value[x] is missing.Observation.dataAbsentReason
datedateObtained date/time. If the obtained element is a period, a date that falls in the periodObservation.effective17 Resources
derived-fromreferenceRelated measurements the observation is made fromObservation.derivedFrom
(Media, Observation, ImagingStudy, Sequence, QuestionnaireResponse, DocumentReference)
devicereferenceThe Device that generated the observation data.Observation.device
(DeviceComponent, Device, DeviceMetric)
encounterreferenceEncounter related to the observationObservation.context
(Encounter)
12 Resources
has-memberreferenceRelated resource that belongs to the Observation groupObservation.hasMember
(Observation, Sequence, QuestionnaireResponse)
identifiertokenThe unique id for a particular observationObservation.identifier26 Resources
methodtokenThe method used for the observationObservation.method
part-ofreferencePart of referenced eventObservation.partOf
(Immunization, MedicationDispense, MedicationAdministration, Procedure, ImagingStudy, MedicationStatement)
patientreferenceThe subject that the observation is about (if patient)Observation.subject
(Patient)
29 Resources
performerreferenceWho performed the observationObservation.performer
(Practitioner, Organization, CareTeam, Patient, PractitionerRole, RelatedPerson)
specimenreferenceSpecimen used for this observationObservation.specimen
(Specimen)
statustokenThe status of the observationObservation.status
subjectreferenceThe subject that the observation is aboutObservation.subject
(Group, Device, Patient, Location)
value-concepttokenThe value of the observation, if the value is a CodeableConceptObservation.value.as(CodeableConcept)
value-datedateThe value of the observation, if the value is a date or period of timeObservation.value.as(dateTime) | Observation.value.as(Period)
value-quantityquantityThe value of the observation, if the value is a Quantity, or a SampledData (just search on the bounds of the values in sampled data)Observation.value.as(Quantity)
value-stringstringThe value of the observation, if the value is a string, and also searches in CodeableConcept.textObservation.value.as(string)