Skip to content
Closed
Show file tree
Hide file tree
Changes from all 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 are for 100% FIT and differing diagnostic anf initial compliance with public cost. Results for North Carolina, Appalachia, Oregon, and Chicago are included now.

## 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
159 changes: 51 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 Down Expand Up @@ -200,122 +199,66 @@ 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),
},
"APP": {
"initial": (0.439, 0.529),
"diagnostic": (0.6, 0.6),
},
"OR": {
"initial": (0.045, 0.118),
"diagnostic": (0.15, 0.43),
},
"CHI": {
"initial": (0.403, 0.483),
"diagnostic": (0.6, 0.6),
},
}

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))
)
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
)
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"]
irr = 1.19
baseline = (
Scenario(
name=f"{site}_{cost_category}_baseline",
params=get_default_params(),
)
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))
)
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))
)
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.522,
"initial_compliance_rate": 0.439,
"never_compliant_rate": 0.0,
"diagnostic_compliance_rate": 1.0,
"diagnostic_compliance_rate": 0.6,
"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.593,
"initial_compliance_rate": 0.529,
"never_compliant_rate": 0.0,
"diagnostic_compliance_rate": 1.0,
"diagnostic_compliance_rate": 0.6,
"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.403,
"never_compliant_rate": 0.0,
"diagnostic_compliance_rate": 0.8,
"diagnostic_compliance_rate": 0.6,
"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.593,
"initial_compliance_rate": 0.483,
"never_compliant_rate": 0.0,
"diagnostic_compliance_rate": 0.8,
"diagnostic_compliance_rate": 0.6,
"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