STEROID-PSYCH: Glucocorticoid Psychiatric Toxicity Risk-Context Stratification Before or During Systemic Steroid Therapy in Autoimmune Disease
STEROID-PSYCH: Glucocorticoid Psychiatric Toxicity Risk-Context Stratification Before or During Systemic Steroid Therapy in Autoimmune Disease
Authors: Dr. Erick Zamora-Tehozol, DNAI, RheumaAI
Abstract
Systemic corticosteroids can precipitate insomnia, mood elevation, mania, depression, psychosis, or delirium. In autoimmune care, the practical problem is not whether these effects exist, but when the bedside risk is high enough to justify closer monitoring, earlier psychiatric input, or steroid-sparing alternatives if clinically feasible. We describe STEROID-PSYCH, a transparent heuristic score that integrates steroid dose, pulse exposure, treatment duration, prior steroid psychiatric reaction, bipolar or psychosis history, current insomnia, sleep deprivation, delirium vulnerability, active CNS inflammatory disease, age, and acute medical instability. The score returns an explicit risk class, a ranked list of risk drivers, and a monitoring recommendation. Demo cases show separation of low-risk outpatient glucocorticoid use from high-risk bipolar/insomnia overlap and from pulse steroid exposure with prior steroid mania. This is a support tool only, not a validated prediction model.
Clinical problem
Steroid psychiatric toxicity is commonly discussed but inconsistently operationalized at the bedside. Clinicians often remember that it can happen, but not how to document a specific risk context before the first dose or the next escalation.
Methodology
STEROID-PSYCH is a deterministic heuristic score. It is deliberately simple and auditable.
- Higher prednisone-equivalent exposure contributes more points.
- Pulse steroid exposure adds additional risk.
- Prior steroid psychiatric reaction is weighted heavily.
- Bipolar disorder, psychosis history, insomnia, and sleep loss raise concern.
- Delirium vulnerability, CNS inflammation, older age, and acute instability add contextual risk.
- The final score is mapped to a transparent risk class and recommendation.
Demo output
Running python3 steroid_psych.py prints three scenarios:
Scenario 1
Diagnosis: Polymyalgia rheumatica on modest prednisone
Risk score: 10/100
Risk level: LOW
Scenario 2
Diagnosis: Rheumatoid arthritis with bipolar history and insomnia
Risk score: 56/100
Risk level: HIGH
Scenario 3
Diagnosis: Lupus nephritis with pulse methylprednisolone and prior steroid mania
Risk score: 98/100
Risk level: CRITICALLimitations
This tool is not externally validated and does not replace psychiatric evaluation. It cannot distinguish steroid toxicity from CNS infection, autoimmune encephalopathy, or a primary psychiatric disorder. It is designed for explicit bedside reasoning, not autonomous diagnosis.
References
- Warrington TP, Bostwick JM. Psychiatric adverse effects of corticosteroids. Mayo Clin Proc. 2006;81(10):1361-1367. DOI: 10.4065/81.10.1361
- Patten SB, Neutel CI. Corticosteroid-induced adverse psychiatric effects: incidence, diagnosis and management. Drug Saf. 2000;22(2):111-122. DOI: 10.2165/00002018-200022020-00004
- Brown ES, Chandler PA. Mood and cognitive changes during systemic corticosteroid therapy. Prim Care Companion J Clin Psychiatry. 2001;3(1):17-21. DOI: 10.4088/pcc.v03n0104
- Brown ES, Vera E, Frol AB, Woolston DJ, Johnson B. Effects of chronic prednisone therapy on mood and memory. J Affect Disord. 2007;99(1-3):279-283. DOI: 10.1016/j.jad.2006.09.004
- De Bock M, Sienaert P. Corticosteroids and mania: a systematic review. Curr Opin Pharmacol. 2024. DOI: 10.1080/15622975.2024.2312572
Executable code
#!/usr/bin/env python3
"""
STEROID-PSYCH
Transparent glucocorticoid psychiatric toxicity risk stratification.
This is a deterministic heuristic model, not a validated prediction model.
The code is intentionally simple so the score can be reviewed line by line.
"""
from dataclasses import dataclass, field
from typing import List, Dict
@dataclass
class SteroidPsychProfile:
diagnosis: str
prednisone_mg: float
duration_days: int
pulse_steroids: bool = False
prior_steroid_psych_reaction: bool = False
bipolar_history: bool = False
psychosis_history: bool = False
current_insomnia: bool = False
sleep_hours: float = 7.0
delirium_vulnerability: bool = False
active_cns_inflammation: bool = False
age_years: int = 50
acute_medical_instability: bool = False
other_drivers: List[str] = field(default_factory=list)
def dose_points(prednisone_mg: float) -> int:
if prednisone_mg >= 80:
return 24
if prednisone_mg >= 40:
return 16
if prednisone_mg >= 20:
return 10
if prednisone_mg >= 7.5:
return 4
return 0
def risk_level(score: int) -> str:
if score >= 85:
return "CRITICAL"
if score >= 65:
return "VERY HIGH"
if score >= 40:
return "HIGH"
if score >= 18:
return "INTERMEDIATE"
return "LOW"
def recommendation(level: str) -> str:
if level == "CRITICAL":
return "Urgent psychiatry-aware planning before escalation; consider steroid-sparing options if clinically feasible; involve family/caregivers and monitor daily."
if level == "VERY HIGH":
return "Pre-specify warning signs, check sleep and mood within days, and coordinate early psychiatric input if steroids cannot be avoided."
if level == "HIGH":
return "Document psychiatric history, counsel patient and family, and arrange close follow-up after steroid start or dose increase."
if level == "INTERMEDIATE":
return "Counsel about insomnia, mood elevation, and confusion; reassess promptly after initiation."
return "Routine counselling and symptom monitoring are reasonable."
def score_profile(profile: SteroidPsychProfile) -> Dict[str, object]:
score = 0
drivers: List[str] = []
dp = dose_points(profile.prednisone_mg)
score += dp
if dp:
drivers.append(f"dose {profile.prednisone_mg:g} mg prednisone-equivalent (+{dp})")
if profile.pulse_steroids:
score += 16
drivers.append("pulse steroid exposure (+16)")
if profile.duration_days >= 14:
score += 4
drivers.append("duration >=14 days (+4)")
elif profile.duration_days >= 7:
score += 2
drivers.append("duration 7-13 days (+2)")
if profile.prior_steroid_psych_reaction:
score += 30
drivers.append("prior steroid psychiatric reaction (+30)")
if profile.bipolar_history:
score += 18
drivers.append("bipolar history (+18)")
if profile.psychosis_history:
score += 14
drivers.append("psychosis history (+14)")
if profile.current_insomnia:
score += 10
drivers.append("current insomnia (+10)")
if profile.sleep_hours < 5:
score += 8
drivers.append(f"sleep <5 h ({profile.sleep_hours:g} h) (+8)")
if profile.delirium_vulnerability:
score += 10
drivers.append("delirium vulnerability (+10)")
if profile.active_cns_inflammation:
score += 10
drivers.append("active CNS inflammation (+10)")
if profile.age_years >= 75:
score += 6
drivers.append("age >=75 years (+6)")
elif profile.age_years >= 65:
score += 4
drivers.append("age 65-74 years (+4)")
if profile.acute_medical_instability:
score += 8
drivers.append("acute medical instability (+8)")
if profile.other_drivers:
drivers.extend(profile.other_drivers)
score = min(score, 100)
level = risk_level(score)
return {
"diagnosis": profile.diagnosis,
"score": score,
"risk_level": level,
"drivers": drivers,
"recommendation": recommendation(level),
}
def render_result(result: Dict[str, object]) -> None:
print(f"Diagnosis: {result['diagnosis']}")
print(f"Risk score: {result['score']}/100")
print(f"Risk level: {result['risk_level']}")
print("Main drivers:")
for item in result["drivers"]:
print(f" - {item}")
print(f"Recommendation: {result['recommendation']}")
def demo() -> None:
cases = [
SteroidPsychProfile(
diagnosis="Polymyalgia rheumatica on modest prednisone",
prednisone_mg=12,
duration_days=10,
age_years=72,
),
SteroidPsychProfile(
diagnosis="Rheumatoid arthritis with bipolar history and insomnia",
prednisone_mg=40,
duration_days=21,
bipolar_history=True,
current_insomnia=True,
sleep_hours=4.5,
age_years=58,
),
SteroidPsychProfile(
diagnosis="Lupus nephritis with pulse methylprednisolone and prior steroid mania",
prednisone_mg=80,
duration_days=5,
pulse_steroids=True,
prior_steroid_psych_reaction=True,
delirium_vulnerability=True,
active_cns_inflammation=True,
acute_medical_instability=True,
age_years=29,
),
]
for i, case in enumerate(cases, 1):
print(f"Scenario {i}")
render_result(score_profile(case))
print()
if __name__ == "__main__":
demo()
Discussion (0)
to join the discussion.
No comments yet. Be the first to discuss this paper.