def test_inertia_of_model(): """ Explores delay of H and D relative to C and overshoot/undershoot with variable dwell time parameters. """ # Time period for the run (again relative to Jan 1, 2020) t_list = np.linspace( 0, 100, 100 + 1) # Here starts from when FL started to ramp up cases # Need assumptions for R(t) and testing_rate(t) for the future as inputs rt = lambda t: 1.0 + 0.2 * math.sin(t / 12.0) model = NowcastingSEIRModel() delays = [] t_i = 6 t_h = 8 for (t_i, t_h) in [(3, 8), (6, 8), (12, 8), (6, 4), (6, 16), (12, 16)]: model.t_i = t_i model.th0 = t_h # Create a ModelRun (with specific assumptions) based on a Model (potentially with some trained inputs) run = ModelRun( model, # TODO experiment with dwell times 20e6, # N, population of jurisdiction t_list, None, # tests, rt, case_median_age_f=lambda t: 48, initial_compartments={"nC": 1000.0}, auto_initialize_other_compartments= True, # By running to steady state at initial R(t=t0) auto_calibrate= False, # Override some model constants to ensure continuity with initial compartments ) # Execute the run, results are a DataFrame, fig is Matplotlib Figure, ratios are key metrics (results, ratios, fig) = run.execute_dataframe_ratios_fig(plot=MAKE_PLOTS) nC_peak_at = results["nC"].argmax() h_peak_at = results["H"].argmax() nD_peak_at = results["nD"].argmax() h_delay = h_peak_at - nC_peak_at d_delay = nD_peak_at - h_peak_at h_to_nC = results["H"][h_peak_at] / results["nC"][nC_peak_at] nD_to_h = results["nD"][nD_peak_at] / results["H"][h_peak_at] delays.append([t_i, model.t_h(48), h_delay, h_to_nC, d_delay, nD_to_h]) assert h_delay - int(t_i + model.t_h(48) / 2) in [-2, -1, 0, 1, 2, 3] # 0 +/- 1 assert (d_delay) in [2, 1, 0] # 1 +/- 1 if MAKE_PLOTS: fig.savefig(TEST_OUTPUT_DIR / "test_inertia_of_model.pdf", bbox_inches="tight")
def test_demonstrate_hospitalization_delay_changes(): """ Demonstrates that hospitalization peaks are delayed relative to new cases by varying number of days depending on how well states were prepared at various points in time """ if MAKE_PLOTS: return t_list = np.linspace(0, 230, 230 + 1) sets = { "early": { "states": ["NY", "NJ", "CT"], "delay": 0 }, "late": { "states": ["FL", "TX", "GA", "CA", "AZ"], "delay": 12 }, "steady": { "states": ["PA", "IL"], "delay": 7 }, } model = NowcastingSEIRModel() for name, s in sets.items(): fig, ax = plt.subplots() for state in s["states"]: (rt, nc, tests, h, nd) = HistoricalData.get_state_data_for_dates(state, t_list, no_functions=True) fh = h / (nc * model.t_i) fd = (nd * model.t_h()) / h pos = nc / tests hdelay = h.shift(s["delay"]) plt.scatter(hdelay.values, nd.values, marker=".", label=state) plt.plot([hdelay.values[-1]], [nd.values[-1]], marker="o") plt.plot([1e3, 1e4], [2e1, 2e2], linestyle="--") plt.xlabel(f"Hospitalizations (delayed %s days)" % s["delay"]) plt.ylabel("new Deaths") plt.yscale("log") plt.xscale("log") # plt.ylim((0.01, 1.0)) fig.legend() fig.savefig(TEST_OUTPUT_DIR / (f"test_ratio_evolution_%s_states.pdf" % name))