Counterfactuals

UFXP recovers the utility parameters in the same parameterization as the data-generating process. Counterfactual analysis therefore works exactly as it does for NFXP. Change a parameter, re-solve the dynamic program once, and read off the new policy and value function.

result = model.counterfactual(RC=15.0)

print(result.params)   # parameters used for the counterfactual solve
print(result.policy)   # choice probabilities under the new world
print(result.value)    # value function under the new world

Counterfactual Families

The validation cell checks recovered counterfactual behavior against exact oracle objects for three intervention families:

Family

Intervention

Checked against

Type A

Reward shift (a payoff component changes).

Oracle policy, value, and welfare regret.

Type B

Transition change (the dynamics change).

Oracle policy, value, and welfare regret.

Type C

Action removal (one action is penalized away).

Oracle policy, value, and welfare regret.

Reported Results

On the canonical synthetic cell the welfare regret of UFXP’s counterfactual policies is below 0.0003 in every family (Type A 0.00016, Type B 0.00030, Type C 0.00008; see the machine-readable results file and the Simulation Study page). Because the recovered reward uses the same linear feature parameterization as the truth, it re-solves cleanly under all three intervention types.