def simulate(pars, save = False, logs = False):
    """
    Simulate data from the colony study using a set of VarroaPop parameters

    :param pars: Dictionary of parameters to vary.
                ICQueenStrength_mean
                ICQueenStrength_sd
                ICForagerLifespan_mean
                ICForagerLifespan_sd
                AIAdultLD50
                AIAdultSlope
                AILarvaLD50
                AILarvaSlope

    :return a dictionary of summary stats
    """

    parameters = pars.copy() #copy our inputs so that we don't ever modify them (pyabc needs these)
    static_pars = {'SimEnd': END_DATE, 'IPollenTrips': 8, 'INectarTrips': 17, 'RQEnableReQueen': 'false'}
    for name, value in parameters.items():
        if not name.endswith(('_mean','_sd')):
            static_pars[name] = value
    static_pars['NecPolFileEnable'] = 'true'
    weather_path = os.path.join(DATA_DIR,'external/weather/weather_2015','18815_grid_39.875_lat.wea')
    all_responses = pd.DataFrame()
    for index, site in enumerate(SITES):
        exposure_filename = 'neonic_profile_' + site + '.csv'
        exposure_path = os.path.join(DATA_DIR,"processed/neonic_profiles/", exposure_filename)#os.path.abspath(os.path.join('data', exposure_filename))
        site_pars = generate_start(static_pars.copy(), site, INITIAL_DF)
        site_pars['NecPolFileName'] = exposure_path
        site_pars['ICQueenStrength'] = 0
        site_pars['ICForagerLifespan'] = 0
        while not (1 <=site_pars['ICQueenStrength'] <= 5):
            site_pars['ICQueenStrength'] = np.random.normal(loc = float(parameters['ICQueenStrength_mean']), scale = float(parameters['ICQueenStrength_sd']))
        while not (4 <= site_pars['ICForagerLifespan'] <= 16):
            site_pars['ICForagerLifespan'] = np.random.normal(loc = float(parameters['ICForagerLifespan_mean']), scale = float(parameters['ICForagerLifespan_sd']))
        vp = VarroaPop(parameters = site_pars, weather_file = weather_path, vrp_file = VRP_FILE,
                       verbose=False, unique=True, keep_files=save, logs=logs)
        vp.run_model()
        dates = DATES_STR.iloc[index,:]
        site_response = filter_site_responses(vp.get_output(), dates_str= dates)
        all_responses = all_responses.append(site_response, ignore_index=True)

    #Generate labels for rows and columns
    rows = ['_'.join(x) for x in product(SITES, DATES)]
    all_responses['Index'] = pd.Series(rows) #Add our row labels
    all_responses.set_index("Index", inplace=True) #Set row labels to be the index
    filtered_resp = all_responses.loc[:,RESPONSE_FILTER] #Keep only the summary stats that we are using
    output_dict = {}
    for row in filtered_resp.index:
        for col in filtered_resp.columns:
            label = "_".join([row,col])
            output_dict[label] = filtered_resp.loc[row,col]
    return output_dict
Beispiel #2
0
 def post(self):
     clean_files(os.path.abspath('VarroaPy/VarroaPy/files/input'), 7)
     clean_files(os.path.abspath('VarroaPy/VarroaPy/files/logs'), 7)
     clean_files(os.path.abspath('VarroaPy/VarroaPy/files/output'), 7)
     args = parser.parse_args()
     params = args['parameters']
     params = json.loads(params.replace("'", '"'))
     weather = args['weather_file']
     vp = VarroaPop(parameters=params,
                    weather_file=weather,
                    logs=True,
                    keep_files=True)
     vp.run_model()
     output = vp.get_output(json_str=True)
     jobID = vp.get_jobID()
     return json.loads(output), {"session-id": jobID}
