Beispiel #1
0
def test_point_estimate_daily():
    def delta(cumul):
        diff = []
        for i in range(1, len(cumul)):
            diff.append(cumul[i] - cumul[i - 1])
        # first daily value is repeated since val(t0-1) is unknown
        diff.insert(0, diff[0])
        return diff

    start_day = 12
    end_day = 60
    ref_2 = Model.open_file(path_model_2_2)
    sim_2 = Model.open_file(path_model_2_2)

    # do fit of alpha_0, alpha_1, cont_0, trans_rate_1_time
    for par_name in ['alpha_0', 'alpha_1', 'cont_0']:
        par = ref_2.parameters[par_name]
        par.set_variable(None, None)

    par = ref_2.parameters['trans_rate_1_time']
    par.set_variable(None, None)
    par.set_min(13)
    par.set_max(19)

    sim_2.reset()
    sim_2.generate_data(end_day)
    daily_data = delta(sim_2.populations['reported'].history)
    daily_data[47] = np.inf
    optimizer = Optimizer(ref_2,
                          'daily reported',
                          daily_data, [start_day, end_day],
                          skip_data='42,45:48')
    optimizer.reset_variables()

    scan_dict = optimizer.i_fit()
    assert ref_2.parameters['trans_rate_1_time'].get_value() in [15, 16, 17]

    par = ref_2.parameters['trans_rate_1_time']
    par.set_fixed()

    popt, pcov = optimizer.fit()
    assert np.abs(ref_2.parameters['alpha_0'].get_value() -
                  ref_2.parameters['alpha_0'].initial_value) < 0.06
    assert np.abs(ref_2.parameters['alpha_1'].get_value() -
                  ref_2.parameters['alpha_1'].initial_value) < 0.02
    assert np.abs(ref_2.parameters['cont_0'].get_value() -
                  ref_2.parameters['cont_0'].initial_value) < 20.
Beispiel #2
0
def test_point_estimate_skip_zeros():
    start_day = 12
    end_day = 60
    ref_2 = Model.open_file(path_model_2_2)
    sim_2 = Model.open_file(path_model_2_2)

    # do fit of alpha_1, trans_rate_1_time
    for par_name in ['alpha_1']:
        par = ref_2.parameters[par_name]
        par.set_variable(None, None)

    par = ref_2.parameters['trans_rate_1_time']
    par.set_variable(None, None)
    par.set_min(13)
    par.set_max(19)

    sim_2.reset()
    rn_dict = sim_2.populations['reported'].get_report_noise()
    rn_dict['report_days'].set_value(7)
    sim_2.generate_data(end_day)
    sim_2.populations['reported'].history[47] = np.inf
    optimizer = Optimizer(ref_2,
                          'total reported',
                          sim_2.populations['reported'].history,
                          [start_day, end_day],
                          cumul_reset=True,
                          skip_data='42,45:48',
                          skip_zeros=True)
    #optimizer = Optimizer(ref_2, 'total reported', sim_2.populations['reported'].history, [start_day, end_day],
    #                      cumul_reset=True, skip_zeros=False)
    optimizer.reset_variables()

    scan_dict = optimizer.i_fit()
    assert ref_2.parameters['trans_rate_1_time'].get_value() in [15, 16, 17]

    par = ref_2.parameters['trans_rate_1_time']
    par.set_fixed()

    popt, pcov = optimizer.fit()
    assert np.abs(ref_2.parameters['alpha_1'].get_value() -
                  ref_2.parameters['alpha_1'].initial_value) < 0.02
