Risk Assessment Profile¶
| Canonical | ../StructureDefinition/nexus-emr-core-riskassessment |
|---|---|
| Status | draft (experimental) · 1.26.0 |
| Base | RiskAssessment (constraint) |
| Source | FSH · 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 tohttp://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 |