def get_treatment_efficacy( demography: pd.DataFrame, treatment_type: str) -> Tuple[pd.DataFrame, pd.DataFrame]: baseline_efficacy = { data_keys.WASTING.CAT1: get_random_variable_draws( ARTIFACT_COLUMNS, *data_values.WASTING.BASELINE_SAM_TX_EFFICACY), data_keys.WASTING.CAT2: get_random_variable_draws( ARTIFACT_COLUMNS, *data_values.WASTING.BASELINE_MAM_TX_EFFICACY) } alternative_efficacy = { data_keys.WASTING.CAT1: data_values.WASTING.SAM_TX_ALTERNATIVE_EFFICACY, data_keys.WASTING.CAT2: data_values.WASTING.MAM_TX_ALTERNATIVE_EFFICACY } idx_as_frame = demography.merge(pd.DataFrame( {'parameter': [f'cat{i}' for i in range(1, 4)]}), how='cross') index = idx_as_frame.set_index(list(idx_as_frame.columns)).index efficacy = pd.DataFrame({f'draw_{i}': 1.0 for i in range(0, 1000)}, index=index) efficacy[index.get_level_values('parameter') == 'cat1'] *= 0.0 efficacy[index.get_level_values('parameter') == 'cat2'] *= baseline_efficacy[treatment_type] efficacy[index.get_level_values('parameter') == 'cat3'] *= alternative_efficacy[treatment_type] tmrel_efficacy = ( efficacy[efficacy.index.get_level_values('parameter') == data_keys. MAM_TREATMENT.TMREL_CATEGORY].droplevel('parameter')) return efficacy, tmrel_efficacy
def load_duration(key: str, location: str) -> pd.DataFrame: try: distribution = { data_keys.DIARRHEA.DURATION: data_values.DIARRHEA_DURATION, data_keys.LRI.DURATION: data_values.LRI_DURATION, }[key] except KeyError: raise ValueError(f'Unrecognized key {key}') demography = get_data(data_keys.POPULATION.DEMOGRAPHY, location) duration_draws = ( get_random_variable_draws(metadata.ARTIFACT_COLUMNS, *distribution) / metadata.YEAR_DURATION ) enn_duration = pd.DataFrame( data_values.EARLY_NEONATAL_CAUSE_DURATION / metadata.YEAR_DURATION, columns=metadata.ARTIFACT_COLUMNS, index=demography.query('age_start == 0.0').index ) all_other_duration = pd.DataFrame( [duration_draws], index=demography.query('age_start != 0.0').index ) duration = pd.concat([enn_duration, all_other_duration]).sort_index() return duration
def load_therapeutic_zinc_rr(key: str, location: str) -> pd.Series: if key != data_keys.THERAPEUTIC_ZINC.RELATIVE_RISK: raise ValueError(f'Unrecognized key {key}') idx = get_data(data_keys.POPULATION.DEMOGRAPHY, location).index diarrhea_duration_shift_years = pd.DataFrame( [get_random_variable_draws( metadata.ARTIFACT_COLUMNS, *data_values.THERAPEUTIC_ZINC.DIARRHEA_DURATION_SHIFT_HOURS ) / (metadata.DAY_DURATION * metadata.YEAR_DURATION)], index=idx ) diarrhea_duration_years = pd.DataFrame( [get_random_variable_draws( metadata.ARTIFACT_COLUMNS, *data_values.DIARRHEA_DURATION ) / metadata.YEAR_DURATION], index=idx ) baseline_coverage = ( get_data(data_keys.THERAPEUTIC_ZINC.EXPOSURE, location) .query(f'parameter == "cat2"') .droplevel('parameter') ) duration_uncovered = diarrhea_duration_years - ( diarrhea_duration_shift_years * baseline_coverage ) duration_covered = duration_uncovered + diarrhea_duration_shift_years remission_rate_uncovered = 1 / duration_uncovered remission_rate_covered = 1 / duration_covered exposed_rr = remission_rate_covered / remission_rate_uncovered return convert_to_dichotomous_rr( exposed_rr, data_keys.THERAPEUTIC_ZINC.AFFECTED_ENTITY, data_keys.THERAPEUTIC_ZINC.AFFECTED_MEASURE )
def load_preventative_zinc_rr(key: str, location: str) -> pd.DataFrame: if key != data_keys.PREVENTATIVE_ZINC.RELATIVE_RISK: raise ValueError(f'Unrecognized key {key}') index = get_data(data_keys.POPULATION.DEMOGRAPHY, location).index distribution = data_values.PREVENTATIVE_ZINC.PREVENTATIVE_TX_EFFICACY exposed_rr = pd.DataFrame( [get_random_variable_draws(metadata.ARTIFACT_COLUMNS, *distribution)], index=index ) return convert_to_dichotomous_rr( exposed_rr, data_keys.PREVENTATIVE_ZINC.AFFECTED_ENTITY, data_keys.PREVENTATIVE_ZINC.AFFECTED_MEASURE )
def load_dichotomous_excess_shift( location: str, distribution_data: Tuple, is_risk: bool ) -> pd.DataFrame: index = get_data(data_keys.POPULATION.DEMOGRAPHY, location).index shift = get_random_variable_draws(metadata.ARTIFACT_COLUMNS, *distribution_data) exposed = pd.DataFrame([shift], index=index) exposed['parameter'] = 'cat1' if is_risk else 'cat2' unexposed = pd.DataFrame([pd.Series(0.0, index=metadata.ARTIFACT_COLUMNS)], index=index) unexposed['parameter'] = 'cat2' if is_risk else 'cat1' excess_shift = pd.concat([exposed, unexposed]) excess_shift['affected_entity'] = data_keys.LBWSG.BIRTH_WEIGHT_EXPOSURE.name excess_shift['affected_measure'] = data_keys.LBWSG.BIRTH_WEIGHT_EXPOSURE.measure excess_shift = ( excess_shift .set_index(['affected_entity', 'affected_measure', 'parameter'], append=True) .sort_index() ) return excess_shift
def load_dichotomous_exposure( location: str, distribution_data: Union[float, Tuple], is_risk: bool, coverage: float = 1.0, has_under_6mo_exposure: bool = True, ) -> pd.DataFrame: index = get_data(data_keys.POPULATION.DEMOGRAPHY, location).index if type(distribution_data) == float: base_exposure = pd.Series(distribution_data, index=metadata.ARTIFACT_COLUMNS) else: base_exposure = get_random_variable_draws(metadata.ARTIFACT_COLUMNS, *distribution_data) exposed = pd.DataFrame([base_exposure * coverage], index=index) if not has_under_6mo_exposure: exposed.loc[exposed.index.get_level_values('age_end') <= 0.5] = 0.0 unexposed = 1 - exposed exposed['parameter'] = 'cat1' if is_risk else 'cat2' unexposed['parameter'] = 'cat2' if is_risk else 'cat1' exposure = pd.concat([exposed, unexposed]).set_index('parameter', append=True).sort_index() return exposure
def load_wasting_treatment_exposure(key: str, location: str) -> pd.DataFrame: if key == data_keys.SAM_TREATMENT.EXPOSURE: coverage_distribution = data_values.WASTING.BASELINE_SAM_TX_COVERAGE elif key == data_keys.MAM_TREATMENT.EXPOSURE: coverage_distribution = data_values.WASTING.BASELINE_MAM_TX_COVERAGE else: raise ValueError(f'Unrecognized key {key}') treatment_coverage = get_random_variable_draws( metadata.ARTIFACT_COLUMNS, *coverage_distribution ) idx = get_data(data_keys.POPULATION.DEMOGRAPHY, location).index cat3 = pd.DataFrame({f'draw_{i}': 0.0 for i in range(0, 1000)}, index=idx) cat2 = pd.DataFrame({f'draw_{i}': 1.0 for i in range(0, 1000)}, index=idx) * treatment_coverage cat1 = 1 - cat2 cat1['parameter'] = 'cat1' cat2['parameter'] = 'cat2' cat3['parameter'] = 'cat3' exposure = pd.concat([cat1, cat2, cat3]).set_index('parameter', append=True).sort_index() return exposure
def load_mam_treatment_rr(key: str, location: str) -> pd.DataFrame: # tmrel is defined as baseline treatment (cat_2) if key != data_keys.MAM_TREATMENT.RELATIVE_RISK: raise ValueError(f'Unrecognized key {key}') demography = get_data(data_keys.POPULATION.DEMOGRAPHY, location).reset_index() mam_tx_efficacy, mam_tx_efficacy_tmrel = utilities.get_treatment_efficacy(demography, data_keys.WASTING.CAT2) index = mam_tx_efficacy.index mam_ux_duration = data_values.WASTING.MAM_UX_RECOVERY_TIME_OVER_6MO mam_tx_duration = pd.Series(index=index) mam_tx_duration[index.get_level_values('age_start') < 0.5] = data_values.WASTING.MAM_TX_RECOVERY_TIME_UNDER_6MO mam_tx_duration[0.5 <= index.get_level_values('age_start')] = ( get_random_variable_draws( mam_tx_duration[0.5 <= index.get_level_values('age_start')].index, *data_values.WASTING.MAM_TX_RECOVERY_TIME_OVER_6MO) ) mam_tx_duration = ( pd.DataFrame({f'draw_{i}': 1 for i in range(0, 1000)}, index=index) .multiply(mam_tx_duration, axis='index') ) # rr_r3 = r3 / r3_tmrel # = (mam_tx_efficacy / mam_tx_duration) + (1 - mam_tx_efficacy / mam_ux_duration) # / (mam_tx_efficacy_tmrel / mam_tx_duration) + (1 - mam_tx_efficacy_tmrel / mam_ux_duration) # = (mam_tx_efficacy * mam_ux_duration + (1 - mam_tx_efficacy) * mam_tx_duration) # / (mam_tx_efficacy_tmrel * mam_ux_duration + (1 - mam_tx_efficacy_tmrel) * mam_tx_duration) rr = ((mam_tx_efficacy * mam_ux_duration + (1 - mam_tx_efficacy) * mam_tx_duration) / (mam_tx_efficacy_tmrel * mam_ux_duration + (1 - mam_tx_efficacy_tmrel) * mam_tx_duration)) rr['affected_entity'] = 'moderate_acute_malnutrition_to_mild_child_wasting' rr['affected_measure'] = 'transition_rate' rr = rr.set_index(['affected_entity', 'affected_measure'], append=True) rr.index = rr.index.reorder_levels([col for col in rr.index.names if col != 'parameter'] + ['parameter']) rr.sort_index() return rr