Individual-Level State-Transition Microsimulation for IXA-001 Cost-Effectiveness Analysis
A pharmacoeconomic evaluation tool for hypertension treatments in patients with resistant hypertension and cardiorenal disease. Features dual cardiac-renal disease branches, atrial fibrillation tracking, and societal perspective cost analysis.
- Overview
- Target Population: Resistant Hypertension
- Quick Start with Docker
- Installation (Local)
- Key Features
- Dual Cardiac-Renal Pathway Interactions
- Model Architecture
- How Event Probabilities Are Actually Assigned
- Phenotype-Specific Risk Modifiers
- Results
- Economic Evaluation
- Technical Implementation
- Usage
- Documentation
- Companion Model: Budget Impact
- References
- Version History
This model simulates the lifetime progression of hypertensive patients through dual disease branches (cardiac and renal), evaluating the cost-effectiveness of novel antihypertensive treatments against standard care. It implements cutting-edge methodologies from health economics and clinical research to provide robust pharmacoeconomic evidence for reimbursement decisions.
Model Type: Individual-Level State-Transition Microsimulation (IL-STM) Cycle Length: Monthly (to capture acute events and rapid renal transitions) Time Horizon: Lifetime (up to age 100) Perspective: Healthcare payer OR Societal (configurable) Discount Rate: 3% per annum (costs and QALYs)
This model is specifically designed for resistant hypertension (rHTN) — a distinct clinical phenotype that demands specialized modeling approaches.
Definition: Blood pressure remaining above target (≥130/80 mmHg) despite optimal use of ≥3 antihypertensive agents from different classes, including a diuretic, at maximally tolerated doses.
Prevalence: 10-15% of treated hypertensive patients (~11,000 per 1 million plan members)
Unlike general hypertension, resistant HTN patients present unique characteristics that make cohort-level Markov models inadequate:
| Characteristic | General HTN | Resistant HTN | Modeling Implication |
|---|---|---|---|
| Prior CV events | 5-10% | 25-35% | Individual history tracking essential |
| CKD (eGFR <60) | 10-15% | 30-40% | Dual cardiac-renal pathways |
| Diabetes | 20-25% | 40-50% | Accelerated progression modeling |
| Primary aldosteronism | 5-10% | 15-20% | IXA-001 target subpopulation |
| Target organ damage | 15-20% | 60-70% | Higher baseline event rates |
| Obesity (BMI ≥30) | 30-35% | 50-60% | Metabolic phenotype identification |
15-20% of resistant HTN patients have primary aldosteronism — a condition where autonomous aldosterone production drives hypertension. This population is the core target for IXA-001 (aldosterone synthase inhibitor):
- Enhanced treatment response: ~70% better BP reduction with IXA-001 (modifier 1.70)
- Higher baseline risk: 2.05× HF risk, 1.8× renal risk, 12× AF risk due to aldosterone-mediated fibrosis
- Identifiable from clinical workup: Aldosterone-to-renin ratio screening
The model captures this via:
has_primary_aldosteronismpatient attribute- Treatment response modifiers in
BaselineRiskProfile.get_treatment_response_modifier() - Phenotype-specific risk adjustments (HF 2.05×, ESRD 1.8×, MI 1.4×, Stroke 1.5×, AF 3.0×)
- NEW: Atrial fibrillation tracking with treatment-specific risk reduction (60% with IXA-001 vs 40% with spironolactone)
- History matters intensely: A patient with prior MI + CKD Stage 3 + diabetes has fundamentally different risk than one with rHTN alone
- Competing risks are amplified: CV death vs. renal death vs. other-cause mortality compete more aggressively
- Treatment response is heterogeneous: Primary aldosteronism patients respond better to ASIs than those with arterial stiffness
- Time-dependent covariates: SBP, eGFR, and potassium levels change dynamically month-to-month
The fastest way to run the Cost-Effectiveness Analysis (CEA) web interface.
| Platform | Requirements |
|---|---|
| macOS | Docker Desktop for Mac |
| Windows | Docker Desktop for Windows with WSL 2 backend |
| Linux | Docker Engine and Docker Compose |
# Clone the repository
git clone https://github.com/danribes/hypertension-microsim.git
cd hypertension_microsim
# Start the application
docker compose up
# Access the web interface at http://localhost:8502To stop: Ctrl+C or docker compose down
# Build the image
docker build -t hypertension-microsim .
# Run the container
docker run -p 8502:8501 hypertension-microsim
# Access the web interface at http://localhost:8502The Streamlit interface provides:
- Interactive Parameters: Cohort size, time horizon, cost perspective (US/UK), economic perspective (healthcare/societal)
- Key Metrics: Incremental costs, QALYs, ICER with interpretation
- Outcomes Table: Comprehensive comparison of events and costs
- Event Charts: Visual comparison of cardiac, renal, and AF events
- CE Plane: Cost-effectiveness quadrant analysis
- WTP Analysis: Net monetary benefit at various thresholds
- Python 3.8 or higher
- pip (Python package manager)
# Clone the repository
git clone https://github.com/danribes/hypertension-microsim.git
cd hypertension-microsim
# Create virtual environment (recommended)
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txtstreamlit run streamlit_app.pyThen open http://localhost:8502 in your browser.
Unlike cohort-level Markov models, this microsimulation tracks each patient individually through time, enabling:
- Patient history tracking: Prior MI, stroke, time since events
- Continuous risk factors: Exact eGFR, SBP, age (not discretized into health states)
- Treatment adherence: Individual-level compliance tracking
- Memory effects: Risk depends on full patient trajectory, not just current state
Patients simultaneously progress through independent cardiac and renal pathways:
Cardiac Branch:
No Acute Event → [MI, Stroke, HF, AF] → Chronic HF → Death (Cardiac)
↓ (recurrent)
Post-MI/Stroke/AF Management
Renal Branch:
CKD Stage 1-2 → Stage 3a → Stage 3b → Stage 4 → ESRD → Death (Renal)
(eGFR ≥60) (45-59) (30-44) (15-29) (<15)
Stochastic monthly updates reflecting real-world BP variability:
SBP(t+1) = SBP(t) + β_age + ε - treatment_effect
Where:
β_age = 0.05 mmHg/month (age-related drift)
ε ~ N(0, 2 mmHg) (stochastic variation)
treatment_effect (medication-specific reduction)
Advantages:
- Captures biological variability in BP over time
- Enables treatment response heterogeneity across patients
- Supports adherence modeling (BP rebounds if non-adherent)
Continuous decline equation with multiple risk factors:
Δ_eGFR_monthly = base_decline_age * diabetes_multiplier * BP_continuous_effect
Where:
base_decline_age = {0.5 (age <50), 0.8 (50-65), 1.2 (65-75), 1.8 (75+)} / 12
diabetes_multiplier = 1.5 if diabetic, else 1.0
BP_continuous_effect = 1 + 0.05 * max(0, SBP - 140)
Advantages over categorical models:
- Smooth transitions (no artificial threshold effects)
- SBP-kidney interaction (every 1 mmHg above 140 accelerates decline)
- Age stratification (faster decline in elderly)
AF is a critical aldosterone-mediated outcome with dramatically elevated risk in PA patients:
Key Mechanisms:
- Aldosterone promotes atrial fibrosis and electrical remodeling
- Left atrial enlargement from volume overload
- Direct pro-arrhythmic effects
Implementation:
- 12× baseline AF risk for PA patients (per Monticone S et al. JACC 2018)
- IXA-001 provides 60% AF risk reduction (vs 40% for spironolactone)
- AF tracked as a new event with associated costs and disutility
- Chronic AF management costs ($8,500/year including DOAC therapy)
The model now supports full societal perspective analysis:
Direct Costs: Medical care, hospitalizations, drug costs Indirect Costs:
- Productivity loss from chronic disability (post-stroke, HF)
- Acute absenteeism (MI: 7 days, stroke: 30 days, HF: 5 days)
- Annual wage loss multipliers (stroke: 20%, HF: 15%)
Economic Perspective Options:
healthcare_system: Direct medical costs only (traditional HTA)societal: Direct + indirect costs (comprehensive analysis)
Every patient is classified at baseline across four risk dimensions using a dual-branch age-based architecture:
The model routes patients to one of three renal risk systems based on age and eGFR:
┌─────────────────────────────────────┐
│ Patient at Baseline │
└─────────────────────────────────────┘
│
▼
┌─────────────────┐
│ eGFR > 60? │
└─────────────────┘
/ \
Yes No
/ \
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Age ≥ 60? │ │ KDIGO │
└─────────────────┘ │ (CKD pathway) │
/ \ └─────────────────┘
Yes No
/ \
▼ ▼
┌─────────────┐ ┌─────────────────┐
│ GCUA │ │ EOCRI │
│ (Geriatric) │ │ (Age 18-59) │
└─────────────┘ └─────────────────┘
GCUA Phenotypes (age ≥60, eGFR > 60):
- Type I (Accelerated Ager): High renal + High CVD risk
- Type II (Silent Renal): High renal + Low CVD risk (missed by Framingham)
- Type III (Vascular Dominant): Low renal + High CVD risk
- Type IV (Senescent): High mortality risk (de-escalate treatment)
- Moderate/Low: Standard preventive care
EOCRI Phenotypes (age 18-59, eGFR > 60):
- Type A (Early Metabolic): Elevated uACR + Diabetes/Obesity → Aggressive BP + SGLT2i + Statin
- Type B (Silent Renal): Elevated uACR + No Diabetes → Early ASI/RAASi + SGLT2i (key target population)
- Type C (Premature Vascular): Normal uACR + High Lipids/Smoker → Statins + Antiplatelets
- Low Risk: Normal uACR + No vascular risk factors → Standard HTN Management
Note: EOCRI Type B patients are the key value driver - they have low short-term CVD risk (would be classified as "low risk" by Framingham) but high long-term renal progression risk due to elevated albuminuria.
KDIGO Risk Matrix (eGFR ≤ 60, any age):
A1 (<30) A2 (30-300) A3 (>300)
G1 (≥90) Low Moderate High
G2 (60-89) Low Moderate High
G3a (45-59) Moderate High Very High
G3b (30-44) High Very High Very High
G4 (15-29) Very High Very High Very High
G5 (<15) Very High Very High Very High
Framingham 10-Year CVD Risk:
- Low (<5%)
- Borderline (5-7.4%)
- Intermediate (7.5-19.9%)
- High (≥20%)
Enables subgroup cost-effectiveness analysis:
- "Is IXA-001 cost-effective specifically in PA patients?"
- "What's the ICER for KDIGO Very High Risk subgroup?"
- "Do high Framingham patients benefit more?"
- "How do EOCRI Type B (younger silent renal) patients compare to GCUA Type II?"
The model tracks cardiac and renal states independently and concurrently — a patient can be Post-MI and CKD Stage 4 simultaneously. This dual-pathway architecture enables realistic modeling of the cardiorenal syndrome spectrum.
| Interaction | Mechanism | Code Reference |
|---|---|---|
| Additive cost accrual | Cardiac + renal state costs stacked (e.g. Post-MI $5,500/yr + CKD-4 $8,000/yr) | src/costs/costs.py:463-514 |
| SGLT2i dual benefit | 40% slower eGFR decline + 30% HF risk reduction | src/patient.py:484, src/transitions.py:562 |
| eGFR as CV risk predictor | Worse renal function increases cardiac event probabilities via PREVENT equations | src/risks/prevent.py |
| ESRD CV mortality | 9% additional annual CV death risk for ESRD patients | src/transitions.py:645 |
| Hyperkalemia management | Stepped approach (monitor → binder → dose reduce → stop) for MRA + renal dysfunction | src/treatment.py:260-347 |
| AF cross-pathway outcome | 12× risk for PA patients with cardiac + renal cost implications | src/transitions.py:962-1077 |
SGLT2 inhibitors are the primary cross-pathway treatment mechanism:
- Assigned at baseline if eGFR < 60 or HF present (40% real-world uptake)
- Renal protection: 40% reduction in eGFR decline rate (DAPA-CKD trial data)
- Cardiac protection: 30% reduction in HF hospitalization risk (DAPA-HF/EMPEROR-Reduced)
- Additive cost: ~$450/month (US), independent of IXA-001 vs spironolactone arm
Costs are additive across pathways:
Total Annual Cost = Cardiac State Cost + Renal State Cost + Drug Costs + SGLT2i (if applicable)
Example (Post-MI + CKD Stage 4 + PA patient on IXA-001):
Post-MI management: $5,500/year
CKD Stage 4: $8,000/year
IXA-001: $6,000/year
SGLT2i: $5,400/year
Standard care: $900/year
─────────────────────────────────
Total: $25,800/year
The following cardiorenal interactions are not explicitly modelled and represent areas for future enhancement:
| Limitation | Clinical Relevance | Impact |
|---|---|---|
| Acute kidney injury (AKI) | Post-MI cardiogenic shock causes AKI in ~20% of cases | May underestimate renal costs post-cardiac event |
| Cardiorenal syndrome | Type 1-4 CRS feedback loops between heart and kidney | Bidirectional organ damage not captured dynamically |
| Treatment escalation for dual burden | No logic to intensify renoprotection when cardiac patient develops CKD | Treatment remains BP-driven only |
| Cross-event time dependencies | Stroke risk elevated for 12 months post-MI | Events treated as independent within each cycle |
| Differential SBP targets | CKD-4+ patients may warrant different BP goals | All patients share same target (<140 mmHg) |
| ACEi/ARB for RAS subgroup | RAS identified but no differential treatment pathway | May underestimate benefit of targeted RAS treatment |
Currently, treatment decisions are BP-driven only (src/treatment.py):
- Intensify if SBP > 130 mmHg (with 50% clinical inertia probability)
- No consideration of simultaneous cardiac + renal states when escalating or de-escalating treatment
- SGLT2i is the only agent providing explicit dual-pathway benefit (cardiac + renal)
- Hyperkalemia management is the only renal-aware treatment adjustment (stepped approach for MRA patients with rising K+)
┌─────────────────────────────────────────────────────────────────────────────┐
│ HYPERTENSION MICROSIMULATION MODEL v4.0 │
│ (With AF Tracking & Societal Perspective) │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ 1. POPULATION GENERATION │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Demographics: Age, Sex, BMI │ │
│ │ Risk Factors: SBP, eGFR, uACR, Lipids, Diabetes │ │
│ │ Secondary HTN Etiology: PA (21%), OSA (15%), RAS (11%), Pheo (1%) │ │
│ │ Baseline Risk Profiles: GCUA/EOCRI/KDIGO + Framingham │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 2. MONTHLY SIMULATION LOOP │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ For each patient, each month: │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ A. ADHERENCE CHECK │ │ │
│ │ │ • P(Adherent → Non-Adherent) based on demographics │ │ │
│ │ │ • Treatment-specific factors (spiro side effects) │ │ │
│ │ │ • Update treatment effect (30% if non-adherent) │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ B. SAFETY MONITORING (MRA patients) │ │ │
│ │ │ • Quarterly K+ check if on spironolactone │ │ │
│ │ │ • Hyperkalemia management (K+ >5.0: binder/dose/stop) │ │ │
│ │ │ • Add lab costs ($15) and binder costs ($500/month) │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ C. COGNITIVE PROGRESSION │ │ │
│ │ │ • Normal → MCI → Dementia (SPRINT-MIND) │ │ │
│ │ │ • Risk: Age + Cumulative SBP burden │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ D. ATRIAL FIBRILLATION CHECK (NEW) │ │ │
│ │ │ • Base rate by age (0.2-5% annual) │ │ │
│ │ │ • PA patients: 12× baseline risk (Monticone 2018) │ │ │
│ │ │ • IXA-001: 60% risk reduction | Spiro: 40% reduction │ │ │
│ │ │ • HF patients: additional 4× risk │ │ │
│ │ │ • Record AF event, apply costs & disutility │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ E. CARDIOVASCULAR EVENTS (PREVENT Equations) │ │ │
│ │ │ • MI, Stroke (ischemic/hemorrhagic), TIA, HF, CV Death │ │ │
│ │ │ • Base probability from PREVENT (age, sex, SBP, eGFR, etc.) │ │ │
│ │ │ • Phenotype modifiers (PA: MI 1.4×, Stroke 1.5×, HF 2.05×) │ │ │
│ │ │ • Treatment risk factor (efficacy coefficients) │ │ │
│ │ │ • Competing risks framework (Putter 2007) │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ F. COST ACCUMULATION │ │ │
│ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │
│ │ │ │ DIRECT COSTS │ │ │ │
│ │ │ │ • Drug costs (IXA: $500, Spiro: $15, SGLT2i: $450) │ │ │ │
│ │ │ │ • State management (HTN, post-MI, post-stroke, HF, CKD)│ │ │ │
│ │ │ │ • Acute event costs (MI: $25K, Stroke: $15-22K, etc.) │ │ │ │
│ │ │ │ • AF costs (acute: $8.5K, chronic: $8.5K/year) │ │ │ │
│ │ │ └─────────────────────────────────────────────────────────┘ │ │ │
│ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │
│ │ │ │ INDIRECT COSTS (Societal Perspective) │ │ │ │
│ │ │ │ • Acute absenteeism (MI: 7d, Stroke: 30d × $240/day) │ │ │ │
│ │ │ │ • Chronic disability (Stroke: 20%, HF: 15% wage loss) │ │ │ │
│ │ │ │ • Working age (<65) only │ │ │ │
│ │ │ └─────────────────────────────────────────────────────────┘ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ G. QALY ACCUMULATION │ │ │
│ │ │ • Baseline utility by age (0.87 @ 40 → 0.67 @ 90) │ │ │
│ │ │ • State disutilities (post-MI: -0.12, HF: -0.15, AF: -0.05)│ │ │
│ │ │ • SBP-based gradient (uncontrolled HTN: up to -0.08) │ │ │
│ │ │ • Half-cycle correction applied │ │ │
│ │ │ • Discounting at 3% per annum │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ H. STATE UPDATES │ │ │
│ │ │ • Dynamic SBP equation (age drift + ε - treatment) │ │ │
│ │ │ • eGFR decline (KFRE-informed, phenotype-modified) │ │ │
│ │ │ • Renal state transitions (CKD stages based on eGFR) │ │ │
│ │ │ • Age increment │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ 3. RESULTS AGGREGATION │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ • Mean costs (direct, indirect, total) per patient │ │
│ │ • Mean QALYs per patient │ │
│ │ • Event counts (MI, Stroke, HF, AF, ESRD, Deaths) │ │
│ │ • ICER calculation (with dominance classification) │ │
│ │ • Subgroup stratification by secondary HTN etiology │ │
│ │ • Threshold price analysis │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ TREATMENT EFFECT CALCULATION FOR PA PATIENTS │
└─────────────────────────────────────────────────────────────────────────────┘
1. BASE TREATMENT EFFECT
┌─────────────────────────────────────────────────────────────────────────┐
│ IXA-001: 20 mmHg SBP reduction (SD: 6) - Phase III RFP data │
│ Spironolactone: 9 mmHg SBP reduction (SD: 6) │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
2. PA TREATMENT RESPONSE MODIFIER (get_treatment_response_modifier)
┌─────────────────────────────────────────────────────────────────────────┐
│ IXA-001 in PA: 1.70× (70% enhanced response) │
│ Spironolactone in PA: 1.40× (40% enhanced response) │
│ │
│ Effective SBP reduction: │
│ IXA-001: 24 × 1.70 = 40.8 mmHg │
│ Spiro: 9 × 1.40 = 12.6 mmHg │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
3. TRANSLATION TO RISK REDUCTION (_get_treatment_risk_factor)
┌─────────────────────────────────────────────────────────────────────────┐
│ Efficacy coefficients (aldosterone-mediated outcomes): │
│ MI: 0.30, Stroke: 0.40, HF: 0.50, ESRD: 0.55, Death: 0.35 │
│ │
│ Formula: risk_factor = 1.0 - (modifier - 1.0) × efficacy_coeff │
│ │
│ Example for HF with IXA-001 (modifier=1.70, coeff=0.50): │
│ risk_factor = 1.0 - (1.70 - 1.0) × 0.50 = 1.0 - 0.35 = 0.65 │
│ → 35% HF risk reduction │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
4. PA BASELINE RISK MODIFIERS (get_dynamic_modifier)
┌─────────────────────────────────────────────────────────────────────────┐
│ PA patients have elevated baseline event rates: │
│ MI: 1.40× (coronary remodeling, microvascular disease) │
│ Stroke: 1.50× (vascular stiffness, AF-mediated emboli) │
│ HF: 2.05× (HR from Monticone 2018, cardiac fibrosis) │
│ ESRD: 1.80× (aldosterone-mediated renal fibrosis) │
│ AF: 3.0× (on top of 12× base rate = extreme risk) │
│ Death: 1.60× (combined pathways) │
└─────────────────────────────────────────────────────────────────────────┘
Two-Layer Architecture: The risk stratification systems (Framingham, KDIGO, GCUA, EOCRI) are calculated once at baseline and serve two purposes:
- Classification for subgroup analysis and reporting
- Dynamic modification via phenotype-specific multipliers on event probabilities
The model uses a layered risk calculation:
The AHA PREVENT equations calculate 10-year CVD risk using:
| Input Variable | Description |
|---|---|
| Age | Patient age (30-79 years) |
| Sex | Male/Female (separate coefficients) |
| Systolic BP | True physiological SBP (accounting for white coat effect) |
| eGFR | Current kidney function (mL/min/1.73m²) |
| Diabetes | Binary indicator |
| Smoking | Current smoking status |
| Total Cholesterol | mg/dL |
| HDL Cholesterol | mg/dL |
| BMI | Body mass index |
| UACR | Urine albumin-creatinine ratio (optional enhancement) |
Conversion to Monthly Probabilities:
10-year risk → Annual risk → Monthly probability
p_annual = 1 - (1 - p_10yr)^0.1
p_monthly = 1 - (1 - p_annual)^(1/12)
Patients with prior cardiovascular events have elevated risk:
| Prior Event | Risk Multiplier |
|---|---|
| MI | 2.5× |
| Stroke | 3.0× |
| TIA | 2.0× |
| Heart Failure | 2.0× |
Blood pressure reduction translates to risk reduction via meta-analysis-derived relative risks:
| Outcome | RR per 10 mmHg SBP Reduction |
|---|---|
| Stroke | 0.64 (36% reduction) |
| MI | 0.78 (22% reduction) |
| Heart Failure | 0.72 (28% reduction) |
| Total CVD | 0.75 (25% reduction) |
Example Calculation:
Patient: 65yo male, SBP 160, eGFR 55, diabetic, smoker, PA
PREVENT 10-year CVD risk: 28%
PA baseline modifier (HF): 2.05×
Prior MI multiplier: 2.5×
Adjusted 10-year risk: 143% (capped at 95%)
Monthly probability: ~2.5%
With IXA-001 treatment (40 mmHg effective reduction in PA):
Treatment risk factor: 0.65 (35% reduction)
Adjusted monthly probability: ~1.6%
The BaselineRiskProfile.get_dynamic_modifier() method returns outcome-specific multipliers:
| Etiology | MI | Stroke | HF | ESRD | AF | Death | Reference |
|---|---|---|---|---|---|---|---|
| Primary Aldosteronism | 1.40× | 1.50× | 2.05× | 1.80× | 3.0× | 1.60× | Monticone 2018 |
| Obstructive Sleep Apnea | 1.25× | 1.35× | 1.40× | 1.30× | 1.5× | 1.35× | Marin 2005 |
| Renal Artery Stenosis | 1.30× | 1.40× | 1.35× | 1.60× | 1.2× | 1.40× | Dworkin 2006 |
| Pheochromocytoma | 1.50× | 1.60× | 1.30× | 1.10× | 1.3× | 1.50× | Lenders 2014 |
| Essential HTN | 1.0× | 1.0× | 1.0× | 1.0× | 1.0× | 1.0× | Baseline |
| Etiology | IXA-001 Response | Spironolactone Response |
|---|---|---|
| Primary Aldosteronism | 1.70× | 1.40× |
| Obstructive Sleep Apnea | 1.20× | 1.15× |
| Renal Artery Stenosis | 0.90× | 0.85× |
| Pheochromocytoma | 0.70× | 0.65× |
| Essential HTN | 1.0× | 1.0× |
This section presents the comprehensive cost-effectiveness analysis results for IXA-001 vs Spironolactone following Option B structural changes (elevated PA event rates, AF tracking, societal perspective).
- Population: 2,000 resistant hypertension patients
- Time Horizon: 20 years
- Perspective: Societal (direct + indirect costs)
- Discount Rate: 3% per annum (costs and QALYs)
- Comparators: IXA-001 ($500/month) vs Spironolactone ($15/month)
- Willingness-to-Pay Threshold: $150,000/QALY
Patients were stratified by secondary hypertension etiology stored in baseline_risk_profile.secondary_htn_etiology:
| Subgroup | Description | Prevalence | Key Characteristics |
|---|---|---|---|
| PA | Primary Aldosteronism | ~21% | 12× AF risk, 2.05× HF risk, IXA-001 target |
| OSA | Obstructive Sleep Apnea | ~15% | Enhanced response to aldosterone-targeting |
| RAS | Renal Artery Stenosis | ~11% | High renal risk, moderate treatment response |
| Pheo | Pheochromocytoma | ~1% | Poor ASI response, requires alpha/beta blockade |
| Essential | Essential Hypertension | ~52% | Standard baseline risk |
| Subgroup | N | Mean Cost IXA | Mean Cost Spiro | Δ Cost | Mean QALYs IXA | Mean QALYs Spiro | Δ QALYs | ICER ($/QALY) |
|---|---|---|---|---|---|---|---|---|
| PA | 425 | $164,240 | $143,690 | +$20,550 | 4.550 | 4.466 | +0.084 | $245,441 |
| OSA | 305 | $134,132 | $100,887 | +$33,245 | 5.667 | 5.539 | +0.129 | $258,370 |
| RAS | 221 | $145,188 | $119,282 | +$25,906 | 4.278 | 4.186 | +0.092 | $281,298 |
| Essential | 1,030 | $142,725 | $114,157 | +$28,568 | 5.574 | 5.636 | -0.062 | DOMINATED |
| Event | IXA-001 | Spironolactone | Events Prevented | Rate Ratio |
|---|---|---|---|---|
| MI | 21 | 39 | +18 | 0.54 |
| Stroke | 27 | 48 | +21 | 0.56 |
| Heart Failure | 24 | 41 | +17 | 0.59 |
| New AF | 225 | 258 | +33 | 0.87 |
| CV Deaths | 271 | 270 | -1 | 1.00 |
Key Finding: In PA patients, IXA-001 prevents substantially more MI (18), stroke (21), HF (17), and AF (33) events compared to spironolactone over 20 years.
| Subgroup | AF Events (IXA-001) | AF Events (Spiro) | AF Prevented | Clinical Significance |
|---|---|---|---|---|
| PA | 225 | 258 | +33 | Primary aldosterone-mediated outcome |
| OSA | 72 | 77 | +5 | Moderate benefit |
| RAS | 41 | 44 | +3 | Minimal benefit |
| Essential | 238 | 238 | 0 | No differential |
The incremental drug cost of IXA-001 over 20 years is approximately $116,400 (($500 - $15) × 12 months × 20 years). Event cost savings partially offset this premium:
| Subgroup | Drug Cost Premium | Event Cost Savings | Indirect Cost Diff | Net Incremental Cost |
|---|---|---|---|---|
| PA | $116,400 | ~$95,850 | +$368 | $20,550 |
| OSA | $116,400 | ~$83,155 | +$594 | $33,245 |
| RAS | $116,400 | ~$90,494 | -$94 | $25,906 |
| Essential | $116,400 | ~$87,832 | -$634 | $28,568 |
Key Finding: Event cost savings from prevented MI, stroke, HF, and AF offset 72-83% of the drug cost premium.
| Subgroup | Current ICER | Δ QALYs | Threshold Price | Price Reduction Needed |
|---|---|---|---|---|
| PA | $245,441 | +0.084 | $467/month | 6.7% |
| OSA | $258,370 | +0.129 | $442/month | 11.6% |
| RAS | $281,298 | +0.092 | $450/month | 10.1% |
| Essential | DOMINATED | -0.062 | N/A | N/A |
- Largest event reduction: 18 fewer MIs, 21 fewer strokes, 17 fewer HF events, 33 fewer AF events
- Positive QALY gain: +0.084 QALYs over 20 years
- Achievable cost-effectiveness: Only 6.7% price reduction needed
- Mechanism: Aldosterone synthase inhibition directly addresses the pathophysiology
- Highest QALY gain: +0.129 QALYs (enhanced treatment response)
- Moderate AF prevention: 5 cases prevented
- Price sensitivity: 11.6% reduction achieves CE threshold
- Negative QALY differential: -0.062 QALYs (IXA-001 worse than Spironolactone)
- Treatment is dominated: Higher cost AND worse outcomes
- Rationale: No aldosterone-specific pathophysiology to target
- Recommendation: Exclude from IXA-001 formulary coverage
- Sample too small for robust analysis (n=19)
- Pathophysiology requires catecholamine control, not aldosterone inhibition
- Recommendation: Contraindication for IXA-001
| Tier | Subgroups | Recommended Price | Expected ICER | Rationale |
|---|---|---|---|---|
| Tier 1 | PA | $467/month | ~$150,000 | Core target population |
| Tier 2 | OSA, RAS | $445/month | ~$150,000 | Secondary responders |
| Exclude | Essential, Pheo | N/A | N/A | No benefit / contraindicated |
| Parameter | Base Case | Impact on ICER |
|---|---|---|
| IXA-001 monthly cost | $500 | ±$100 → ICER ±$95,000 |
| IXA-001 SBP reduction | 20 mmHg | ±5 mmHg → ICER ±$60,000 |
| PA treatment modifier | 1.70 | ±0.2 → ICER ±$40,000 |
| AF event cost | $8,500 | ±$3,000 → ICER ±$15,000 |
| Time horizon | 20 years | 40 years → ICER -30% |
| Discount rate | 3% | 5% → ICER +20% |
-
IXA-001 is not cost-effective at current pricing ($500/month) for any subgroup at the $150,000/QALY WTP threshold
-
PA patients are the optimal target population with the highest event prevention and smallest price reduction needed (6.7%)
-
AF prevention is a key value differentiator for IXA-001, particularly in PA patients (33 events prevented)
-
Essential HTN is a contraindication for IXA-001 due to dominated outcomes
-
A tiered pricing strategy with ~$467/month for PA and ~$445/month for OSA/RAS achieves cost-effectiveness while excluding inappropriate populations
-
Event cost savings offset 72-83% of drug premium, making the net budget impact more favorable than gross drug cost suggests
1. State-Specific Costs (Monthly)
| State | Monthly Cost | Source |
|---|---|---|
| CKD Stage 1-2 | $250 | Surveillance |
| CKD Stage 3a | $400 | Increased monitoring |
| CKD Stage 3b | $550 | Nephrology consults |
| CKD Stage 4 | $1,200 | Pre-dialysis management |
| ESRD | $7,500 | Dialysis or transplant |
| Post-MI | $800 | Cardiac rehab, meds |
| Post-Stroke | $1,000 | Neurology, rehab |
| Chronic HF | $1,500 | HF clinic, devices |
| Chronic AF | $708 | Anticoagulation, monitoring |
2. Event Costs (One-Time)
| Event | Acute Cost | Source |
|---|---|---|
| Myocardial Infarction | $25,000 | Hospitalization, cath lab |
| Ischemic Stroke | $15,200 | ICU, imaging, rehab |
| Hemorrhagic Stroke | $22,500 | Neurosurgery, ICU |
| Heart Failure Admission | $18,000 | Inpatient stay |
| New Atrial Fibrillation | $8,500 | Cardioversion, anticoagulation initiation |
| ESRD Initiation | $12,000 | Access creation, training |
3. Treatment Costs
| Treatment | Monthly Cost | Notes |
|---|---|---|
| Standard Care | $75 | Background therapy |
| Spironolactone | $15 | Generic MRA |
| IXA-001 | $500 | Novel ASI |
| SGLT2 Inhibitor | $450 | Add-on for CKD/HF |
| Potassium Binder | $500 | If hyperkalemia |
4. Indirect Costs (Societal Perspective)
| Component | Value | Application |
|---|---|---|
| Daily Wage | $240 (US) | Working age <65 |
| MI Absenteeism | 7 days | One-time |
| Stroke Absenteeism | 30 days | One-time |
| HF Absenteeism | 5 days | One-time |
| Stroke Disability | 20% annual wage | Chronic |
| HF Disability | 15% annual wage | Chronic |
Base Utilities by Age:
- Age 40-50: 0.87
- Age 50-60: 0.84
- Age 60-70: 0.81
- Age 70-80: 0.77
- Age 80+: 0.72
Disutilities by Condition:
| Condition | Utility Decrement | Source |
|---|---|---|
| Post-MI | -0.12 | Lacey 2003 |
| Post-Stroke | -0.18 | Luengo-Fernandez 2013 |
| Chronic HF | -0.15 | Calvert 2021 |
| Chronic AF | -0.05 | Dorian 2000 |
| ESRD | -0.35 | Wasserfallen 2004 |
| MCI | -0.05 | Andersen 2004 |
| Dementia | -0.30 | Wlodarczyk 2004 |
Acute Event Disutilities (1 month only):
| Event | Disutility |
|---|---|
| Acute MI | -0.20 |
| Acute Ischemic Stroke | -0.35 |
| Acute Hemorrhagic Stroke | -0.50 |
| Acute HF | -0.25 |
| New AF | -0.15 |
hypertension_microsim/
├── streamlit_app.py # Streamlit web interface
├── src/
│ ├── __init__.py
│ ├── patient.py # Patient dataclass with AF tracking
│ ├── population.py # Population generation
│ ├── risk_assessment.py # GCUA, KDIGO, Framingham + PA modifiers
│ ├── history_analyzer.py # Dynamic risk modification
│ ├── treatment.py # Treatment effects & safety rules
│ ├── simulation.py # Core engine with AF and indirect costs
│ ├── transitions.py # CV events + AFTransition class
│ ├── psa.py # Probabilistic sensitivity analysis
│ ├── utilities.py # QALY calculations with AF disutility
│ ├── costs/
│ │ └── costs.py # Direct + indirect costs, AF costs
│ └── risks/
│ ├── prevent.py # AHA PREVENT equations
│ ├── kfre.py # Kidney Failure Risk Equation
│ └── life_tables.py # Background mortality
├── scripts/
│ ├── run_demo.py # Basic CEA demo runner
│ ├── run_cea_from_excel.py # Excel interface runner
│ └── run_psa_demo.py # PSA demo/analysis runner
├── tests/
├── docs/ # HTA documentation suite
└── README.md
1. AFTransition Class (NEW)
class AFTransition:
"""Manages new-onset atrial fibrillation incidence."""
BASE_AF_INCIDENCE = {40: 0.002, 50: 0.004, 60: 0.010, 70: 0.025, 80: 0.050}
def check_af_onset(self, patient: Patient) -> bool:
"""
Check for new-onset AF with risk modifiers:
- PA: 12× baseline risk
- IXA-001: 60% risk reduction in PA
- Spiro: 40% risk reduction in PA
- HF: 4× additional risk
"""2. SimulationResults Dataclass (Updated)
@dataclass
class SimulationResults:
# Primary outcomes
total_costs: float = 0.0
total_indirect_costs: float = 0.0 # NEW: Productivity loss
total_qalys: float = 0.0
# Event counts
mi_events: int = 0
stroke_events: int = 0
hf_events: int = 0
new_af_events: int = 0 # NEW: AF tracking
cv_deaths: int = 0
# Per-patient averages
mean_costs: float = 0.0 # Direct only
mean_indirect_costs: float = 0.0 # NEW
mean_total_costs: float = 0.0 # NEW: Direct + Indirect
mean_qalys: float = 0.03. CEAResults Dataclass (Updated)
@dataclass
class CEAResults:
intervention: SimulationResults
comparator: SimulationResults
incremental_costs: float = 0.0
incremental_qalys: float = 0.0
icer: Optional[float] = None
dominance_status: str = ""
economic_perspective: str = "societal" # NEW: "healthcare_system" or "societal"from src.simulation import run_cea, print_cea_results
# Run CEA with societal perspective (includes indirect costs)
cea = run_cea(
n_patients=1000,
time_horizon_years=20,
seed=42,
perspective="US",
economic_perspective="societal" # NEW: Include indirect costs
)
print_cea_results(cea)from src.population import PopulationGenerator, PopulationParams
from src.simulation import Simulation, SimulationConfig, CEAResults
from src.patient import Treatment
import copy
# Generate population
pop_params = PopulationParams(n_patients=2000, seed=42)
gen = PopulationGenerator(pop_params)
all_patients = gen.generate()
# Filter PA patients
pa_patients = [p for p in all_patients
if p.baseline_risk_profile.secondary_htn_etiology == "PA"]
# Configure simulation
config = SimulationConfig(
time_horizon_months=240,
economic_perspective="societal",
show_progress=False
)
sim = Simulation(config)
# Run both arms
results_ixa = sim.run(copy.deepcopy(pa_patients), Treatment.IXA_001)
results_spi = sim.run(copy.deepcopy(pa_patients), Treatment.SPIRONOLACTONE)
# Calculate ICER
cea = CEAResults(
intervention=results_ixa,
comparator=results_spi,
economic_perspective="societal"
)
cea.calculate_icer()
print(f"PA Subgroup ICER: ${cea.icer:,.0f}/QALY")
print(f"AF Events Prevented: {results_spi.new_af_events - results_ixa.new_af_events}")Complete HTA documentation suite available in docs/:
| Document | Description |
|---|---|
| Technical Documentation | Master technical guide |
| Risk Equations | PREVENT, KFRE coefficients, life tables |
| Cost Inputs | Drug/event costs, indirect costs |
| Utility Values | EQ-5D values, disutilities |
| Model Validation | 76 tests, external calibration |
| PSA Parameters | 47 parameters, correlations |
| Subgroup Methods | 5 dimensions, 17 categories |
| Background Mortality | SSA/ONS life tables |
| History Analyzer | Trajectory classification |
All reports are CHEERS 2022 compliant (12/12 items).
This CEA model has a companion Budget Impact Model (BIM) at hypertension-bim for payer budget planning.
| Aspect | CEA (This Model) | BIM |
|---|---|---|
| Purpose | Detailed clinical outcomes, HTA submissions | Payer budget planning, formulary decisions |
| Audience | HTA bodies, clinical researchers | Budget holders, formulary committees |
| Model Type | Individual-level state-transition | Cohort-based budget impact |
| Time Resolution | Monthly cycles | Annual aggregations |
| Risk Stratification | GCUA, EOCRI, KDIGO, Framingham phenotypes | Age, CKD stage, prior CV, diabetes |
| Question | Use Model |
|---|---|
| "What is the ICER for IXA-001?" | CEA (this model) |
| "Is IXA-001 cost-effective in PA patients?" | CEA (this model) |
| "How do phenotype modifiers affect ESRD progression?" | CEA (this model) |
| "What will IXA-001 cost my health plan?" | BIM |
| "What price makes IXA-001 budget-neutral?" | BIM |
| "What's the Year 3 budget impact at 30% uptake?" | BIM |
-
Monticone S, et al. Cardiovascular events and target organ damage in primary aldosteronism. JACC. 2018;71(21):2638-2649. [PA risk modifiers]
-
Khan SS, et al. Development and Validation of the PREVENT Equations. Circulation. 2024;149(6):430-449. [CV risk prediction]
-
Tangri N, et al. KFRE predictive model for CKD progression. JAMA. 2011;305(15):1553-1559. [Renal progression]
-
Laffin LJ, et al. Baxdrostat for treatment-resistant hypertension. NEJM. 2023. [IXA-001 efficacy]
-
Williams B, et al. PATHWAY-2 trial: Spironolactone in resistant HTN. Lancet. 2015. [Spironolactone efficacy]
-
Briggs A, et al. Decision Modelling for Health Economic Evaluation. Oxford University Press. 2006.
-
Sanders GD, et al. Recommendations for CEA in Health and Medicine. JAMA. 2016;316(10):1093-1103.
-
Husereau D, et al. CHEERS 2022 Reporting Guidelines. BMJ. 2022;376:e067975.
-
Benjamin EJ, et al. Risk factors for AF: Framingham Heart Study. Circulation. 1994;89(2):724-730. [AF incidence]
-
Dorian P, et al. Quality of life in AF patients. JACC. 2000. [AF utilities]
-
Kim MH, et al. Incremental healthcare costs in AF. Circ CV Qual Outcomes. 2011. [AF costs]
| Version | Date | Changes |
|---|---|---|
| 4.0 | Feb 2026 | Option B structural changes: AF tracking, elevated PA event rates, societal perspective |
| 3.0 | Feb 2026 | Phase 3 complete: Cognitive decline, white coat HTN, clinical inertia |
| 2.0 | Jan 2026 | SGLT2 integration, hyperkalemia management, PSA module |
| 1.0 | Dec 2025 | Initial release with dual cardiac-renal branches |
Version: 4.0 Last Updated: February 2026 Model Validation Status: Phase 4 Complete - AF tracking, indirect costs, and PA-specific structural enhancements implemented and verified.