Skip to content
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions crcsim/experiment/README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Experiment: Test 100% and 80% Diagnostic Compliance for FQHCs and No Screening, All FIT, and ALL Colonocscopy
# Experiment: ACCSIS Runs and No Screening, All FIT, and ALL Colonocscopy

This branch tests 80% and 100% compliance for FQHCs 1-8 with differing screening uptake, differing test costs, and low and extra low costs for Stage III and Stage IV inital treatment. Scenarios for no screening, 100% colonoscopy, and 100% FIT were also added.
This branch tests ACCSIS inital and diagnostic screening compliance for different sites. Scenarios for no screening, 100% colonoscopy, and 100% FIT were also added to ensure model is running as expected.

## Results

The results for the 100% diagnostic compliance match a previous run from April 2025. The results differ between 80% and 100% compliance.
The results for the 100% diagnostic compliance match a previous run from April 2025. Results for NC are included now but more will be added.

## Experiment Workflow

Expand Down Expand Up @@ -70,7 +70,7 @@ The subdirectories and files in `scenarios/` must be uploaded to AWS S3 for the

To upload the files to S3, run
```
aws s3 cp ./scenarios s3://crcsim-exp-fqhc-diagnostic-compliance-comp-additional-scenarios/scenarios --recursive
aws s3 cp ./scenarios s3://crcsim-exp-accsis-scenarios/scenarios --recursive
```
*(Another note: this manual step is necessary because `boto3` does not include functionality to upload a directory to S3 recursively. Future experiments could improve this workflow by writing a function to upload the directory recursively in `prepare.py`. Or submit a patch to resolve https://github.com/boto/boto3/issues/358)*

Expand Down
152 changes: 44 additions & 108 deletions crcsim/experiment/prepare.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import json
import random
from copy import deepcopy
from enum import Enum, unique
from pathlib import Path
from typing import Callable, Dict, List, Optional
Expand All @@ -27,6 +26,11 @@ class Test(Enum):
COLONOSCOPY = "Colonoscopy"


@unique
class IRR(Enum):
irr = 1.19


@unique
class ConditionalComplianceParam(Enum):
PREV_COMPLIANT = "compliance_rate_given_prev_compliant"
Expand Down Expand Up @@ -200,122 +204,54 @@ def transform(params):
def create_scenarios() -> List:
# For each health center, define the initial compliance rate in the baseline
# scenario and the implementation scenario and vary diagnostic compliance.
initial_compliance = {
"fqhc1": (0.522, 0.593),
"fqhc2": (0.154, 0.421),
"fqhc3": (0.519, 0.568),
"fqhc4": (0.278, 0.374),
"fqhc5": (0.383, 0.572),
"fqhc6": (0.211, 0.392),
"fqhc7": (0.257, 0.354),
"fqhc8": (0.190, 0.390),
}
low_initial_stage_3_treatment_cost = 67_300
low_initial_stage_4_treatment_cost = 97_931
extra_low_initial_stage_3_treatment_cost = 50_000
extra_low_initial_stage_4_treatment_cost = 80_000

diagnostic_compliance_rates = {
"100Compliance": 1.0,
"80Compliance": 0.8,
}

FIT_cost_dict = {
"Public": 22,
"Patient+Public": 44,
compliance_rates = {
"NC": {
"initial": (0.097, 0.300),
"diagnostic": (0.444, 0.688),
},
# other items
}

Colonoscopy_cost_dict = {
"Public": 912,
"Patient+Public": 1437,
costs = {
"public": {
"FIT": 22,
"Colonoscopy": 912,
},
#'Patient-Public": {"FIT": 44, "Colonoscopy": 1437,}
}

scenarios = []

for fqhc, screening_rates in initial_compliance.items():
for compliance, diagnostic_rate in diagnostic_compliance_rates.items():
for cost_category in (
FIT_cost_dict.keys() & Colonoscopy_cost_dict.keys()
): # Only common keys
FIT_cost = FIT_cost_dict[cost_category]
Col_cost = Colonoscopy_cost_dict[cost_category]
baseline = (
Scenario(
name=f"{fqhc}_{cost_category}_{compliance}_baseline",
params=get_default_params(),
)
.transform(transform_initial_compliance(screening_rates[0]))
.transform(transform_diagnostic_compliance(diagnostic_rate))
.transform(transform_test_cost(Test.FIT, FIT_cost))
.transform(transform_test_cost(Test.COLONOSCOPY, Col_cost))
)
scenarios.append(baseline)

implementation = (
Scenario(
name=f"{fqhc}_{cost_category}_{compliance}_implementation",
params=get_default_params(),
)
.transform(transform_initial_compliance(screening_rates[1]))
.transform(transform_diagnostic_compliance(diagnostic_rate))
.transform(transform_test_cost(Test.FIT, FIT_cost))
.transform(transform_test_cost(Test.COLONOSCOPY, Col_cost))
for site, rates in compliance_rates.items():
for cost_category, test_costs in costs.items():
FIT_cost = test_costs["FIT"]
Col_cost = test_costs["Colonoscopy"]
baseline = (
Scenario(
name=f"{site}_{cost_category}_baseline",
params=get_default_params(),
)
scenarios.append(implementation)

# Sensitivity analysis 2. Lower cost for stage III and stage IV initial phase
baseline_low_cost = deepcopy(baseline)
baseline_low_cost.transform(
transform_treatment_cost(
"3", "initial", low_initial_stage_3_treatment_cost
)
).transform(
transform_treatment_cost(
"4", "initial", low_initial_stage_4_treatment_cost
)
)
baseline_low_cost.name = f"{fqhc}_{cost_category}_{compliance}_baseline_low_initial_treat_cost"
scenarios.append(baseline_low_cost)

implementation_low_cost = deepcopy(implementation)
implementation_low_cost.transform(
transform_treatment_cost(
"3", "initial", low_initial_stage_3_treatment_cost
)
).transform(
transform_treatment_cost(
"4", "initial", low_initial_stage_4_treatment_cost
)
)
implementation_low_cost.name = f"{fqhc}_{cost_category}_{compliance}_implementation_low_initial_treat_cost"
scenarios.append(implementation_low_cost)

# Sensitivity analysis 2a. Extra low cost for stage III and stage IV initial phase
baseline_extra_low_cost = deepcopy(baseline)
baseline_extra_low_cost.transform(
transform_treatment_cost(
"3", "initial", extra_low_initial_stage_3_treatment_cost
)
).transform(
transform_treatment_cost(
"4", "initial", extra_low_initial_stage_4_treatment_cost
)
)
baseline_extra_low_cost.name = f"{fqhc}_{cost_category}_{compliance}_baseline_extra_low_initial_treat_cost"
scenarios.append(baseline_extra_low_cost)

implementation_extra_low_cost = deepcopy(implementation)
implementation_extra_low_cost.transform(
transform_treatment_cost(
"3", "initial", extra_low_initial_stage_3_treatment_cost
)
).transform(
transform_treatment_cost(
"4", "initial", extra_low_initial_stage_4_treatment_cost
)
.transform(transform_initial_compliance(rates["initial"][0]))
.transform(transform_diagnostic_compliance(rates["diagnostic"][0]))
.transform(transform_test_cost(Test.FIT, FIT_cost))
.transform(transform_test_cost(Test.COLONOSCOPY, Col_cost))
.transform(transform_lesion_risk_alpha(IRR.irr.value))
)
scenarios.append(baseline)

implementation = (
Scenario(
name=f"{site}_{cost_category}_implementation",
params=get_default_params(),
)
implementation_extra_low_cost.name = f"{fqhc}_{cost_category}_{compliance}_implementation_extra_low_initial_treat_cost"
scenarios.append(implementation_extra_low_cost)
.transform(transform_initial_compliance(rates["initial"][1]))
.transform(transform_diagnostic_compliance(rates["diagnostic"][1]))
.transform(transform_test_cost(Test.FIT, FIT_cost))
.transform(transform_test_cost(Test.COLONOSCOPY, Col_cost))
.transform(transform_lesion_risk_alpha(IRR.irr.value))
)
scenarios.append(implementation)

# No screening baseline scenario
no_screening = (
Expand Down
6 changes: 3 additions & 3 deletions crcsim/experiment/run_iteration.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ if [ ! -d "$output_dir" ]; then
mkdir $output_dir
fi

aws s3 cp "s3://crcsim-exp-fqhc-diagnostic-compliance-comp-additional-scenarios/scenarios/$scenario/params.json" "./params.json"
aws s3 cp "s3://crcsim-exp-accsis-scenarios/scenarios/$scenario/params.json" "./params.json"

crc-simulate \
--npeople=$npeople \
Expand All @@ -23,5 +23,5 @@ crc-simulate \
crc-analyze \
--params-file=./params.json &&

aws s3 cp ./results.csv "s3://crcsim-exp-fqhc-diagnostic-compliance-comp-additional-scenarios/scenarios/$scenario/results_$iteration.csv"
aws s3 cp ./output.csv "s3://crcsim-exp-fqhc-diagnostic-compliance-comp-additional-scenarios/$scenario/output_$iteration.csv"
aws s3 cp ./results.csv "s3://crcsim-exp-accsis-scenarios/scenarios/$scenario/results_$iteration.csv"
aws s3 cp ./output.csv "s3://crcsim-exp-accsis-scenarios/$scenario/output_$iteration.csv"
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,11 @@
"surveillance_freq_cancer_rest": 5,
"surveillance_end_age": 85,
"use_conditional_compliance": true,
"initial_compliance_rate": 0.593,
"initial_compliance_rate": 0.097,
"never_compliant_rate": 0.0,
"diagnostic_compliance_rate": 1.0,
"diagnostic_compliance_rate": 0.444,
"surveillance_compliance_rate": 1.0,
"lesion_risk_alpha": 0.47,
"lesion_risk_alpha": 0.5592999999999999,
"lesion_risk_beta": 2.45,
"lesion_incidence_ages": [
0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,11 @@
"surveillance_freq_cancer_rest": 5,
"surveillance_end_age": 85,
"use_conditional_compliance": true,
"initial_compliance_rate": 0.522,
"initial_compliance_rate": 0.3,
"never_compliant_rate": 0.0,
"diagnostic_compliance_rate": 1.0,
"diagnostic_compliance_rate": 0.688,
"surveillance_compliance_rate": 1.0,
"lesion_risk_alpha": 0.47,
"lesion_risk_alpha": 0.5592999999999999,
"lesion_risk_beta": 2.45,
"lesion_incidence_ages": [
0,
Expand Down
Loading
Loading