Rust Bus Engine Example

Read this page as a runnable TD-CCP smoke test. It shows usage on bundled data; the transition-density-free recovery claim is evaluated on the simulation page.

The Rust bus-engine replacement problem is the standard dynamic discrete choice example. A bus operator observes mileage and chooses whether to keep the current engine or replace it.

EconIRL ships a small Rust-style dataset for a public TD-CCP smoke test.

from econirl.datasets import load_rust_bus
from econirl import TDCCP

df = load_rust_bus()

model = TDCCP(
    n_states=90,
    n_actions=2,
    discount=0.9999,
    utility="linear_cost",
    method="semigradient",
)
model.fit(df, state="mileage_bin", action="replaced", id="bus_id")

print(model.params_)
print(model.summary())

Interpretation

The linear_cost specification estimates two parameters: the mileage cost slope and the replacement cost. The fitted policy gives the replacement probability at each mileage state.

states = [0, 10, 50, 89]
print(model.predict_proba(states))

Replication Boundary

This page is a package smoke test on the bundled dataset, not the simulation study. The estimator’s recovery properties are established on a synthetic cell whose data-generating process is fully specified; see the Simulation Study page. The bus engine simulation page compares TD-CCP against the full estimator roster on a synthetic bus engine panel.

The structural parameter step does not use a transition model; the wrapper may estimate transitions from the panel for fitted policy and value outputs after theta is recovered.