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