Skip to content

Risk Assessment Profile

Canonical../StructureDefinition/nexus-emr-core-riskassessment
Statusdraft (experimental) · 1.26.0
BaseRiskAssessment (constraint)
SourceFSH · JSON

Nexus EMR profile for RiskAssessment -- computed clinical risk scores. First pass: status, method, predictions (outcome + probability + qualitative band), basis. Closed to SMART apps pending an exposure decision.

Overview

Overview

The Nexus EMR Core RiskAssessment profile carries computed clinical risk scores -- 10-year cardiovascular risk, fracture risk, and the like. A risk score is not an observation of the patient: it is the output of a calculation over observations, which is why it carries the inputs it used (basis) alongside the number it produced.

This is a first pass: status, which score was run, the predictions, and the basis. The score-method vocabulary is not fixed, mitigation is unmodelled, and whether an AI-computed score carries authorship markers on this resource or only on its Provenance is not yet decided -- treat Provenance as the place to look today. Do not treat any of those three as a contract. The profile is closed to SMART apps pending an exposure decision.

The score lives in prediction

prediction is 0..*, and each entry holds up to three parts:

  • prediction.outcome (0..1) -- what is being predicted ("10-year cardiovascular event").
  • prediction.probabilityDecimal (0..1) -- the numeric score as a probability in [0,1].
  • prediction.qualitativeRisk (0..1) -- the display band, bound extensible to http://hl7.org/fhir/ValueSet/risk-probability (low | moderate | high).

The probability is the trap: a 14% ten-year risk is 0.14, not 14. A consumer rendering a percentage must multiply, and a producer converting from a calculator that reports percentages must divide. Nothing in the profile can catch a value that is a hundred times too large but still plausible.

qualitativeRisk is extensible rather than required because local calculators use their own band labels; carry the standard code where it maps and the local wording in text.

method is text-first, so do not branch on its coding

method is 0..1 and its vocabulary is deliberately open in this pass: named scores (Framingham, QRISK and their relatives) have no agreed coding here yet, so the score's identity rides as method.text. Consumers must not key logic off method.coding -- there is no guarantee a coding is present, and current values are not stable enough to switch on. Match on method.text only if you accept that the strings may change.

status (1..1) follows the observation-style lifecycle (registered | preliminary | final | amended | ... | entered-in-error). subject is 1..1 and only Reference(NexusEmrCorePatient). occurrenceDateTime (0..1) is when the score was computed and is the declared effective date.

Context: condition and basis

condition (0..1, only Reference(NexusEmrCoreCondition)) names the condition the assessment is about, when there is one -- many general risk scores have none, so its absence is normal.

basis (0..*) points at what went into the calculation: the Observations and Conditions the score consumed. It is optional, so a score can arrive with its inputs unstated; when it is populated it is the only way a reader can tell whether a score is stale relative to newer measurements.

See RiskAssessment/nexus-emr-riskassessment-example for a worked instance.

Terminology bindings

Path Strength Value set
RiskAssessment.prediction.qualitativeRisk extensible risk-probability