Source code for taxbrain.corporate_incidence
# imports
import copy
# Default parameters for the CorporateIncidence class
CI_PARAMS = {
"Incidence": { # long-run incidence of corporate tax
"Labor share": 0.5,
"Shareholder share": 0.4,
"All capital share": 0.1,
},
"Long run years": 10, # number of years to reach long-run incidence
}
VAR_NAME_MAP = {
"Dividends": "e00650",
"Capital gains": "e01100",
"Self-employment income": "e00900",
"Taxable interest": "e00300",
"Tax-exempt interest": "e00300",
}
SHORT_RUN_SHARES = {
"Labor share": 0.0,
"Shareholder share": 1.0,
"All capital share": 0.0,
}
# TODO: think about if corp revenue intended to be entered in billions or what
[docs]
def distribute(calc, corp_revenue, year, start_year, param_updates=None):
"""
Function that distributes the corporate income tax incidence across
individual income tax payers.
"""
if param_updates:
CI_PARAMS.update(param_updates)
# Make a copy so as not to modify calculator object
calc_corp = copy.deepcopy(calc)
# Find index of year working on
i = year - start_year
# take revenue total for the relevant year
if isinstance(corp_revenue, dict):
corp_revenue = corp_revenue["year"]
else:
corp_revenue = corp_revenue[i]
# adjust parameters for the transition to the long run
shares = {}
for k, v in CI_PARAMS["Incidence"].items():
if CI_PARAMS["Long run years"] == 0:
shares[k] = v
else:
increment = (v - SHORT_RUN_SHARES[k]) / CI_PARAMS["Long run years"]
# use min() so don't "overshoot" the long run share
shares[k] = (
SHORT_RUN_SHARES[k]
+ min(i, CI_PARAMS["Long run years"]) * increment
)
# update income in the calc object
calc_corp = _update_income(calc_corp, corp_revenue, shares)
return calc_corp
[docs]
def _update_income(calc, revenue, shares):
"""
Implement income changes to account for corporate tax
incidence on household filers
"""
# Find aggregate change in wages
agg_wage = shares["Labor share"] * revenue
# Find aggregate change in dividend/capital gains
agg_shareholder = shares["Shareholder share"] * revenue
# Find aggregate change in other capital income
agg_other_capital = shares["All capital share"] * revenue
# With aggregates, compute pct change in each
wage_income_vars = ["e00200"]
shareholder_income_vars = ["p22250", "p23250", "e00600"]
other_capital_income_vars = [
"e00300",
"e00400",
"e01100",
"e01200",
"e02000",
] # do we try to capture just some of e02000?
denom = 0
for v in wage_income_vars:
denom += (calc.array(v) * calc.array("s006")).sum()
pct_change_wage = agg_wage / denom
denom = 0
for v in shareholder_income_vars:
denom += (calc.array(v) * calc.array("s006")).sum()
pct_change_shareholder = agg_shareholder / denom
denom = 0
for v in other_capital_income_vars:
denom += (calc.array(v) * calc.array("s006")).sum()
pct_change_other_capital = agg_other_capital / denom
# we will apply these percentage changes to the relevant income sources
# need to scale other wages so their sum equals total
for v in wage_income_vars + ["e00200p", "e00200s"]:
delta = calc.array(v) * pct_change_wage
calc.incarray(v, delta)
for v in shareholder_income_vars:
delta = calc.array(v) * pct_change_shareholder
calc.incarray(v, delta)
for v in other_capital_income_vars + ["e00650"]:
# scale qualified dividends as well, though they are included
# in e00600
delta = calc.array(v) * pct_change_other_capital
calc.incarray(v, delta)
return calc