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.