Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
    )
Esempio n. 4
0
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
    )
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
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
Esempio n. 8
0
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