Skip to content

Commit bd78100

Browse files
authored
Albrja/mic 5804/cpap artifact (#35)
Albrja/mic 5804/cpap artifact Add CPAP intervention data to artifact - *Category*: Data artifact - *JIRA issue*: https://jira.ihme.washington.edu/browse/MIC-5804 - *Research reference*: https://vivarium-research.readthedocs.io/en/latest/models/intervention_models/neonatal/cpap_intervention.html#calibration-strategy ### Changes and notes <!-- Change description – why, what, anything unexplained by the above. Include guidance to reviewers if changes are complex. --> ### Verification and Testing <!-- Details on how code was verified. Consider: plots, images, (small) csv files. -->
1 parent 9102369 commit bd78100

File tree

3 files changed

+167
-0
lines changed

3 files changed

+167
-0
lines changed

src/vivarium_gates_mncnh/constants/data_keys.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,30 @@ def log_name(self):
203203
NEONATAL_ENCEPHALOPATHY = __NeonatalEncephalopath()
204204

205205

206+
class __NoCPAPIntervention(NamedTuple):
207+
# Keys that will be loaded into the artifact. must have a colon type declaration
208+
P_RDS: str = "intervention.no_cpap_intervention.p_rds"
209+
P_HOME: str = "intervention.no_cpap_intervention.probability_home_birth"
210+
P_BEmONC: str = "intervention.no_cpap_intervention.probability_BEMONC_birth"
211+
P_CEmONC: str = "intervention.no_cpap_intervention.probability_CEmONC_birth"
212+
P_CPAP_BEmONC: str = "intervention.no_cpap_intervention.probability_CPAP_BEMONC"
213+
P_CPAP_CEmONC: str = "intervention.no_cpap_intervention.probability_CPAP_CEmONC"
214+
P_CPAP_HOME: str = "intervention.no_cpap_intervention.probability_CPAP_home"
215+
RELATIVE_RISK: str = "intervention.no_cpap_intervention.relative_risk"
216+
PAF: str = "intervention.no_cpap_intervention.population_attributable_fraction"
217+
218+
@property
219+
def name(self):
220+
return "no_CPAP_intervention"
221+
222+
@property
223+
def log_name(self):
224+
return "no CPAP intervention"
225+
226+
227+
NO_CPAP_INTERVENTION = __NoCPAPIntervention()
228+
229+
206230
MAKE_ARTIFACT_KEY_GROUPS = [
207231
POPULATION,
208232
# TODO: list all key groups here
@@ -215,4 +239,5 @@ def log_name(self):
215239
PRETERM_BIRTH,
216240
NEONATAL_SEPSIS,
217241
NEONATAL_ENCEPHALOPATHY,
242+
NO_CPAP_INTERVENTION,
218243
]

src/vivarium_gates_mncnh/constants/data_values.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from datetime import datetime
22
from typing import NamedTuple
33

4+
from vivarium_gates_mncnh.constants.data_keys import NO_CPAP_INTERVENTION
5+
46
############################
57
# Disease Model Parameters #
68
############################
@@ -239,3 +241,50 @@ class __Pipelines(NamedTuple):
239241

240242
PRETERM_DEATHS_DUE_TO_RDS_PROBABILITY = 0.85
241243
CHILD_INITIALIZATION_AGE = 0.1 / 365.0
244+
245+
246+
class __DeliveryFacilityTypes(NamedTuple):
247+
HOME = "home"
248+
CEmONC = "CEmONC"
249+
BEmONC = "BEmONC"
250+
NONE = "none"
251+
252+
253+
DELIVERY_FACILITY_TYPES = __DeliveryFacilityTypes()
254+
255+
256+
DELIVERY_FACILITY_TYPE_PROBABILITIES = {
257+
"Ethiopia": {
258+
NO_CPAP_INTERVENTION.P_HOME: 0.683,
259+
NO_CPAP_INTERVENTION.P_CEmONC: 0.266,
260+
NO_CPAP_INTERVENTION.P_BEmONC: 0.051,
261+
},
262+
"Nigeria": {
263+
NO_CPAP_INTERVENTION.P_HOME: 0.683,
264+
NO_CPAP_INTERVENTION.P_CEmONC: 0.266,
265+
NO_CPAP_INTERVENTION.P_BEmONC: 0.051,
266+
},
267+
"Pakistan": {
268+
NO_CPAP_INTERVENTION.P_HOME: 0.683,
269+
NO_CPAP_INTERVENTION.P_CEmONC: 0.266,
270+
NO_CPAP_INTERVENTION.P_BEmONC: 0.051,
271+
},
272+
}
273+
# Probability each of these facility types has access to CPAP
274+
CPAP_ACCESS_PROBABILITIES = {
275+
"Ethiopia": {
276+
NO_CPAP_INTERVENTION.P_CPAP_BEmONC: 0.075,
277+
NO_CPAP_INTERVENTION.P_CPAP_CEmONC: 0.393,
278+
NO_CPAP_INTERVENTION.P_CPAP_HOME: 0.0,
279+
},
280+
"Nigeria": {
281+
NO_CPAP_INTERVENTION.P_CPAP_BEmONC: 0.075,
282+
NO_CPAP_INTERVENTION.P_CPAP_CEmONC: 0.393,
283+
NO_CPAP_INTERVENTION.P_CPAP_HOME: 0.0,
284+
},
285+
"Pakistan": {
286+
NO_CPAP_INTERVENTION.P_CPAP_BEmONC: 0.075,
287+
NO_CPAP_INTERVENTION.P_CPAP_CEmONC: 0.393,
288+
NO_CPAP_INTERVENTION.P_CPAP_HOME: 0.0,
289+
},
290+
}

src/vivarium_gates_mncnh/data/loader.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,15 @@ def get_data(
8383
data_keys.PRETERM_BIRTH.CSMR: load_standard_data,
8484
data_keys.NEONATAL_SEPSIS.CSMR: load_standard_data,
8585
data_keys.NEONATAL_ENCEPHALOPATHY.CSMR: load_standard_data,
86+
data_keys.NO_CPAP_INTERVENTION.P_RDS: load_p_rds,
87+
data_keys.NO_CPAP_INTERVENTION.P_HOME: load_probability_birth_facility_type,
88+
data_keys.NO_CPAP_INTERVENTION.P_BEmONC: load_probability_birth_facility_type,
89+
data_keys.NO_CPAP_INTERVENTION.P_CEmONC: load_probability_birth_facility_type,
90+
data_keys.NO_CPAP_INTERVENTION.P_CPAP_HOME: load_cpap_facility_access_probability,
91+
data_keys.NO_CPAP_INTERVENTION.P_CPAP_BEmONC: load_cpap_facility_access_probability,
92+
data_keys.NO_CPAP_INTERVENTION.P_CPAP_CEmONC: load_cpap_facility_access_probability,
93+
data_keys.NO_CPAP_INTERVENTION.RELATIVE_RISK: load_no_cpap_relative_risk,
94+
data_keys.NO_CPAP_INTERVENTION.PAF: load_no_cpap_paf,
8695
}
8796
return mapping[lookup_key](lookup_key, location, years)
8897

@@ -413,6 +422,90 @@ def load_lbwsg_paf(
413422
return df.sort_index()
414423

415424

425+
def load_p_rds(
426+
lookup_key: str, location: str, years: Optional[Union[int, str, List[int]]] = None
427+
) -> float:
428+
csmr = get_data(data_keys.PRETERM_BIRTH.CSMR, location, years)
429+
p_rds = csmr * data_values.PRETERM_DEATHS_DUE_TO_RDS_PROBABILITY
430+
return p_rds
431+
432+
433+
def load_probability_birth_facility_type(
434+
lookup_key: str, location: str, years: Optional[Union[int, str, List[int]]] = None
435+
) -> float:
436+
return data_values.DELIVERY_FACILITY_TYPE_PROBABILITIES[location][lookup_key]
437+
438+
439+
def load_cpap_facility_access_probability(
440+
lookup_key: str, location: str, years: Optional[Union[int, str, List[int]]] = None
441+
) -> float:
442+
return data_values.CPAP_ACCESS_PROBABILITIES[location][lookup_key]
443+
444+
445+
def load_no_cpap_relative_risk(
446+
lookup_key: str, location: str, years: Optional[Union[int, str, List[int]]] = None
447+
) -> float:
448+
return 1 / 0.53
449+
450+
451+
def load_no_cpap_paf(
452+
lookup_key: str, location: str, years: Optional[Union[int, str, List[int]]] = None
453+
) -> float:
454+
455+
# Get all no_cpap data for calculations
456+
p_rds = get_data(data_keys.NO_CPAP_INTERVENTION.P_RDS, location, years)
457+
p_home = get_data(data_keys.NO_CPAP_INTERVENTION.P_HOME, location, years)
458+
p_BEmONC = get_data(data_keys.NO_CPAP_INTERVENTION.P_BEmONC, location, years)
459+
p_CEmONC = get_data(data_keys.NO_CPAP_INTERVENTION.P_CEmONC, location, years)
460+
p_CPAP_home = get_data(data_keys.NO_CPAP_INTERVENTION.P_CPAP_HOME, location, years)
461+
p_CPAP_BEmONC = get_data(data_keys.NO_CPAP_INTERVENTION.P_CPAP_BEmONC, location, years)
462+
p_CPAP_CEmONC = get_data(data_keys.NO_CPAP_INTERVENTION.P_CPAP_CEmONC, location, years)
463+
relative_risk = get_data(data_keys.NO_CPAP_INTERVENTION.RELATIVE_RISK, location, years)
464+
# rr_cpap = 1 / relative_risk)
465+
# p_rds_cpap = (1 / relative_risk) * p_rds_no_cpap
466+
# p_rds_no_cpap = p_rds_cpap * relative_risk
467+
468+
# Get death probability of each path
469+
# p_home_no_cpap = p_home * p_rds_no_cpap
470+
# p_BEmONC_no_cpap = p_BEmONC * 1 - p_CPAP_BEmONC * p_rds_no_cpap
471+
# p_CEmONC_no_cpap = p_CEmONC * 1 - p_CPAP_CEmONC * p_rds_no_cpap
472+
# p_BEmONC_cpap = p_BEmONC * p_CPAP_BEmONC * p_rds_cpap
473+
# p_CEmONC_cpap = p_CEmONC * p_CPAP_CEmONC * p_rds_cpap
474+
475+
# p_rds = (
476+
# p_home * p_rds_cpap * relative_risk
477+
# + p_BEmONC * (1 - p_CPAP_CEmONC) * p_rds_cpap * relative_risk
478+
# + p_CEmONC * (1 - p_CPAP_CEmONC) * p_rds_cpap * relative_risk
479+
# + p_BEmONC * p_CPAP_BEmONC * p_rds_cpap
480+
# + p_CEmONC * p_CPAP_CEmONC * p_rds_cpap
481+
# )
482+
# p_rds = (
483+
# 0.5 * 1.0 * p_rds_cpap * (1 / 0.53)
484+
# + 0.1 * (1 - 0.075) * p_rds_cpap * (1 / 0.53)
485+
# + 0.4 * (1 - 0.393) * p_rds_cpap * (1 / 0.53)
486+
# + 0.1 * 0.075 * p_rds_cpap
487+
# + 0.4 * 0.393 * p_rds_cpap
488+
# )
489+
# p_rds_cpap(
490+
# (0.5 * 1 * (1 / 0.53))
491+
# + (0.1 * (1 - 0.075) * (1 / 0.53))
492+
# + (0.4 * (1 / 0.393) * (1 / 0.53))
493+
# + (0.1 * 0.075)
494+
# + (0.4 * 0.393)
495+
# ) = p_rds
496+
497+
p_rds_cpap = p_rds / (
498+
(p_home * relative_risk)
499+
+ (p_BEmONC * (1 - p_CPAP_BEmONC) * relative_risk)
500+
+ (p_CEmONC * (1 - p_CPAP_CEmONC) * relative_risk)
501+
+ (p_BEmONC * p_CPAP_BEmONC)
502+
+ (p_CEmONC * p_CPAP_CEmONC)
503+
)
504+
paf_no_cpap = 1 - (p_rds_cpap / p_rds)
505+
paf_no_cpap = paf_no_cpap.fillna(0.0)
506+
return paf_no_cpap
507+
508+
416509
def load_lbwsg_exposure(
417510
key: str, location: str, years: Optional[Union[int, str, List[int]]] = None
418511
) -> pd.DataFrame:

0 commit comments

Comments
 (0)