Beispiel #3
0
    def fit_reported(self, model, data, trans_date_guess, n_rep, verbose):
        model.set_t0(self.t_0.year, self.t_0.month, self.t_0.day)
        trans_day_guess = (trans_date_guess - self.t_0).days

        model.parameters['trans_rate_1_time'].set_value(trans_day_guess)
        # estimate the number who are contagious using the first 8 days of data
        reported_8 = data['reported'][7] - data['reported'][0]
        cont_8 = reported_8
        model.parameters['cont_0'].set_value(cont_8)
        model.parameters['cont_0'].set_max(4 * cont_8)
        model.boot_pars['boot_value'] = cont_8 / 50.

        # do fit of alpha_0, alpha_1, cont_0, trans_rate_1_time
        for par_name in ['alpha_0', 'alpha_1', 'cont_0']:
            par = model.parameters[par_name]
            par.set_variable(None, None)

        # find reasonable values for the parameters
        start_day = 0
        end_day = len(data['reported']) - 1
        optimizer = Optimizer(model,
                              'total reported',
                              data['reported'], [start_day, end_day],
                              cumul_reset=True)
        popt, pcov = optimizer.fit()

        for par_name in ['alpha_0', 'alpha_1', 'cont_0']:
            par = model.parameters[par_name]
            par.new_initial_value()

        par = model.parameters['trans_rate_1_time']
        par.set_variable(None, None)

        par.set_min(trans_day_guess)
        par.set_max(trans_day_guess + 1)

        scan_dict = optimizer.i_fit()

        direction = +1
        min_chi2 = scan_dict['chi2_list'][1]
        trans_day = trans_day_guess + 1
        if scan_dict['chi2_list'][0] < scan_dict['chi2_list'][1]:
            direction = -1
            min_chi2 = scan_dict['chi2_list'][0]
            trans_day = trans_day_guess

        min_found = False
        while not min_found:
            trans_day_try = trans_day + direction
            par.set_min(trans_day_try)
            par.set_max(trans_day_try)

            scan_dict = optimizer.i_fit()
            if scan_dict['chi2_list'][0] < min_chi2:
                min_chi2 = scan_dict['chi2_list'][0]
                trans_day = trans_day_try
            else:
                min_found = True

        model.parameters['trans_rate_1_time'].set_value(trans_day)

        par = model.parameters['trans_rate_1_time']
        par.set_fixed()
        popt, pcov = optimizer.fit()

        # find and assign uncertainties
        self.set_std_estimators(model, optimizer, n_rep, verbose)

        # Include the uncertainty from unknown transition day
        delta_days = [-2, +2]
        mod_alphas = []
        for delta_day in delta_days:
            temp_model = copy.deepcopy(model)
            new_date = temp_model.transitions[
                'trans_rate_1'].transition_time.get_value() + delta_day
            temp_model.transitions['trans_rate_1'].transition_time.set_value(
                new_date)
            temp_optimizer = Optimizer(temp_model,
                                       'total reported',
                                       data['reported'], [start_day, end_day],
                                       cumul_reset=True)
            popt, pcov = temp_optimizer.fit()
            mod_alpha = temp_model.parameters['alpha_1'].get_value()
            mod_alphas.append(mod_alpha)

        if verbose:
            print(
                'Transition: trans_rate_1 on day',
                model.transitions['trans_rate_1'].transition_time.get_value())
            print(
                'alpha values: \n  nom = {0:0.4f} +/- {1:0.4f} \n  {2:+d} days = {3:0.4f} \n  {4:+d} days = {5:0.4f}'
                .format(model.parameters['alpha_1'].get_value(),
                        model.parameters['alpha_1'].std_estimator,
                        delta_days[0], mod_alphas[0], delta_days[1],
                        mod_alphas[1]))

        # while the following should be divided by 2, leave as is to account for larger delta_day possibility
        mod_alphas_std = np.abs(mod_alphas[0] - mod_alphas[1])
        current_std = model.parameters['alpha_1'].std_estimator
        new_std = np.sqrt(current_std**2 + mod_alphas_std**2)
        model.parameters['alpha_1'].std_estimator = new_std

        if verbose:
            print('Additional error included in final alpha: {0:0.4f}'.format(
                mod_alphas_std))