Skip to content

Scenario Comparison Tutorial

milad edited this page May 10, 2026 · 1 revision

Complete guide to comparing epidemic intervention strategies.


πŸ“‹ Table of Contents


🧠 What is Scenario Comparison?

Scenario comparison allows you to evaluate the effectiveness of different intervention strategies against a baseline (no intervention).

Why Compare Scenarios?

Question Answer
Is quarantine effective? Compare with/without quarantine
Which strategy works better? Compare quarantine vs vaccination
What if we combine strategies? Test combined scenario
How much reduction? Quantitative metrics

πŸ“Š Available Scenarios

1. Baseline (No Intervention)

Description: No control measures, disease spreads freely.

from sir_simulator.advanced_features.scenario_comparison import ScenarioComparator

comp = ScenarioComparator()
scenarios, metrics = comp.compare_all_scenarios(days=120)

baseline = scenarios['Baseline']

Characteristics:

  • Highest peak infections
  • Earliest peak
  • Largest total cases

2. Quarantine

Description: Reduce contact between people (social distancing, lockdowns).

quarantine = comp.quarantine_scenario(
    days=150,
    start_day=10,      # Start quarantine day 10
    end_day=80,        # End quarantine day 80
    reduction_factor=0.2  # 80% reduction in transmission
)

Interventions included:

  • School closures
  • Work-from-home
  • Lockdowns
  • Travel restrictions

3. Vaccination

Description: Immunize susceptible population.

vaccination = comp.vaccination_scenario(
    days=150,
    start_day=5,               # Start vaccination day 5
    daily_vaccinations=15,     # Vaccinate 15 people/day
    vaccine_efficacy=0.9       # 90% effective
)

Interventions included:

  • Mass vaccination campaigns
  • Priority groups (elderly, healthcare workers)
  • Booster shots

4. Combined (Quarantine + Vaccination)

Description: Both strategies implemented simultaneously.

combined = comp.combined_scenario(
    days=150,
    quarantine_start=10,
    quarantine_end=80,
    quarantine_reduction=0.2,
    vaccination_start=5,
    daily_vaccinations=12
)

Benefits:

  • Best of both worlds
  • Often more effective than either alone
  • Realistic for modern pandemics

🎯 Intervention Strategies Explained

Quarantine Parameters

Parameter Description Typical Range
start_day When quarantine begins 5-20 days
end_day When quarantine ends 60-120 days
reduction_factor Transmission reduction 0.1-0.5 (10%-50%)

Vaccination Parameters

Parameter Description Typical Range
start_day When vaccination starts 1-30 days
daily_vaccinations People vaccinated per day 5-100
vaccine_efficacy How well vaccine works 0.7-0.95 (70%-95%)

Combined Strategy Benefits

Strategy Peak Reduction Time to Eradication
Quarantine only 60-80% Slow
Vaccination only 50-70% Moderate
Combined 80-95% Fast

πŸ’» Code Examples

Basic Scenario Comparison

from sir_simulator.advanced_features.scenario_comparison import ScenarioComparator

# Create comparator with custom parameters
comp = ScenarioComparator(
    population=1000,
    initial_infected=5,
    beta=0.25,   # Infection rate
    gamma=0.1    # Recovery rate
)

# Run all scenarios
scenarios, metrics = comp.compare_all_scenarios(days=120)

# View results
print(metrics)

Output:

      scenario  peak_infected  peak_day reduction
0      Baseline            235        37      0.0%
1    Quarantine             21        10     90.9%
2   Vaccination             88        32     62.5%
3      Combined             20        10     91.2%

Individual Scenario Access

# Get specific scenario data
baseline_df = scenarios['Baseline']
quarantine_df = scenarios['Quarantine']
vaccination_df = scenarios['Vaccination']
combined_df = scenarios['Combined']

# Extract infected curve
baseline_infected = baseline_df['infected']
quarantine_infected = quarantine_df['infected']

Custom Scenario Parameters

# Strong quarantine (90% reduction)
comp_strong = ScenarioComparator(population=1000, beta=0.25, gamma=0.1)
strong_quarantine = comp_strong.quarantine_scenario(
    days=150,
    start_day=7,
    end_day=60,
    reduction_factor=0.1  # 90% reduction
)

# Weak quarantine (30% reduction)
comp_weak = ScenarioComparator(population=1000, beta=0.25, gamma=0.1)
weak_quarantine = comp_weak.quarantine_scenario(
    days=150,
    start_day=15,
    end_day=50,
    reduction_factor=0.7  # 30% reduction
)

πŸ“Š Visualizing Results

Basic Comparison Plot

import matplotlib.pyplot as plt

comp = ScenarioComparator(beta=0.25, gamma=0.1)
scenarios, metrics = comp.compare_all_scenarios(days=120)

# Colors and styles
colors = {
    'Baseline': 'blue',
    'Quarantine': 'green',
    'Vaccination': 'orange',
    'Combined': 'red'
}

plt.figure(figsize=(12, 6))

