Recipe 2: Estimating Behavioral Response to Reform

Recipe 2: Estimating Behavioral Response to Reform#

This is an advanced recipe that should be followed only after mastering the basic recipe. This recipe shows how to analyze the behavioral responses to a tax reform using the Tax-Calculator behresp module.

The assumed elasticities below specify a substitution elasticity of taxable income of 0.25 and leave the income elasticity (inc) and the capital-gains semi-elasticity (cg) at their default value of zero, so only the substitution response channel is active. Each elasticity is documented on the behavior parameters page.

import sys
if 'google.colab' in sys.modules:
    !pip install -q condacolab &> /dev/null # dev/null suppresses output
    import condacolab
    condacolab.install()
import taxcalc as tc

# use publicly-available CPS input file
recs = tc.Records.cps_constructor()

# specify baseline Calculator object representing current-law policy
pol = tc.Policy()
calc1 = tc.Calculator(policy=pol, records=recs)

CYR = 2020

# calculate aggregate current-law income tax liabilities for cyr
calc1.advance_to_year(CYR)
calc1.calc_all()
itax_rev1 = calc1.weighted_total('iitax')

# specify Calculator object for static analysis of reform policy
pol.implement_reform(tc.Policy.read_json_reform('github://PSLmodels:Tax-Calculator@master/docs/recipes/_static/reformA.json'))
calc2 = tc.Calculator(policy=pol, records=recs)

# calculate reform income tax liabilities for cyr under static assumptions
calc2.advance_to_year(CYR)
calc2.calc_all()
itax_rev2sa = calc2.weighted_total('iitax')

# specify assumed non-zero response-function substitution elasticity
# (the omitted 'inc' and 'cg' elasticities are assumed to be zero)
response_elasticities = {'sub': 0.25}

# specify Calculator object for analysis of reform with behavioral responses
# (the response function returns baseline and reform DataFrame objects and
#  leaves calc1 and calc2 unchanged; the discarded first DataFrame contains
#  the baseline results, which are the same as the calc1 results above)
calc2 = tc.Calculator(policy=pol, records=recs)
calc2.advance_to_year(CYR)
_, df2br = tc.response(calc1, calc2, response_elasticities)

# calculate reform income tax liabilities for CYR with behavioral response
# (weighted_total cannot be used here because the response function returns
#  a DataFrame rather than a Calculator object, so the weighting by the s006
#  filing-unit sampling weight must be done explicitly)
itax_rev2br = (df2br['iitax'] * df2br['s006']).sum()

# print total income tax revenue estimates for CYR
# (estimates in billons of dollars)
print('{}_CURRENT_LAW_P__itax_rev($B)= {:.3f}'.format(CYR, itax_rev1 * 1e-9))
print('{}_REFORM_STATIC__itax_rev($B)= {:.3f}'.format(CYR, itax_rev2sa * 1e-9))
print('{}_REFORM_DYNAMIC_itax_rev($B)= {:.3f}'.format(CYR, itax_rev2br * 1e-9))
2020_CURRENT_LAW_P__itax_rev($B)= 773.586
2020_REFORM_STATIC__itax_rev($B)= 777.761
2020_REFORM_DYNAMIC_itax_rev($B)= 765.480

Create multi-year diagnostic tables for

  1. baseline,

  2. reform excluding behavioral responses, and

  3. reform including behavioral responses

Each year in the loop below is analyzed independently: the response function is called once per year and no response computed in one year is carried over into another year. This means that retiming behavior, most notably the realization timing of capital gains, is not being modeled.

NUM_YEARS = 3  # number of diagnostic table years beginning with CYR
dtable1 = calc1.diagnostic_table(NUM_YEARS)
dtable2 = calc2.diagnostic_table(NUM_YEARS)
dvar_list3 = list()
year_list3 = list()
for year in range(CYR, CYR + NUM_YEARS):
    calc1.advance_to_year(year)
    calc2.advance_to_year(year)
    _, df2br = tc.response(calc1, calc2, response_elasticities)
    dvar_list3.append(df2br)
    year_list3.append(year)
dtable3 = tc.create_diagnostic_table(dvar_list3, year_list3)

Diagnostic table for baseline:

dtable1
2020 2021 2022
Returns (#m) 204.480 207.080 209.660
AGI ($b) 11572.622 13242.423 13524.306
Itemizers (#m) 27.730 31.470 31.360
Itemized Deduction ($b) 752.070 872.132 888.626
Standard Deduction Filers (#m) 176.760 175.600 178.300
Standard Deduction ($b) 3076.456 3093.014 3226.914
Personal Exemption ($b) 0.000 0.000 0.000
Taxable Income ($b) 8619.495 10113.674 10314.080
Regular Tax ($b) 1498.030 1776.937 1834.977
AMT Income ($b) 10952.969 12526.741 12790.776
AMT Liability ($b) 0.544 1.466 0.642
AMT Filers (#m) 0.070 0.190 0.080
Tax before Credits ($b) 1498.574 1778.403 1835.620
Refundable Credits ($b) 638.295 809.248 82.664
Nonrefundable Credits ($b) 99.269 0.005 107.426
Reform Surtaxes ($b) 0.000 0.000 0.000
Other Taxes ($b) 75.874 83.585 87.423
Ind Income Tax ($b) 773.586 984.073 1661.160
Payroll Taxes ($b) 1217.941 1321.368 1415.259
Combined Liability ($b) 1991.527 2305.442 3076.419
With Income Tax <= 0 (#m) 135.400 127.590 95.550
With Combined Tax <= 0 (#m) 97.110 96.390 65.180
UBI Benefits ($b) 0.000 0.000 0.000
Total Benefits, Consumption Value ($b) 3617.042 3992.973 4070.218
Total Benefits Cost ($b) 3617.042 3992.973 4070.218

Diagnostic table for reform, excluding behavioral responses:

dtable2
2020 2021 2022
Returns (#m) 204.480 207.080 209.660
AGI ($b) 11572.622 13242.423 13524.306
Itemizers (#m) 27.650 31.350 31.240
Itemized Deduction ($b) 749.589 868.770 885.538
Standard Deduction Filers (#m) 176.830 175.720 178.420
Standard Deduction ($b) 3077.794 3095.035 3228.878
Personal Exemption ($b) 375.177 384.158 406.780
Taxable Income ($b) 8371.710 9848.979 10037.843
Regular Tax ($b) 1499.855 1781.493 1841.599
AMT Income ($b) 10957.001 12531.570 12795.427
AMT Liability ($b) 0.551 1.494 0.642
AMT Filers (#m) 0.070 0.190 0.080
Tax before Credits ($b) 1500.406 1782.987 1842.241
Refundable Credits ($b) 641.613 809.248 86.370
Nonrefundable Credits ($b) 93.606 0.002 101.739
Reform Surtaxes ($b) 0.000 0.000 0.000
Other Taxes ($b) 75.874 83.585 87.423
Ind Income Tax ($b) 777.761 988.660 1669.763
Payroll Taxes ($b) 1217.941 1321.368 1415.259
Combined Liability ($b) 1995.703 2310.028 3085.022
With Income Tax <= 0 (#m) 137.560 129.830 98.410
With Combined Tax <= 0 (#m) 97.850 97.280 65.740
UBI Benefits ($b) 0.000 0.000 0.000
Total Benefits, Consumption Value ($b) 3617.042 3992.973 4070.218
Total Benefits Cost ($b) 3617.042 3992.973 4070.218

Diagnostic table for reform, including behavioral responses:

dtable3
2020 2021 2022
Returns (#m) 204.480 207.080 209.660
AGI ($b) 11545.738 13208.543 13488.613
Itemizers (#m) 27.620 31.320 31.230
Itemized Deduction ($b) 748.311 867.067 884.075
Standard Deduction Filers (#m) 176.860 175.750 178.440
Standard Deduction ($b) 3078.355 3095.710 3229.233
Personal Exemption ($b) 375.177 384.158 406.780
Taxable Income ($b) 8345.067 9815.641 10002.761
Regular Tax ($b) 1487.854 1766.985 1826.215
AMT Income ($b) 10930.718 12498.777 12760.603
AMT Liability ($b) 0.550 1.492 0.637
AMT Filers (#m) 0.070 0.190 0.080
Tax before Credits ($b) 1488.405 1768.477 1826.852
Refundable Credits ($b) 641.376 809.279 86.175
Nonrefundable Credits ($b) 93.823 0.002 101.972
Reform Surtaxes ($b) 0.000 0.000 0.000
Other Taxes ($b) 75.395 83.011 86.832
Ind Income Tax ($b) 765.480 973.750 1653.977
Payroll Taxes ($b) 1217.258 1320.297 1414.153
Combined Liability ($b) 1982.738 2294.047 3068.130
With Income Tax <= 0 (#m) 137.530 129.810 98.260
With Combined Tax <= 0 (#m) 97.830 97.260 65.600
UBI Benefits ($b) 0.000 0.000 0.000
Total Benefits, Consumption Value ($b) 3617.042 3992.973 4070.218
Total Benefits Cost ($b) 3617.042 3992.973 4070.218