def test_return_scalar_for_likelihood(model): params, options = process_model_or_seed(model) simulate = get_simulate_func(params, options) df = simulate(params) loglike = get_crit_func(params, options, df, return_scalar=True) value = loglike(params) assert isinstance(value, float) loglike = get_crit_func(params, options, df, return_scalar=False) array = loglike(params) assert isinstance(array, np.ndarray)
def test_equality_for_myopic_agents_and_tiny_delta(): """Test equality of simulated data and likelihood with myopia and tiny delta.""" # Get simulated data and likelihood for myopic model. params, options = generate_random_model(myopic=True) simulate = rp.get_simulate_func(params, options) df = simulate(params) crit_func = get_crit_func(params, options, df) likelihood = crit_func(params) # Get simulated data and likelihood for model with tiny delta. params.loc["delta", "value"] = 1e-12 df_ = simulate(params) crit_func_ = rp.get_crit_func(params, options, df_) likelihood_ = crit_func_(params) # The continuation values are different because for delta = 0 the backward induction # is completely skipped and all continuation values are set to zero whereas for a # tiny delta, the delta ensures that continuation have no impact. columns = df.filter(like="Continu").columns.tolist() pd.testing.assert_frame_equal(df.drop(columns=columns), df_.drop(columns=columns)) np.testing.assert_almost_equal(likelihood, likelihood_, decimal=12)
def test_generate_random_model(): """Test if random model specifications can be simulated and processed.""" params, options = generate_random_model() df = simulate_truncated_data(params, options) crit_func = get_crit_func(params, options, df) crit_val = crit_func(params) assert isinstance(crit_val, float)
def test_simulation_and_estimation_with_different_models(): """Test the evaluation of the criterion function not at the true parameters.""" # Simulate a dataset params, options = generate_random_model() df = simulate_truncated_data(params, options) # Evaluate at different points, ensuring that the simulated dataset still fits. crit_func = get_crit_func(params, options, df) params_ = add_noise_to_params(params, options) params.equals(params_) crit_func(params)
def test_invariant_results_for_two_estimations(): params, options = generate_random_model() df = simulate_truncated_data(params, options) crit_func = get_crit_func(params, options, df) # First estimation. crit_val = crit_func(params) # Second estimation. crit_val_ = crit_func(params) assert crit_val == crit_val_
def test_return_comparison_plot_data_for_likelihood(model): params, options = process_model_or_seed(model) simulate = get_simulate_func(params, options) df = simulate(params) loglike = get_crit_func(params, options, df, return_comparison_plot_data=False) loglike = loglike(params) assert isinstance(loglike, float) loglike = get_crit_func(params, options, df, return_comparison_plot_data=True) loglike, df = loglike(params) assert isinstance(loglike, float) assert isinstance(df, pd.DataFrame)
def test_invariant_results_for_two_estimations(): num_agents = np.random.randint(5, 100) constr = { "simulation_agents": num_agents, "n_periods": np.random.randint(1, 4), "n_lagged_choices": np.random.choice(2), } # Simulate a dataset. params, options = generate_random_model(point_constr=constr) df = simulate_truncated_data(params, options) crit_func = get_crit_func(params, options, df) # First estimation. crit_val = crit_func(params) # Second estimation. crit_val_ = crit_func(params) assert crit_val == crit_val_
def test_invariance_of_model_solution_in_solve_and_criterion_functions(model): params, options = process_model_or_seed(model) options["n_periods"] = 2 if model == "kw_2000" else 3 solve = get_solve_func(params, options) state_space = solve(params) simulate = get_simulate_func(params, options) df = simulate(params) state_space_sim = simulate.keywords["solve"].keywords["state_space"] criterion = get_crit_func(params, options, df) _ = criterion(params) state_space_crit = criterion.keywords["solve"].keywords["state_space"] for state_space_ in [state_space_sim, state_space_crit]: assert state_space.core.equals( state_space_.core.reindex_like(state_space.core)) apply_to_attributes_of_two_state_spaces( state_space.get_attribute("wages"), state_space_.get_attribute("wages"), np.testing.assert_array_equal, ) apply_to_attributes_of_two_state_spaces( state_space.get_attribute("nonpecs"), state_space_.get_attribute("nonpecs"), np.testing.assert_array_equal, ) apply_to_attributes_of_two_state_spaces( state_space.get_attribute("expected_value_functions"), state_space_.get_attribute("expected_value_functions"), np.testing.assert_array_equal, ) apply_to_attributes_of_two_state_spaces( state_space.get_attribute("base_draws_sol"), state_space_.get_attribute("base_draws_sol"), np.testing.assert_array_equal, )
def test_simulation_and_estimation_with_different_models(): """Test the evaluation of the criterion function not at the true parameters.""" # Set constraints. num_agents = np.random.randint(5, 100) constr = { "simulation_agents": num_agents, "n_periods": np.random.randint(1, 4), "edu_max": 15, "edu_start": [7], "edu_share": [1], "n_lagged_choices": np.random.choice(2), } # Simulate a dataset params, options = generate_random_model(point_constr=constr) df = simulate_truncated_data(params, options) # Evaluate at different points, ensuring that the simulated dataset still fits. params, options = generate_random_model(point_constr=constr) crit_func = get_crit_func(params, options, df) crit_func(params)
def test_equality_for_myopic_agents_and_tiny_delta(seed): """Test equality of simulated data and likelihood with myopia and tiny delta.""" np.random.seed(seed) # Get simulated data and likelihood for myopic model. params, options = generate_random_model(myopic=True) simulate = rp.get_simulate_func(params, options) df = simulate(params) crit_func = get_crit_func(params, options, df) likelihood = crit_func(params) # Get simulated data and likelihood for model with tiny delta. params.loc["delta", "value"] = 1e-12 df_ = simulate(params) crit_func_ = rp.get_crit_func(params, options, df_) likelihood_ = crit_func_(params) pd.testing.assert_frame_equal(df, df_) np.testing.assert_almost_equal(likelihood, likelihood_, decimal=12)
def compute_log_likelihood(params, options): df = simulate_truncated_data(params, options) crit_func = get_crit_func(params, options, df) crit_val = crit_func(params) return crit_val