for name, df in scenarios.items():
    plt.plot(df['day'], df['infected'], 
             label=f"{name} (Peak: {df['infected'].max():.0f})", 
             color=colors.get(name, 'gray'),
             linewidth=2)

plt.xlabel('Day', fontsize=12)
plt.ylabel('Infected Population', fontsize=12)
plt.title('Epidemic Scenario Comparison', fontsize=14, fontweight='bold')
plt.legend(loc='upper right', fontsize=10)
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
plt.tight_layout()
plt.show()

Metric Visualization

import matplotlib.pyplot as plt
import numpy as np

comp = ScenarioComparator(beta=0.25, gamma=0.1)
scenarios, metrics = comp.compare_all_scenarios(days=120)

# Create bar chart
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Peak infected bar chart
scenario_names = metrics['scenario'].values
peak_infected = metrics['peak_infected'].values
colors_bar = ['blue', 'green', 'orange', 'red']

bars1 = ax1.bar(scenario_names, peak_infected, color=colors_bar, edgecolor='black', linewidth=1.5)
ax1.set_ylabel('Peak Infected', fontsize=12)
ax1.set_title('Peak Infection by Scenario', fontsize=14, fontweight='bold')
ax1.grid(True, alpha=0.3, axis='y')

# Add value labels on bars
for bar, value in zip(bars1, peak_infected):
    ax1.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 2, 
             str(value), ha='center', va='bottom', fontweight='bold')

# Reduction percentage bar chart
reductions = metrics['reduction'].str.rstrip('%').astype(float)
colors_bar = ['gray', 'green', 'orange', 'red']
bars2 = ax2.bar(scenario_names[1:], reductions[1:], color=colors_bar[1:], edgecolor='black', linewidth=1.5)
ax2.set_ylabel('Reduction (%)', fontsize=12)
ax2.set_title('Reduction vs Baseline', fontsize=14, fontweight='bold')
ax2.grid(True, alpha=0.3, axis='y')

# Add value labels on bars
for bar, value in zip(bars2, reductions[1:]):
    ax2.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1, 
             f"{value:.0f}%", ha='center', va='bottom', fontweight='bold')

plt.tight_layout()
plt.show()

Heatmap of Quarantine Effectiveness

import numpy as np
import matplotlib.pyplot as plt

# Test different quarantine parameters
start_days = [5, 10, 15, 20, 30]
reduction_factors = [0.1, 0.2, 0.3, 0.4, 0.5]

results = np.zeros((len(start_days), len(reduction_factors)))

for i, start_day in enumerate(start_days):
    for j, reduction in enumerate(reduction_factors):
        comp = ScenarioComparator(beta=0.25, gamma=0.1)
        quarantine = comp.quarantine_scenario(
            days=150,
            start_day=start_day,
            end_day=80,
            reduction_factor=reduction
        )
        baseline = comp.baseline_scenario(days=150)
        
        # Calculate peak reduction
        baseline_peak = baseline['infected'].max()
        quarantine_peak = quarantine['infected'].max()
        reduction_pct = (baseline_peak - quarantine_peak) / baseline_peak * 100
        results[i, j] = reduction_pct

# Create heatmap
fig, ax = plt.subplots(figsize=(10, 8))
im = ax.imshow(results, cmap='RdYlGn', aspect='auto', vmin=0, vmax=100)

# Add labels
ax.set_xticks(np.arange(len(reduction_factors)))
ax.set_yticks(np.arange(len(start_days)))
ax.set_xticklabels([f"{r:.1f}" for r in reduction_factors])
ax.set_yticklabels(start_days)
ax.set_xlabel('Reduction Factor (lower = stricter)', fontsize=12)
ax.set_ylabel('Start Day', fontsize=12)
ax.set_title('Quarantine Effectiveness (% Peak Reduction)', fontsize=14, fontweight='bold')

# Add colorbar
plt.colorbar(im, ax=ax, label='Peak Reduction (%)')

# Add text annotations
for i in range(len(start_days)):
    for j in range(len(reduction_factors)):
        text = ax.text(j, i, f"{results[i, j]:.0f}%",
                       ha="center", va="center", color="black", fontsize=9, fontweight='bold')

plt.tight_layout()
plt.show()

πŸ“ˆ Interpreting Metrics

Understanding Output Metrics

Metric Description Interpretation
peak_infected Maximum infected at once Hospital capacity needed
peak_day When peak occurs When to prepare resources
reduction % reduction vs baseline Effectiveness of intervention

Example Analysis

metrics = pd.DataFrame({
    'scenario': ['Baseline', 'Quarantine', 'Vaccination', 'Combined'],
    'peak_infected': [235, 21, 88, 20],
    'peak_day': [37, 10, 32, 10],
    'reduction': ['0.0%', '90.9%', '62.5%', '91.2%']
})

print(metrics)

What this tells us:

  • Baseline would overwhelm hospitals (235 patients)
  • Quarantine reduces peak by 91% (only 21 patients)
  • Vaccination reduces by 63% (88 patients)
  • Combined is most effective (20 patients, 91% reduction)