Beispiel #3
0
def simulate(pars, save=False, logs=False):
    """
    Simulate data from the colony study using a set of VarroaPop parameters

    :param pars: Dictionary of parameters to vary.
                ICQueenStrength_mean
                ICQueenStrength_sd
                ICForagerLifespan_mean
                ICForagerLifespan_sd
                AIAdultLD50
                AIAdultSlope
                AILarvaLD50
                AILarvaSlope
    :return a dictionary of summary stats
    """
    #print(DATA_DIR)
    #print(INITIAL_DF)
    #print(parameters)
    parameters = pars.copy(
    )  #copy our inputs so that we don't ever modify them (pyabc needs these)
    static_pars = {
        'SimStart': START_DATE,
        'SimEnd': END_DATE,
        'IPollenTrips': 8,
        'INectarTrips': 17,
        'AIHalfLife': 25,
        'RQEnableReQueen': 'false'
    }
    for name, value in parameters.items():
        if not name.endswith(('_mean', '_sd')):
            static_pars[name] = value
    static_pars['NecPolFileEnable'] = 'true'
    weather_path = os.path.join(DATA_DIR, 'weather/15055_grid_35.875_lat.wea')
    #all_responses = pd.DataFrame(index = rows, columns = cols)
    all_responses = pd.DataFrame()
    for index, trt in enumerate(TREATMENTS):
        trt_responses_mean = np.empty((len(DATES), len(RESPONSE_VARS)))
        trt_responses_sd = np.empty((len(DATES), len(RESPONSE_VARS)))
        trt_pars = static_pars.copy()
        exposure_filename = 'clo_feeding_' + trt + '.csv'
        exposure_path = os.path.join(DATA_DIR, 'food_concentrations',
                                     exposure_filename)
        trt_pars['NecPolFileName'] = exposure_path
        reps = REPS[index]
        rep_responses = np.empty(
            ([len(DATES), len(RESPONSE_VARS), reps
              ]))  # survey dates (rows) x output vars (cols) x reps (z axis)
        for rep in range(0, reps):
            vp_pars = generate_start(trt_pars.copy(), trt)
            #generate random gaussian parameters
            vp_pars['ICQueenStrength'] = 0
            vp_pars['ICForagerLifespan'] = 0
            while not (1 <= vp_pars['ICQueenStrength'] <= 5):
                vp_pars['ICQueenStrength'] = np.random.normal(
                    loc=float(parameters['ICQueenStrength_mean']),
                    scale=float(parameters['ICQueenStrength_sd']))
            while not (4 <= vp_pars['ICForagerLifespan'] <= 16):
                vp_pars['ICForagerLifespan'] = np.random.normal(
                    loc=float(parameters['ICForagerLifespan_mean']),
                    scale=float(parameters['ICForagerLifespan_sd']))
            vp = VarroaPop(parameters=vp_pars,
                           weather_file=weather_path,
                           vrp_file=VRP_FILE,
                           verbose=False,
                           unique=True,
                           keep_files=save,
                           logs=logs)
            vp.run_model()
            if trt == "160":
                dates = DATES_STR_HIGH
            else:
                dates = DATES_STR
            rep_responses[:, :, rep] = filter_rep_responses(vp.get_output(),
                                                            dates_str=dates)
        mean_cols = [var[0] + "_mean" for var in RESPONSE_VARS]
        sd_cols = [var[0] + "_sd" for var in RESPONSE_VARS]
        trt_responses_mean = pd.DataFrame(np.mean(rep_responses, axis=2),
                                          columns=mean_cols)
        trt_responses_sd = pd.DataFrame(
            np.std(rep_responses, axis=2, ddof=1),
            columns=sd_cols)  # Note: uses sample sd, not population sd
        trt_responses = pd.concat([trt_responses_mean, trt_responses_sd],
                                  axis=1)
        #print("Treatment {} responses: {}".format(trt,trt_responses))
        start_row = len(DATES) * index
        end_row = start_row + len(DATES)
        #all_responses.loc[start_row:end_row,:] = trt_responses
        all_responses = all_responses.append(trt_responses, ignore_index=True)

    #Generate labels for rows and columns
    rows = ['_'.join(x) for x in product(TREATMENTS, DATES)]
    #print('Row labels: {}'.format(rows))
    response_cols = [x[0] for x in RESPONSE_VARS]
    cols = ['_'.join([x, y]) for y in ['mean', 'sd'] for x in response_cols]
    #print('Col labels: {}'.format(cols))

    all_responses['Index'] = pd.Series(rows)  # Add our row labels
    all_responses.set_index("Index",
                            inplace=True)  # Set row labels to be the index
    #print('Final result: {}'.format(all_responses))
    filtered_resp = all_responses.loc[:,
                                      RESPONSE_FILTER]  # Keep only the summary stats that we are using
    #print('Filtered result: {}'.format(filtered_resp))
    output_dict = {}
    for row in filtered_resp.index:
        for col in filtered_resp.columns:
            label = "_".join([row, col])
            output_dict[label] = filtered_resp.loc[row, col]
    #print('Output dictionary: {}'.format(output_dict))
    return output_dict
