Phoenix Sepsis EHR Implementation Notes
THIS IS A WORK IN PROGRESS
Source:vignettes/articles/ehr_implementation_notes.Rmd
ehr_implementation_notes.RmdThe Phoenix criteria for pediatric sepsis and septic shock were developed using an international data set of pediatric emergency department and hospital encounters by predicting encounter mortality among those with suspected infection using organ dysfunction-based data from the first 24 hours of the encounter. Please see the original manuscripts for details. (Sanchez-Pinto et al. 2024; Schlapbach et al. 2024).
The purpose of this document is to provide details about the expected inputs for the scoring in order to assist EHR implementation. The phoenix R package and Python module, along with the example SQL code assumes that the data have been prepared as expected and returns scores accordingly.
Overview
Here is a quick checklist to summarize how the Phoenix package should be integrated within an EHR. This is to aid understanding and verification; users still need to review all guidance from this full document.
Exclusion Criteria
- Patients still in their original birth hospitalization
- Gestational age less than 37 weeks at encounter start
- Age greater than or equal to 18 years (216 months) at encounter start
Data cleaning and preparation
- Verify all variables in expected unit; convert as necessary. E.g. age in months; lactate in mmol/L, etc.
- As appropriate replace invalid values with NULL; e.g. if age in months > 216 need to consider if should be scoring patient at all.
- No imputation for NULL/invalid values
- Last observation carry forward within appropriate window for each variable - max carry forward is from prior 24 hours.
- Variables not present or not known should be passed in as NULL
Gotchas
- Phoenix package doesn’t calculate mean arterial pressure (MAP); Calculate MAP from SBP and DBP if not directly available; if both cuff and arterial values present, arterial MAP should be used.
- Carefully review requirements of each input value. For example, only calculate SF ratio and pass into Phoenix package when SpO2 <= 97; only calculate and pass in PF ratio when FiO2 value is from the same time as or before the time of PaO2 lab.
- Use last known good value to when calling Phoenix functions.
General Data Formatting Notes
-
NULLvalues are treated as non-score generating criteria. Do not populate null/unknown/not applicable values with estimates or outdated information. - Values outside the ranges mentioned below are treated as
NULL - Before sending data to the package, please verify the data. Some values may provide warnings, others may generate errors. Verify that your code can handle warnings and errors.
- Ideally, both input values and time of the measurement are available so that last observation carried forward logic can be implemented with limits and conditions for age of inputs.
Special Considerations for EHR Data
Phoenix was developed on a retrospective data set which provided the luxury of easily looking backwards in the time within an encounter. When applying the Phoenix criteria to an active encounter there are several things to consider.
Missing values
Missing values at a specific moment in time need to be dealt with in two steps:
Is there a prior known value? If so, and the prior known value is within the lookback window, use the last known value. That is, last-observation-carried-forward with a lookback window.
Consider the missing value to indicate a “healthy” value. If using the R package or the Python module you need not do anything as the functions therein will return zero points in the score for the missing value.
Example: Say we know FiO2 at time T0 and we know lactate at time T0 as well.
| time | FiO2 | Lactate |
|---|---|---|
| T0 | 0.40 | 6.8 |
Later, at times T2 > T1 > T0 the lactate value is updated. As such we might see data like this:
| time | FiO2 | Lactate |
|---|---|---|
| T0 | 0.40 | 6.8 |
| T1 | 7.3 | |
| T2 | 7.1 |
It is important that when calculating the Phoenix score that the missing value for FiO2 at time T1 is handled correctly: The last known value within the lookback window needs to be used. That is: the data would look like:
| time | FiO2 | Lactate |
|---|---|---|
| T0 | 0.40 | 6.8 |
| T1 | 0.40 (Assuming T1 - T0 < 6 hours; NULL Otherwise) | 7.3 |
| T2 | 0.40 (Assuming T2 - T0 < 6 hours; NULL Otherwise) | 7.1 |
If at time T3 FiO2 is updated:
| time | FiO2 | Lactate |
|---|---|---|
| T0 | 0.40 | 6.8 |
| T1 | 0.40 (Assuming T1 - T0 < 6 hours; NULL Otherwise) | 7.3 |
| T2 | 0.40 (Assuming T2 - T0 < 6 hours; NULL Otherwise) | 7.1 |
| T3 | 0.80 (good new value) | 7.1 (Assuming T3 - T2 < 6 hours; NULL Otherwise) |
Inclusion/Exclusion criteria for the Phoenix criteria development study
Inclusion Criteria
- Child < 18 years old
- Suspected infection
Exclusion Criteria
- Patients still in their original birth hospitalization
- Gestational age less than 37 weeks at encounter start
- Age greater than or equal to 18 years (216 months) at encounter start
Suspected Infection
For a patient to have sepsis or septic shock based on the Phoenix criteria, they must have a suspected infection. A patient is considered to have a suspected infection if they have:
- a test for infection ordered, and
- at least two doses of systemic antimicrobial medication(s).
Note that the test, e.g., a blood culture, need only be ordered. Positive/negative test status is not needed.
Systemic antimicrobial medications are any antibiotic, antiviral, or antifungal medication by any of the following routes:
- ASSUMED SYSTEMIC
- ENTERAL
- HEMODIALYSIS
- INTRA-ARTERIAL
- INTRACARDIAC
- INTRADUODENAL
- INTRAGASTRIC
- INTRAILEAL
- INTRAMUSCULAR
- INTRAVASCULAR
- INTRAVENOUS
- INTRAVENOUS BOLUS
- INTRAVENOUS DRIP
- NASOGASTRIC
- ORAL
- OROPHARYNGEAL
- PARENTERAL
- RECTAL
- SUBCUTANEOUS
Other non-systemic routes such as intraocular, nasal, otic, etc. should be excluded.
Example SQL code used for mapping medication routes when developing Phoenix can be found in the project GitHub archive specifically the files: med_route_mapping.sql and clean_up_routes.sql.
General notes for all subscores
Reasonable values for observations and labs used during development of the Phoenix Sepsis Score are documented in file standard_names_and_units.csv within the project GitHub archive.
“Look Back” for each input below indicates the length of time a last value should be carried forward.
Respiratory
Respiratory dysfunction scoring is based on PaO2/FiO2 (PFR), SpO2/FiO2 (SFR), and respiratory support. While the scoring is based on SFR and PFR, it is preferable to use separate SpO2, PaO2, and FiO2 values so data checks can be performed before the score is determined.
Inputs
PaO2: Partial pressure of oxygen in arterial blood
- Units: mmHg
- Expected Values: [0, Inf)
- Caveats:
- Look Back: 6 hours
SpO2: Peripheral oxygen saturation (pulse ox)
- Units: percentage
- Expected Values: [0, 100]
- Expect integer values 0, 1, 2, …, 100
- Caveats: values greater than 97 should not be used for SFR
- Look back: 6 hours
FiO2: Percent inspired oxygen
- Units: not applicable
- Expected Values: [0.21, 1.00]
- expected floating point
- 0.21 is room air
- 1.00 is pure oxygen
- Caveats:
- Look back: 6 hours
PFR: PaO2/FiO2
- Units: mmHg
- Expected Values [0, Inf)
- Expect floating point
- Caveats:
-
PFR is only valid if the time of FiO2 value is the same as, or before, the time of PaO2 value. For example, if FiO2 was reported at 11:31 and PaO2 was reported at 11:45 then the PFR would be valid to use. If the FiO2 is then updated at 11:59, the PaO2 value from 11:45 would not be valid to use in the calculation of the PFR.
* New value
c value carried forwardtime FiO2 PaO2 PFR Note: 11:31 0.30* 11:45 0.30c 118* 393.33 11:47 0.30c 118c 393.33 11:59 0.40* 118c No PFR, FiO2 is newer than PaO2 12:10 0.40c 152* 380 12:15 0.40c 152c 380 17:45 0.40c 152c 380 18:00 152c No PFR, FiO2 carry forward window expired 18:30 No PFR, FiO2 and PaO2 carry forward windows have expired
-
- Look back: implied by the look back on PaO2 and FiO2 and the condition that FiO2 value is the same age or older than the PaO2 value.
SFR: SpO2 / FiO2
- Units: none
- Expected Values: [0, 97/0.21]
- Floating point
- The upper limit includes the limitation on SpO2 ≤ 97
- Caveats:
-
SFR is only valid if the time of FiO2 value is the same as, or before, the time of SpO2 value. For example, if FiO2 was reported at 11:31 and SpO2 was reported at 11:45 then the SFR would be valid to use. If the FiO2 is then updated at 11:59, the SpO2 value from 11:45 would not be valid to use in the calculation of the SFR
* New value
c value carried forwardtime FiO2 SpO2 SFR Note: 10:15 0.25* 92* 368 10:20 0.25c 98* No SFR, SpO2 > 97 11:31 0.30* 98c No SFR, SpO2 > 97 and FiO2 newer than SpO2 11:45 0.30c 87* 290 11:47 0.30c 87c 290 11:59 0.40* 87c No SFR, FiO2 is newer than SpO2 12:10 0.40c 85* 212.5 12:15 0.40c 85c 212.5 17:45 0.40c 85c 212.5 18:00 85c No SFR, FiO2 carry forward window expired 18:30 No SFR, FiO2 and SpO2 carry forward windows have expired
-
- Look back: implied by the look back on SpO2 and FiO2 and the condition that FiO2 value is the same age or older than the SpO2 value.
ORS: Other Respiratory Support
- Units: not applicable
- Expected Values:
- 0: No other respiratory support
- 1: some form of respiratory support; may or may not include supplemental oxygen
- Caveats:
- If FiO2 > 0.21 then that indicates oxygen support and thus ORS
- Look Back: 6 hours
- If it has been more than six hours since last known data point indicating the patient has respiratory support then consider the patient to no longer have respiratory support.
IMV: Invasive Mechanical ventilation
- Units: not applicable
- Expected Values:
- 0: patient does not currently have invasive mechanical ventilation
- 1: patient currently has invasive mechanical ventilation
- Caveats:
- IMV due to surgery should not be used to assess organ dysfunction
- Look back: 6 hours
- If it has been more than 6 hours since the last known data point indicating the patient has IMV, then consider the patient to no longer have IMV.
Step-By-Step Instructions: NOTE: these instructions are intended for prospective or real-time assessments and extends the logic from the retrospective data analysis used to develop the Phoenix criteria.
- Pick the score time, t. Example: ``We are scoring the patient at 10:15.’’
- Look back only as far as the respiratory look-back window allows. For published Phoenix, this is 6 hours.
- Determine the PFR at time t.
- Determine the SFR at time t.
- Select PFR or SFR to score:
- If at time t, SFR is defined and PFR is not, use SFR.
- If at time t, PFR is defined and SFR is not, use PFR.
- If at time t, SFR and PFR are both defined, then:
- If the age of the PFR value is less than, or no more than one minute older, than the age of the SFR value, use the PFR value.
- If the SFR is more than one minute younger than the PFR value, use the SFR.
- Score
Example: Minutes into an encounter the observed FiO2, PaO2, and SpO2 values and the carried forward values. PFR and SFR values. Notes (below the table) explain why PFR, SFR, or neither is used.
| Minute | FiO2 Observed | FiO2 | PaO2 Observed | PAO2 | SPO2 Observed | SPO2 | PFR | SFR | Notes |
|---|---|---|---|---|---|---|---|---|---|
| 34 | 100 | 100 | 1. | ||||||
| 69 | 100 | 1. | |||||||
| 94 | 1 | 1 | 99 | 99 | 2. | ||||
| 96 | 1 | 99 | 2. | ||||||
| 97 | 1 | 115 | 115 | 99 | 115 | 3. | |||
| 118 | 1 | 115 | 99 | 115 | 3. | ||||
| 124 | 1 | 115 | 97 | 97 | 97 | 4. | |||
| 134 | 1 | 115 | 100 | 100 | 115 | 3. | |||
| 154 | 1 | 115 | 98 | 98 | 115 | 3. | |||
| 186 | 1 | 97 | 97 | 98 | 97 | 3. | |||
| 207 | 1 | 97 | 98 | 97 | 3. | ||||
| 212 | 1 | 97 | 97 | 97 | 97 | 4. | |||
| 214 | 1 | 97 | 97 | 97 | 97 | 4. | |||
| 274 | 0.8 | 0.8 | 97 | 96 | 96 | 120 | 4. | ||
| 275 | 0.8 | 97 | 96 | 120 | 4. | ||||
| 278 | 0.8 | 93 | 93 | 96 | 116.25 | 5. | |||
| 304 | 0.8 | 93 | 96 | 116.25 | 5. | ||||
| 315 | 0.8 | 93 | 96 | 116.25 | 5. | ||||
| 334 | 0.8 | 93 | 95 | 95 | 118.75 | 6. | |||
| 366 | 0.8 | 93 | 95 | 118.75 | 6. | ||||
| 374 | 0.8 | 93 | 95 | 118.75 | 6. | ||||
| 394 | 0.75 | 0.75 | 93 | 94 | 94 | 125.33 | 6. | ||
| 395 | 0.75 | 93 | 94 | 125.33 | 6. | ||||
| 399 | 0.75 | 93 | 94 | 125.33 | 6. | ||||
| 401 | 0.75 | 89 | 89 | 94 | 118.66 | 5. | |||
| 405 | 0.75 | 89 | 94 | 118.66 | 5. | ||||
| 414 | 0.75 | 89 | 94 | 118.66 | 5. | ||||
| 431 | 0.75 | 89 | 94 | 118.66 | 5. | ||||
| 439 | 0.75 | 89 | 97 | 97 | 129.33 | 6. | |||
| 454 | 0.75 | 89 | 97 | 97 | 129.33 | 6. | |||
| 462 | 0.75 | 89 | 97 | 129.33 | 6. | ||||
| 509 | 0.75 | 89 | 97 | 129.33 | 6. | ||||
| … | … | … | … | … | … | … | … | … | … |
| 1501 | 0.5 | 112 | 112 | 99 | 224 | ||||
| 1504 | 0.5 | 112 | 99 | 224 | |||||
| 1534 | 0.5 | 0.5 | 112 | 100 | 100 | 7. | |||
| 1594 | 0.5 | 112 | 98 | 98 | 7. | ||||
| 1614 | 0.5 | 112 | 98 | 7. | |||||
| 1654 | 0.5 | 112 | 100 | 100 | 7. | ||||
| 1717 | 0.5 | 117 | 117 | 99 | 234 | 8. | |||
| 1718 | 0.5 | 117 | 99 | 234 | 8. | ||||
| 1727 | 0.5 | 117 | 99 | 234 | 8. | ||||
| 1745 | 0.45 | 0.45 | 117 | 99 | 7. | ||||
| 1757 | 0.45 | 117 | 99 | 7. | |||||
| 1774 | 0.45 | 117 | 98 | 98 | 7. | ||||
| 1834 | 0.45 | 117 | 97 | 97 | 215.56 | 9. | |||
| 1839 | 0.45 | 117 | 97 | 215.56 | 9. | ||||
| 1894 | 0.4 | 0.4 | 117 | 97 | 97 | 242.5 | 9. | ||
| 1954 | 0.4 | 117 | 95 | 95 | 237.5 | 9. | |||
| 1955 | 0.4 | 117 | 95 | 237.5 | 9. | ||||
| 1972 | 0.4 | 117 | 95 | 237.5 | 9. | ||||
| 1983 | 0.4 | 79 | 79 | 95 | 197.5 | 5. |
Notes:
- No PFR or SFR because there is no FiO2
- SpO2 is greater than 97 and thus not to be used. There is no SFR at this time.
- SpO2 is greater than 97 and thus not to be used. PaO2 observed and is younger than FiO2. Use PFR.
- SpO2 is ≤ 97; can be used for SFR. SpO2 is younger than FiO2. SFR is younger than PFR. Use SFR.
- SFR and PFR are both valid. PaO2 is younger than SpO2. Use PFR.
- SFR and PFR are both valid. SpO2 is younger than PaO2. Use SFR.
- SpO2 > 97; do not calculate SFR. PaO2 is older than FiO2; do not calculate PFR. There is no valid PFR nor SFR value at this time.
- SpO2 > 97; do not calculate SFR. PaO2 is younger than FiO2: calculate PFR and use it.
- SpO2 ≤ 97 and younger than FiO2; calculate SFR; PaO2 is older than FiO2: do not calculate PFR. Use SFR.
Cardiovascular
Cardiovascular dysfunction is based on three types of data:
- Systemic Vasoactive medications
- Lactate
- Age adjusted mean arterial pressure
Inputs
Systemic Vasoactive Medications
There are six systemic vasoactive medications to consider:
- dobutamine
- dopamine
- epinephrine
- norepinephrine
- milrinone
- vasopressin
Vasoactive medications (dobutamine, dopamine, etc.) should only count if they are continuous and systemic. Ideally, one would identify flowsheet or medication rows where the dose (rate) is documented at least every hour for each infusion. In our dataset, epinephrine had some non-systemic medication administrations that needed to be excluded. Here are some non-systemic examples to exclude:
- epinephrine 0.3 mg/0.3ml inj soln prefilled syringe
- epinephrine hcl (nasal) 0.1 % nasal solution
- epinephrine hcl 2.25 % inh neb soln
Example SQL code used for mapping administration routes when developing Phoenix can be found in the project GitHub archive specifically the files: med_route_mapping.sql and clean_up_routes.sql.
The overall metadata for vasoactives:
- Units: none
- Expected Values: integer values 0, 1, 2, 3, 4, 5, 6
- (maximum vasoactive points is reached with 2)
- Caveats: see above
- Look back: 12 hours
Mean Arterial Pressure (MAP)
There can be many sources of blood pressure. We used the following hierarchy for which value to use in the scoring.
- Arterial MAP (invasive measurement)
- Estimated MAP from arterial systolic (SBP) and arterial diastolic (DBP) pressures
- Cuff MAP
- Estimated MAP from cuff SBP and cuff DBP
MAP can be estimated as (2/3) * DBP + (1/3) * SBP
Expected metadata:
- MAP:
- Units: mmHg
- Expected Values: [1, 300]
- Caveats:
- If MAP is provided along with SBP and DBP then verify that DBP ≤ MAP ≤ SBP
- Look back: 6 hours
- SBP:
- Units: mmHg
- Expected Values: [1, 300]
- Caveats:
- Verify that DBP ≤ SBP, we used a slightly more conservative check of (SBP - DBP) ≥ 1
- Look back: 6 hours
- DBP:
- Units: mmHg
- Expected Values: [1, 200]
- Caveats:
- Verify that DBP ≤ SBP, we used a slightly more conservative check of (SBP - DBP) ≥ 1
- Look back: 6 hours
Step-By-Step Instructions: NOTE: these instructions are intended for prospective or real-time assessments and extends the logic from the retrospective data analysis used to develop the Phoenix criteria.
- Pick the score time. Example: ``We are scoring the patient at 10:15.’’
- Look back only as far as the blood-pressure look-back window allows. For published Phoenix, this is 6 hours.
- Define 4 candidate estimators:
- Define Candidate 1.
- Find the most recent arterial-line MAP within that window.
- If one exists this is Candidate 1; otherwise Candidate 1 is missing.
- Define Candidate 2.
- Find the most recent arterial-line SBP and arterial-line DBP within that window.
- Only use arterial SBP and DBP to calculate MAP if they were recorded close enough together (within 10 minutes of each other). If they are too far apart in time, do not use them together.
- If arterial SBP and DBP can be used together, calculate: MAP = one third SBP + two thirds DBP. Call this Candidate 2.
- Define Candidate 3.
- Find the most recent cuff MAP within the window.
- If one exists this is Candidate 3; otherwise Candidate 3 is missing.
- Define Candidate 4.
- Find the most recent cuff SBP and cuff DBP within the window.
- Only use cuff SBP and DBP to calculate MAP if they were recorded close enough together (within 10 minutes of each other). If they are too far apart in time, do not use them together.
- If cuff SBP and DBP can be used together, calculate: MAP = one third SBP + two thirds DBP. Call this Candidate 4.
- Define Candidate 1.
- For each candidate, figure out how old it is at the score time.
- Ignore any candidate that does not exist.
- Choose the candidate that is newest.
- Candidate 1 and Candidate 3 have the same age as the reported value
- Candidate 2 and 4: these are as old as the youngest component. Example: SBP most recent reported value at 10:08; DBP last reported value at 10:03. Then the Candidate will be considered to have reported time of 10:08.
- If two candidates are equally new (within one minute), use
this tie-breaker order:
- Arterial-line MAP measured directly: Candidate 1.
- Arterial-line MAP calculated from arterial SBP and DBP: Candidate 2.
- Cuff MAP measured directly: Candidate 3.
- Cuff MAP calculated from cuff SBP and DBP: Candidate 4.
- Use the Candidate selected in step 5 to assess the Phoenix score. If there are no usable candidates, then MAP is missing and gives 0 MAP points.
Simple Rule To Remember: Use the newest usable MAP. If there is a tie, prefer arterial over cuff, and prefer directly measured MAP over calculated MAP.
Example: The candidate columns have the MAP value and the (value age: how old is the value, in minutes).
| Time | Arterial MAP | Cuff SBP | Cuff DBP | Candidate 1: (age) | Candidate 4: (age) | Selected Candidate | Note |
|---|---|---|---|---|---|---|---|
| 10:00 | |||||||
| 10:01 | 55 | 55 (0) | 1 | 1. | |||
| 10:02 | 56 | 56 (0) | 1 | 1. | |||
| 10:03 | 58 | 58 (0) | 1 | 1. | |||
| 10:04 | 63 | 47 | 58 (1) | 52.33 (0) | 1 | 2. | |
| 10:05 | 58 (2) | 52.33 (1) | 1 | 2. | |||
| 10:06 | 58 (3) | 52.33 (2) | 1 | 2. | |||
| 10:07 | 64 | 46 | 58 (4) | 52 (0) | 4 | 3. | |
| 10:08 | 57 | 57 (0) | 52 (1) | 1 | 4. | ||
| 10:09 | 57 (1) | 52 (2) | 1 | 4. | |||
| 10:10 | 57 (2) | 52 (3) | 1 | 4. | |||
| 10:11 | 63 | 57 (3) | 51.67 (0) | 4 | 5. | ||
| 10:12 | 57 (4) | 51.67 (1) | 4 | 5. | |||
| 10:13 | 57 (5) | 51.67 (2) | 4 | 5. | |||
| 10:14 | 57 (6) | 51.67 (3) | 4 | 5. | |||
| 10:15 | 57 (7) | 51.67 (4) | 4 | 5. | |||
| 10:16 | 57 (8) | 51.67 (5) | 4 | 5. | |||
| 10:17 | 57 (9) | 51.67 (6) | 4 | 5. | |||
| 10:18 | 57 (10) | 51.67 (7) | 4 | 5. | |||
| 10:19 | 62 | 57 (11) | —- | 1 | 6. |
Notes:
- The arterial MAP is the selected candidate because it is the only candidate and is aged zero minutes, well within in the look back window of six hours.
- The selected candidate for use in the Phoenix scoring is Candidate 1, arterial MAP. Although Candidate 4, the MAP approximated by cuff SBP and DBP, is younger, it is only younger by one minute. The age of measurement difference being only one minute, the two candidates are conceptually considered to be the same age and thus the Candidate 1, the arterial MAP is used when assessing Phoenix.
- Candidate 4 is used here because the approximated MAP from cuff SBP and DBP is zero minutes old verse the four minute old arterial MAP.
- Candidate 1 is used because it is the youngest and the preferable data source.
- SBP was updated, DBP was not. The approximate MAP based on cuff values can use the older DBP because it is within 10 minutes of the current SBP value. The approximate MAP gets the same age as the youngest input, here the SBP. This results in the cuff MAP being the youngest value by more than one minute and thus is the candidate used in the Phoenix assessment.
- SBP was updated, DBP was not. Because the SBP and DBP values are more than 10 minutes apart the estimated MAP is not to be used. As such, Candidate 1, the arterial MAP is used based on data source preference and it is within the look back window.
Scoring
Up to six points can be earned from cardiovascular dysfunction. Up to two points for vasoactives, up to two points for lactate, and up to two points for MAP.
# vas: number of vasoactive meds
# lct: lactate in mmol/L
# age: age in months
# map: mean arterial pressure in mmHg
cat(tail(as.character(body(phoenix::phoenix_cardiovascular)), 4), sep = "\n")
#> vas_score <- (vas > 1) + (vas > 0)
#> lct_score <- (lct >= 11) + (lct >= 5)
#> map_score <- ((age >= 0 & age < 1) * ((map < 17) + (map < 31)) + (age >= 1 & age < 12) * ((map < 25) + (map < 39)) + (age >= 12 & age < 24) * ((map < 31) + (map < 44)) + (age >= 24 & age < 60) * ((map < 32) + (map < 45)) + (age >= 60 & age < 144) * ((map < 36) + (map < 49)) + (age >= 144 & age <= 216) * ((map < 38) + (map < 52)))
#> vas_score + lct_score + map_scoreCoagulation
Scoring
While there are four inputs and a patient could get a point for each one, the final score is capped at two points.
cat(tail(as.character(body(phoenix::phoenix_coagulation)), 2), sep = "\n")
#> rtn <- as.integer(plt < 100) + as.integer(inr > 1.3) + as.integer(ddm > 2) + as.integer(fib < 100)
#> pmin(rtn, 2)Neurologic
Inputs
Glasgow Coma Scale (GCS)
Phoenix is based on the total GCS score.
- GCS (total):
- Units: none
- Expected Values: integer values 3, 4, 5, …, 15
- Caveats:
- The total GCS is the sum of three component scores: eye, motor, and verbal.
- We assumed that if we had an updated score for any one of the three components but not all, then the non-updated components were assumed to have not changed. In that case, we updated the time of the GCS total and all its components to the most recent update time for any of the components.
- Look back: 12 hours
- GCS (eye):
- Units: none
- Expected Values: integer values 1, 2, 3, 4
- Caveats:
- Look back: 12 hours
- GCS (motor):
- Units: none
- Expected Values: integer values 1, 2, 3, 4, 5, 6
- Caveats:
- Look back: 12 hours
- GCS (verbal):
- Units: none
- Expected Values: integer values 1, 2, 3, 4, 5
- Caveats: We did not use the T value for intubation - just use the recorded GCS-V, i.e. 1 for 1T
- Look back: 12 hours
Scoring
- At most 2 points.
- 1 point for GCS ≤ 10
- 2 points for bilaterally fixed pupils
A patient with a GCS ≤ 10 and bilaterally fixed pupils will have a score of 2.
# fpl: 1 if bilaterally fixed pupils; 0 otherwise
cat(tail(as.character(body(phoenix::phoenix_neurologic)), 1), sep = "\n")
#> pmin(fpl * 2 + as.integer(gcs <= 10), 2)Endocrine
Scoring
Scoring for Phoenix-8 only. 1 point if glucose < 50 or > 150
cat(tail(as.character(body(phoenix::phoenix_endocrine)), 1), sep = "\n")
#> as.integer((glc < 50) | (glc > 150))Immunologic
Inputs
Scoring
At most one point
cat(tail(as.character(body(phoenix::phoenix_immunologic)), 1), sep = "\n")
#> as.integer((anc < 0.5) | (alc < 1))Renal
Scoring
Age-adjusted creatinine
cat(tail(as.character(body(phoenix::phoenix_renal)), 1), sep = "\n")
#> (age >= 0 & age < 1) * (crt >= 0.8) + (age >= 1 & age < 12) * (crt >= 0.3) + (age >= 12 & age < 24) * (crt >= 0.4) + (age >= 24 & age < 60) * (crt >= 0.6) + (age >= 60 & age < 144) * (crt >= 0.7) + (age >= 144 & age <= 216) * (crt >= 1)Hepatic
Scoring
0 or 1 points
cat(tail(as.character(body(phoenix::phoenix_hepatic)), 1), sep = "\n")
#> as.integer((bil >= 4) | (alt > 102))