Counterfactuals
Read this page as structural re-solving. NFXP estimates reward parameters in a model that can be solved again after a primitive changes.
NFXP recovers the utility parameters in the same parameterization as the data-generating process, so counterfactual analysis is straightforward: change a parameter, re-solve the dynamic program once, and read off the new policy and value function.
cf = model.counterfactual(RC=4.0)
print(cf.params)
print(cf.value_function)
print(cf.policy)
Counterfactual Families
The simulation cell checks recovered counterfactual behavior against exact oracle objects for three intervention families:
Type |
Intervention |
Purpose |
|---|---|---|
Type A |
Shift rewards and hold transitions fixed. |
Payoff counterfactual. |
Type B |
Change transitions and hold rewards fixed. |
State-dynamics counterfactual. |
Type C |
Disable one non-anchor action. |
Action-set or design counterfactual. |
Reported Results
These rows come from the same results file used on the Simulation Study page (see also the results file).
Counterfactual |
Policy TV |
Policy KL |
Value RMSE |
Regret |
|---|---|---|---|---|
Type A |
0.005109 |
7.56e-5 |
0.000238 |
0.000213 |
Type B |
0.005457 |
8.20e-5 |
0.000363 |
0.000362 |
Type C |
0.003548 |
3.56e-5 |
0.000114 |
0.000086 |
The regret values are small because the recovered reward is close enough to the true reward that re-solving the dynamic program under each intervention produces nearly the same policy as the true-parameter solution.