Beispiel #4
0
def simulate_all_dates(pars, save=False, logs=False):
    """
    Simulate data from the colony study using a set of VarroaPop parameters.
    This version returns the population at every single date. This will be
    used to create posterior predictive plots.

    :param pars: Dictionary of parameters to vary.
                ICQueenStrength_mean
                ICQueenStrength_sd
                ICForagerLifespan_mean
                ICForagerLifespan_sd
                AIAdultLD50
                AIAdultSlope
                AILarvaLD50
                AILarvaSlope
    :return a dict of arrays of varroapop summary stats(treatment x day) for adult/pupae/larvae/eggs/all/pollen/nectar)
    """
    start = datetime.datetime.strptime(START_DATE, "%m/%d/%Y")
    end = datetime.datetime.strptime(DATES_STR_HIGH[3], "%m/%d/%Y")
    all_dates = [(start + datetime.timedelta(days=x)).strftime("%m/%d/%Y")
                 for x in range(0, (end - start).days)]
    parameters = pars.copy(
    )  # copy our inputs so that we don't ever modify them (pyabc needs these)
    static_pars = {
        'SimStart': START_DATE,
        'SimEnd': END_DATE,
        'IPollenTrips': 8,
        'INectarTrips': 17,
        'AIHalfLife': 25,
        'RQEnableReQueen': 'false'
    }
    for name, value in parameters.items():
        if not name.endswith(('_mean', '_sd')):
            static_pars[name] = value
    static_pars['NecPolFileEnable'] = 'true'
    weather_path = os.path.join(DATA_DIR, 'weather/15055_grid_35.875_lat.wea')
    #all_responses = pd.DataFrame(index = rows, columns = cols)
    all_responses = pd.DataFrame()
    for index, trt in enumerate(TREATMENTS):
        trt_responses_mean = np.empty((len(DATES), len(RESPONSE_VARS)))
        trt_responses_sd = np.empty((len(DATES), len(RESPONSE_VARS)))
        trt_pars = static_pars.copy()
        exposure_filename = 'clo_feeding_' + trt + '.csv'
        exposure_path = os.path.join(DATA_DIR, 'food_concentrations',
                                     exposure_filename)
        trt_pars['NecPolFileName'] = exposure_path
        reps = REPS[index]
        rep_responses = np.empty(
            ([len(all_dates), len(RESPONSE_VARS), reps
              ]))  # survey dates (rows) x output vars (cols) x reps (z axis)
        for rep in range(0, reps):
            vp_pars = generate_start(trt_pars.copy(), trt)
            #generate random gaussian parameters
            vp_pars['ICQueenStrength'] = 0
            vp_pars['ICForagerLifespan'] = 0
            while not (1 <= vp_pars['ICQueenStrength'] <= 5):
                vp_pars['ICQueenStrength'] = np.random.normal(
                    loc=float(parameters['ICQueenStrength_mean']),
                    scale=float(parameters['ICQueenStrength_sd']))
            while not (4 <= vp_pars['ICForagerLifespan'] <= 16):
                vp_pars['ICForagerLifespan'] = np.random.normal(
                    loc=float(parameters['ICForagerLifespan_mean']),
                    scale=float(parameters['ICForagerLifespan_sd']))
            vp = VarroaPop(parameters=vp_pars,
                           weather_file=weather_path,
                           vrp_file=VRP_FILE,
                           verbose=False,
                           unique=True,
                           keep_files=save,
                           logs=logs)
            vp.run_model()
            rep_responses[:, :,
                          rep] = filter_rep_responses(vp.get_output(),
                                                      dates_str=all_dates)
        mean_cols = [var[0] + "_mean" for var in RESPONSE_VARS]
        sd_cols = [var[0] + "_sd" for var in RESPONSE_VARS]
        trt_responses_mean = pd.DataFrame(np.mean(rep_responses, axis=2),
                                          columns=mean_cols)
        trt_responses_sd = pd.DataFrame(
            np.std(rep_responses, axis=2, ddof=1),
            columns=sd_cols)  # Note: uses sample sd, not population sd
        trt_responses = pd.concat([trt_responses_mean, trt_responses_sd],
                                  axis=1)
        #print("Treatment {} responses: {}".format(trt,trt_responses))
        start_row = len(DATES) * index
        end_row = start_row + len(DATES)
        #all_responses.loc[start_row:end_row,:] = trt_responses
        all_responses = all_responses.append(trt_responses, ignore_index=True)

    #Generate labels for rows and columns
    rows = ['_'.join(x) for x in product(TREATMENTS, all_dates)]
    response_cols = [x[0] for x in RESPONSE_VARS]
    cols = ['_'.join([x, y]) for y in ['mean', 'sd'] for x in response_cols]

    all_responses['Index'] = pd.Series(rows)  # Add our row labels
    all_responses.set_index("Index",
                            inplace=True)  # Set row labels to be the index
    #print('Final result: {}'.format(all_responses))
    #filtered_resp = all_responses.loc[:,'Adults_mean']  # Keep only the mean number of adults
    n_dates = len(all_dates)
    return_dfs = {}
    for response in RESPONSE_VARS:
        filtered_resp = all_responses.loc[:, response[0] + "_mean"]
        wide = np.empty([6, n_dates])  # 6 treatments, n_dates days,
        for i in range(6):
            wide[i, :] = filtered_resp.iloc[i * n_dates:(i + 1) * n_dates]
        wide_df = pd.DataFrame(wide,
                               index=["0", "10", "20", "40", "80", "160"],
                               columns=all_dates)
        return_dfs[response[0]] = wide_df
    # add all individuals sum
    all_ind_mean = all_responses.loc[:,
                                     all_responses.columns.str.
                                     contains('_mean')].sum(axis=1)
    wide = np.empty([6, n_dates])  # 6 treatments, n_dates days,
    for i in range(6):
        wide[i, :] = all_ind_mean.iloc[i * n_dates:(i + 1) * n_dates]
    wide_df = pd.DataFrame(wide,
                           index=["0", "10", "20", "40", "80", "160"],
                           columns=all_dates)
    return_dfs["All"] = wide_df
    return return_dfs
