Quick Start

from econirl.datasets import load_rust_bus
from econirl import UFXP

df = load_rust_bus()

model = UFXP(n_states=90, discount=0.9999, utility="linear_cost")
model.fit(df, state="mileage_bin", action="replaced", id="bus_id")

print(model.params_)          # {"theta_c": ..., "RC": ...}
print(model.se_)              # standard errors (optimal weighting)
print(model.summary())

Fitted attributes follow the same convention as NFXP and CCP:

Attribute

Meaning

params_

Estimated parameters by name.

se_

Standard errors from the efficient moment variance.

coef_

Coefficients as a numpy array.

log_likelihood_

Log-likelihood evaluated at the estimate.

policy_

Choice probabilities P(a given s), shape (n_states, n_actions).

value_

Value function V(s), shape (n_states,).

converged_

Whether the closed-form solve had full rank.

Weighting Modes

model = UFXP(n_states=90, weights="optimal")   # default: efficient, with SEs
model = UFXP(n_states=90, weights="random",    # plain random projections
             num_projections=64)               # consistent, no SEs

The default optimal weighting is the one to use; the random-projection mode is the paper’s baseline construction and is kept for comparison.

Lower-Level Control

The underlying UFXPEstimator accepts a Panel and an explicit utility specification, problem definition, and transition tensor, mirroring the other low-level estimators:

from econirl.estimation import UFXPEstimator

result = UFXPEstimator().estimate(panel, utility, problem, transitions)