| Title: | Prescribe Sub-Symptom Exercise for Adolescent Concussion |
|---|---|
| Description: | A clinical decision support system for sub-symptom threshold aerobic exercise (SSTAE) prescription in adolescents with persistent post-concussion symptoms (PPCS). Implements an evidence-based protocol derived from a systematic review of seven studies (Li, 2026; <doi:10.17605/osf.io/kvuf6>), encoding safety screening, Buffalo Concussion Treadmill Test (BCTT)-guided heart rate prescription, session-level progress tracking, and evidence disclosure using the Grading of Recommendations, Assessment, Development and Evaluation (GRADE) framework into an open-source tool for athletic trainers and clinicians. Designed to support implementation in resource-limited settings where BCTT equipment may be unavailable. GRADE certainty of evidence: LOW. For clinician use only; not a substitute for clinical judgement. |
| Authors: | Guang Li [aut, cre] (ORCID: <https://orcid.org/0009-0004-2807-9029>) |
| Maintainer: | Guang Li <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.1.0 |
| Built: | 2026-06-01 10:00:39 UTC |
| Source: | https://github.com/guangl10/ppcsexrx |
Generates a dual-panel plot showing PCSS symptom trajectory and achieved HR over time. Requires base R graphics only (no dependencies).
## S3 method for class 'ppcs_track' plot(x, ...)## S3 method for class 'ppcs_track' plot(x, ...)
x |
A ppcs_track object. |
... |
Further arguments passed to |
Invisibly returns x, called for its side effect of
drawing a two-panel base-graphics figure: the upper panel shows
Post-Concussion Symptom Scale (PCSS) scores across sessions;
the lower panel shows achieved and target heart rate (bpm) across
sessions. Returns a message (via message) and
invisible(x) without plotting if fewer than two sessions
are recorded.
Implements the evidence-based protocol from Li (2026). GRADE: LOW certainty,
Conditional recommendation FOR. Run screen_ppcs first to
confirm eligibility.
prescribe_ppcs( age, days_post_injury, hrst = NULL, vestibular_symptoms = FALSE, cervical_symptoms = FALSE, sessions_completed = 0, last_session_worse = FALSE )prescribe_ppcs( age, days_post_injury, hrst = NULL, vestibular_symptoms = FALSE, cervical_symptoms = FALSE, sessions_completed = 0, last_session_worse = FALSE )
age |
Numeric. Age 13-18 years. CAT p.2, L10: inclusion 13-18. |
days_post_injury |
Numeric. Days since injury. Must be >=28 for PPCS. CAT p.2, L10. |
hrst |
Numeric or NULL. Symptom threshold HR from BCTT (bpm). If NULL, age-predicted fallback is used. CAT p.11, L19. |
vestibular_symptoms |
Logical. TRUE = contraindication. CAT p.11, L25. |
cervical_symptoms |
Logical. TRUE = contraindication. CAT p.11, L25. |
sessions_completed |
Integer. Sessions at current HR without worsening. CAT p.11, L21. |
last_session_worse |
Logical. Did PCSS increase >=2 points last session? CAT p.11, L21-22. |
An object of class ppcs_prescription with prescription details.
Li G. (2026). Sub-symptom Threshold Aerobic Exercise for Adolescents With PPCS: A Critically Appraised Topic. Winner, NATA Foundation Student Writing Contest.
# Case 1: Rural clinic, no BCTT available prescribe_ppcs(age = 16, days_post_injury = 35) # Case 2: University clinic with BCTT data prescribe_ppcs(age = 17, days_post_injury = 40, hrst = 160) # Case 3: Safety stop - vestibular symptoms present try(prescribe_ppcs(age = 15, days_post_injury = 30, vestibular_symptoms = TRUE))# Case 1: Rural clinic, no BCTT available prescribe_ppcs(age = 16, days_post_injury = 35) # Case 2: University clinic with BCTT data prescribe_ppcs(age = 17, days_post_injury = 40, hrst = 160) # Case 3: Safety stop - vestibular symptoms present try(prescribe_ppcs(age = 15, days_post_injury = 30, vestibular_symptoms = TRUE))
Displays a formatted clinical prescription sheet.
## S3 method for class 'ppcs_prescription' print(x, ...)## S3 method for class 'ppcs_prescription' print(x, ...)
x |
A ppcs_prescription object. |
... |
Further arguments passed to or from other methods. |
Invisibly returns x (a ppcs_prescription list),
called primarily for its side effect of printing the formatted
prescription to the console.
Print method for ppcs_screen objects
## S3 method for class 'ppcs_screen' print(x, ...)## S3 method for class 'ppcs_screen' print(x, ...)
x |
A ppcs_screen object. |
... |
Further arguments (unused). |
Invisibly returns x (a ppcs_screen list),
called primarily for its side effect of printing the eligibility
screen result to the console.
Print method for ppcs_track objects
## S3 method for class 'ppcs_track' print(x, ...)## S3 method for class 'ppcs_track' print(x, ...)
x |
A ppcs_track object. |
... |
Further arguments (unused). |
Invisibly returns x (a ppcs_track list),
called primarily for its side effect of printing the session
progress summary to the console.
Implements the PICO-based eligibility criteria from Li (2026). Run this
before prescribe_ppcs to confirm the patient is appropriate
for sub-symptom threshold aerobic exercise.
screen_ppcs( age, days_post_injury, vestibular_symptoms = FALSE, cervical_symptoms = FALSE, vision_symptoms = FALSE, verbose = TRUE )screen_ppcs( age, days_post_injury, vestibular_symptoms = FALSE, cervical_symptoms = FALSE, vision_symptoms = FALSE, verbose = TRUE )
age |
Numeric. Patient age in years. Eligible range: 13-18. |
days_post_injury |
Numeric. Days since concussion. PPCS defined as >=28. |
vestibular_symptoms |
Logical. Active uncontrolled vestibular symptoms? Default FALSE. Contraindication per Li (2026), p.11. |
cervical_symptoms |
Logical. Active uncontrolled cervical symptoms? Default FALSE. Contraindication per Li (2026), p.11. |
vision_symptoms |
Logical. Exercise-induced vision dysfunction present? Default FALSE. Associated with prolonged PPCS (Vernau et al., 2023). |
verbose |
Logical. If TRUE (default), prints full clinical output. Set FALSE for patient/caregiver-facing simplified output. |
A list of class ppcs_screen with fields:
"eligible", "contraindicated", or "needs_referral"
Character. Clinical rationale for status.
Character or NA. Recommended referral if applicable.
Character. Recommended action.
Li G. (2026). Sub-symptom Threshold Aerobic Exercise for Adolescents With PPCS: A Critically Appraised Topic. Winner, NATA Foundation Student Writing Contest.
Vernau BT, Haider MN, Fleming A, et al. Exercise-Induced Vision Dysfunction Early After Sport-Related Concussion Is Associated With Persistent Postconcussive Symptoms. Clin J Sport Med. 2023;33(4):388-394.
# Eligible athlete screen_ppcs(age = 16, days_post_injury = 35) # Contraindicated: too early screen_ppcs(age = 16, days_post_injury = 20) # Needs referral: vestibular symptoms present screen_ppcs(age = 16, days_post_injury = 35, vestibular_symptoms = TRUE) # Patient/caregiver output screen_ppcs(age = 16, days_post_injury = 35, verbose = FALSE)# Eligible athlete screen_ppcs(age = 16, days_post_injury = 35) # Contraindicated: too early screen_ppcs(age = 16, days_post_injury = 20) # Needs referral: vestibular symptoms present screen_ppcs(age = 16, days_post_injury = 35, vestibular_symptoms = TRUE) # Patient/caregiver output screen_ppcs(age = 16, days_post_injury = 35, verbose = FALSE)
Records and evaluates session-level data over the course of a sub-symptom threshold aerobic exercise programme. Compares observed progress against the progression and stop rules described in Li (2026), p.14, and generates a recommendation for the next session.
track_progress( log, current_pcss, current_hr, current_duration, prescription, verbose = TRUE )track_progress( log, current_pcss, current_hr, current_duration, prescription, verbose = TRUE )
log |
A data frame of previous sessions with columns:
Pass |
current_pcss |
Numeric. Today's PCSS score (0-132). |
current_hr |
Numeric. HR achieved in today's session (bpm). |
current_duration |
Numeric. Minutes completed today. |
prescription |
A |
verbose |
Logical. If TRUE (default), prints full clinician output. Set FALSE for patient/caregiver-facing simplified output. |
A list of class ppcs_track with fields:
Data frame. The log with today's session appended.
Character. Current rehabilitation phase.
Character. Action for the next session.
Numeric. Suggested HR target for next session (bpm).
Integer. Total sessions recorded.
Numeric. PCSS change from first to today.
Logical. Passed through for print method.
Li G. (2026). Sub-symptom Threshold Aerobic Exercise for Adolescents With PPCS: A Critically Appraised Topic. Winner, NATA Foundation Student Writing Contest. p.14.
Kurowski BG, et al. Aerobic Exercise for Adolescents With Prolonged Symptoms After Mild Traumatic Brain Injury. J Head Trauma Rehabil. 2017;32(2):79-89.
# Step 1: get a prescription rx <- prescribe_ppcs(age = 16, days_post_injury = 35, hrst = 160) # Step 2: first session - no prior log t1 <- track_progress( log = NULL, current_pcss = 28, current_hr = 120, current_duration = 18, prescription = rx ) t1 # Step 3: second session - pass updated log forward t2 <- track_progress( log = t1$updated_log, current_pcss = 24, current_hr = 122, current_duration = 20, prescription = rx ) t2# Step 1: get a prescription rx <- prescribe_ppcs(age = 16, days_post_injury = 35, hrst = 160) # Step 2: first session - no prior log t1 <- track_progress( log = NULL, current_pcss = 28, current_hr = 120, current_duration = 18, prescription = rx ) t1 # Step 3: second session - pass updated log forward t2 <- track_progress( log = t1$updated_log, current_pcss = 24, current_hr = 122, current_duration = 20, prescription = rx ) t2