🌍 Real-World Applications

COVID-19 Policy Evaluation

Country Strategy Peak Reduction Outcome
New Zealand Strict quarantine 95% Very low cases
South Korea Testing + tracing 80% Controlled outbreak
Sweden No lockdown 0% (baseline) High cases

Vaccine Prioritization

# Test different vaccination strategies
comp = ScenarioComparator(beta=0.3, gamma=0.1)

# Strategy A: Vaccinate 50 people/day starting day 1
vaccine_A = comp.vaccination_scenario(
    start_day=1,
    daily_vaccinations=50,
    vaccine_efficacy=0.9
)

# Strategy B: Vaccinate 100 people/day starting day 10
vaccine_B = comp.vaccination_scenario(
    start_day=10,
    daily_vaccinations=100,
    vaccine_efficacy=0.9
)

# Compare peaks
peak_A = vaccine_A['infected'].max()
peak_B = vaccine_B['infected'].max()

print(f"Strategy A peak: {peak_A:.0f}")
print(f"Strategy B peak: {peak_B:.0f}")

🎯 Advanced Usage

Cost-Benefit Analysis

def cost_benefit_analysis(scenario_df, baseline_df, cost_per_day, cost_per_vaccine=0):
    """
    Calculate cost and benefit of intervention
    """
    # Calculate deaths (assuming 1% mortality)
    baseline_deaths = baseline_df['infected'].sum() * 0.01
    scenario_deaths = scenario_df['infected'].sum() * 0.01
    lives_saved = baseline_deaths - scenario_deaths
    
    # Calculate cost (example)
    intervention_days = len(scenario_df)  # Simplified
    total_cost = intervention_days * cost_per_day + cost_per_vaccine
    
    # Cost per life saved
    cost_per_life = total_cost / lives_saved if lives_saved > 0 else float('inf')
    
    return {
        'lives_saved': lives_saved,
        'total_cost': total_cost,
        'cost_per_life_saved': cost_per_life
    }

comp = ScenarioComparator(beta=0.25, gamma=0.1)
baseline = comp.baseline_scenario(days=150)
quarantine = comp.quarantine_scenario(days=150, start_day=10, end_day=80, reduction_factor=0.2)

analysis = cost_benefit_analysis(quarantine, baseline, cost_per_day=1e6, cost_per_vaccine=0)
print(f"Lives saved: {analysis['lives_saved']:.0f}")
print(f"Cost per life saved: ${analysis['cost_per_life_saved']:,.0f}")

Multiple Parameter Sweep

def parameter_sweep(beta_values, gamma_values):
    """Analyze many parameter combinations"""
    results = []
    
    for beta in beta_values:
        for gamma in gamma_values:
            comp = ScenarioComparator(beta=beta, gamma=gamma)
            scenarios, metrics = comp.compare_all_scenarios(days=120)
            
            baseline_peak = metrics[metrics['scenario'] == 'Baseline']['peak_infected'].values[0]
            quarantine_peak = metrics[metrics['scenario'] == 'Quarantine']['peak_infected'].values[0]
            
            reduction = (baseline_peak - quarantine_peak) / baseline_peak * 100
            
            results.append({
                'beta': beta,
                'gamma': gamma,
                'R0': beta / gamma,
                'baseline_peak': baseline_peak,
                'quarantine_peak': quarantine_peak,
                'reduction_pct': reduction
            })
    
    return pd.DataFrame(results)

# Run sweep
beta_range = [0.2, 0.3, 0.4, 0.5]
gamma_range = [0.05, 0.1, 0.15, 0.2]
results_df = parameter_sweep(beta_range, gamma_range)

print(results_df.head(10))

⚠️ Common Pitfalls

1. Starting Intervention Too Late

# Too late - outbreak already peaked
comp.quarantine_scenario(start_day=40)  # Peak at day 37, too late

# Optimal - before peak
comp.quarantine_scenario(start_day=10)  # Before peak, effective

2. Ending Quarantine Too Early

# Too early - outbreak rebounds
comp.quarantine_scenario(end_day=30)  # Rebound after lifting

# Proper - after outbreak controlled
comp.quarantine_scenario(end_day=80)  # No rebound

3. Vaccination Rate Unrealistic

# Unrealistic - can't vaccinate that fast
comp.vaccination_scenario(daily_vacccinations=1000, population=10000)

# Realistic
comp.vaccination_scenario(daily_vaccinations=50, population=10000)

πŸ“š Key Takeaways

Concept Summary
Scenarios Baseline, Quarantine, Vaccination, Combined
Key Metrics Peak infected, Peak day, Reduction %
Quarantine Reduces transmission, best if early
Vaccination Builds immunity, requires time
Combined Most effective strategy

πŸ”— Next Steps

  • API Reference - Complete function documentation
  • FAQ - Common questions and answers

⬆ Back to Home

Clone this wiki locally