choice.RustNFP
Guide & worked example · Source
choice.RustNFP(
n_states,
n_choices,
discount_factor,
transition_type='nonparametric',
optimizer=torch.optim.LBFGS,
maxiter=1000,
tol=1e-06,
device=None,
estimate_transitions=False,
)Rust (1987) full maximum likelihood via nested fixed point (NFP).
Attributes
| Name | Description |
|---|---|
device |
|
discount_factor |
|
estimate_transitions |
|
history |
|
maxiter |
|
n_choices |
|
n_states |
|
optimizer_class |
|
params |
|
tol |
|
transition_matrix |
|
transition_params |
|
transition_type |
|
utility_fn |
|
utility_params |
Methods
| Name | Description |
|---|---|
| counterfactual | Re-solve and simulate altered utilities without mutating fitted state. |
| fit | Fit the model to the data. |
| predict_proba | Structural/equilibrium probabilities using fitted utility coefficients. |
| set_flow_utility | Specify per-period utility ū(x, a; θ). |
| set_transition_probabilities | Specify state transition mechanism P(x_{t+1} | x_t, a_t). |
| simulate | Simulate paths under fitted utility and transition probabilities. |
| solve_value_functions | Solve value function fixed point via successive approximations. |
| summary | Print a formatted summary of model estimation results. |
| to | Move model and transition matrix to specified device. |
counterfactual
choice.RustNFP.counterfactual(data, policy_change, rng=None, *, n_periods=None)Re-solve and simulate altered utilities without mutating fitted state.
Starts with each individual’s earliest observation. Default horizon is the largest number of observed periods per individual, not max(time ID). Pass n_periods explicitly for unbalanced-panel policy simulations.
fit
choice.RustNFP.fit(data, init_params=None, verbose=False)Fit the model to the data. Overriden to handle DynamicChoiceData.
predict_proba
choice.RustNFP.predict_proba(states)Structural/equilibrium probabilities using fitted utility coefficients.
For Hotz-Miller this re-solves the Bellman equation; it does not return the empirical first-stage CCPs or freeze them under policy changes.
set_flow_utility
choice.RustNFP.set_flow_utility(utility_fn, utility_params=None)Specify per-period utility ū(x, a; θ).
Args: utility_fn: Function computing u(x, a; θ) utility_params: Initial values for θ
set_transition_probabilities
choice.RustNFP.set_transition_probabilities(
transition_matrix,
transition_params=None,
)Specify state transition mechanism P(x_{t+1} | x_t, a_t).
Args: transition_matrix: (n_states, n_choices, n_states) tensor P[x, a, x’] = Pr(x_{t+1}=x’ | x_t=x, a_t=a) transition_params: Parameters φ if transitions are parametric
Raises: ValueError: If transition matrix shape is incorrect
simulate
choice.RustNFP.simulate(initial_states, n_periods, rng=None)Simulate paths under fitted utility and transition probabilities.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| initial_states | tensor of shape (n_individuals,) | Integer state indices at the start of the simulation. | required |
| n_periods | int | Number of decisions per individual. | required |
| rng | torch.Generator | Random generator matching the model’s device; not a NumPy RNG. | None |
Returns
| Name | Type | Description |
|---|---|---|
| tuple of torch.Tensor | State paths with shape (n_individuals, n_periods + 1) and action paths with shape (n_individuals, n_periods). |
solve_value_functions
choice.RustNFP.solve_value_functions(flow_utility, tol=1e-08, max_iter=10000)Solve value function fixed point via successive approximations.
Iterates: v̄^{k+1} = T(v̄^k) until convergence, where T is the Bellman operator.
Args: flow_utility: (n_states, n_choices) per-period utilities ū(x,a) tol: Convergence tolerance for sup-norm max_iter: Maximum iterations
Returns: v_bar: (n_states, n_choices) converged value functions
Raises: RuntimeError: If iteration does not converge
summary
choice.RustNFP.summary(alpha=0.05)Print a formatted summary of model estimation results.
Displays a comprehensive table including parameter estimates, standard errors, t-statistics, p-values, and confidence intervals (if standard errors are available).
Args: alpha: Significance level for confidence intervals (default: 0.05 for 95% confidence intervals).
Examples: >>> model.fit(X, y) >>> model.summary(alpha=0.01) # 99% confidence intervals
to
choice.RustNFP.to(device)Move model and transition matrix to specified device.