def simulate_all_dates(pars, save = False, logs = False):
    """
    Simulate data from the colony study using a set of VarroaPop parameters
    This version returns the population at every singel date - can be used to
    create posterior predictive plots

    :param pars: Dictionary of parameters to vary.
                ICQueenStrength_mean
                ICQueenStrength_sd
                ICForagerLifespan_mean
                ICForagerLifespan_sd
                AIAdultLD50
                AIAdultSlope
                AILarvaLD50
                AILarvaSlope

    :return a dict of arrays of varroapop summary stats(site x day) for adult/pupae/larvae/eggs/all)
    """
    start = datetime.datetime.strptime(START_DATES[1], "%m/%d/%Y") #pick earliest start date
    end = datetime.datetime.strptime(END_DATE, "%m/%d/%Y")
    all_dates = [(start + datetime.timedelta(days=x)).strftime("%m/%d/%Y") for x in range(0, (end - start).days)]
    parameters = pars.copy() #copy our inputs so that we don't ever modify them (pyabc needs these)
    static_pars = {'SimEnd': END_DATE, 'IPollenTrips': 8, 'INectarTrips': 17, 'RQEnableReQueen': 'false'}
    for name, value in parameters.items():
        if not name.endswith(('_mean','_sd')):
            static_pars[name] = value
    static_pars['NecPolFileEnable'] = 'true'
    weather_path = os.path.join(DATA_DIR,'external/weather/weather_2015','18815_grid_39.875_lat.wea')
    all_responses = pd.DataFrame()
    for index, site in enumerate(SITES):
        exposure_filename = 'neonic_profile_' + site + '.csv'
        exposure_path = os.path.join(DATA_DIR,"processed/neonic_profiles/", exposure_filename)#os.path.abspath(os.path.join('data', exposure_filename))
        site_pars = generate_start(static_pars.copy(), site, INITIAL_DF)
        site_pars['NecPolFileName'] = exposure_path
        site_pars['ICQueenStrength'] = 0
        site_pars['ICForagerLifespan'] = 0
        while not (1 <=site_pars['ICQueenStrength'] <= 5):
            site_pars['ICQueenStrength'] = np.random.normal(loc = float(parameters['ICQueenStrength_mean']), scale = float(parameters['ICQueenStrength_sd']))
        while not (4 <= site_pars['ICForagerLifespan'] <= 16):
            site_pars['ICForagerLifespan'] = np.random.normal(loc = float(parameters['ICForagerLifespan_mean']), scale = float(parameters['ICForagerLifespan_sd']))
        vp = VarroaPop(parameters = site_pars, weather_file = weather_path, vrp_file = VRP_FILE,
                       verbose=False, unique=True, keep_files=save, logs=logs)
        vp.run_model()
        site_response = filter_site_responses(vp.get_output(), dates_str= all_dates)
        all_responses = all_responses.append(site_response, ignore_index=True)

    #Generate labels for rows and columns
    rows = ['_'.join(x) for x in product(SITES, all_dates)]
    all_responses['Index'] = pd.Series(rows) #Add our row labels
    all_responses.set_index("Index", inplace=True) #Set row labels to be the index
    n_dates = len(all_dates)
    return_dfs = {}
    for response in RESPONSE_VARS:
        filtered_resp = all_responses.loc[:, response[0]]
        wide = np.empty([10, n_dates])  # 10 sites, n_dates days,
        for i in range(10):
            wide[i, :] = filtered_resp.iloc[i * n_dates:(i + 1) * n_dates]
        wide_df = pd.DataFrame(wide, index=SITES,
                               columns=all_dates)
        return_dfs[response[0]] = wide_df
    # add all individuals sum
    all_ind_mean = all_responses.sum(axis=1)
    wide = np.empty([10, n_dates])  # 10 sites, n_dates days,
    for i in range(10):
        wide[i, :] = all_ind_mean.iloc[i * n_dates:(i + 1) * n_dates]
    wide_df = pd.DataFrame(wide, index=SITES,
                           columns=all_dates)
    return_dfs["All"] = wide_df
    return return_dfs