Basic income can make switching to a flat income tax progressive

By Nate Golden and Max Ghenis, 2020-12-30

The current US income tax code taxes different types of incomes at different rates, includes an array of credits and deductions that primarily benefit the upper and middle class, and requires Americans to spend billions of hours and dollars filing taxes each year. A 2015 Pew survey found that 66 percent of Republicans and 48 percent of Democrats support completely changing the tax system. While there are many ways to reform the tax code, a simple way is taxing every dollar at the same rate; this is often called a “flat tax.” In this paper, we examine the impact of replacing today’s system with a budget-neutral combination of flat income taxes and universal basic incomes (UBIs).

US flat tax simulations

We simulated the effect of replacing the current federal income tax code and employee side payroll tax with a flat tax over a range of rates. We allocated any excess revenue to a UBI to make each reform budget-neutral, and filled budget shortfalls with a head tax (equal tax amount per person, essentially a negative UBI).

A flat tax of approximately 18 percent would raise the same amount of revenue as federal income taxes and employee side payroll do today. Each percentage point of flat tax raises enough revenue to fund a UBI of $360 per year for each adult and child.

import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
import microdf as mdf
import statsmodels.api as sm
import stargazer.stargazer as sg
from pandas_datareader import wb


summary = pd.read_csv("data/summary.csv")


BLUE = "#1976D2"
DARK_BLUE = "#1565C0"
LIGHT_BLUE = "#90CAF9"
GRAY = "#BDBDBD"
CONFIG = {"displayModeBar": False}

def add_ubi_center_watermark(fig, x, y=-0.14):
    fig.add_layout_image(
        dict(
            source="https://raw.githubusercontent.com/UBICenter/blog/master/jb/_static/ubi_center_logo_wide_blue.png",
            # See https://github.com/plotly/plotly.py/issues/2975.
            # source="../_static/ubi_center_logo_wide_blue.png",
            xref="paper", yref="paper",
            x=x, y=y,
            sizex=0.12, sizey=0.12,
            xanchor="right", yanchor="bottom"
        )
    )

fig = px.line()

fig.add_trace(
    go.Scatter(
        x=summary.flat_tax,
        y=summary.ubi.round(),
        mode="markers+lines",
        name="UBI (head tax)",
        line=dict(color=BLUE, width=2),
    )
)

fig.add_shape(
    type="line", line=dict(dash="dot", color="gray"), x0=-1, x1=50, y0=0, y1=0
)

fig.update_xaxes(
    tickangle=0,
    title_text="Flat tax rate",
    tickfont={"size": 14},
    title_standoff=25,
    ticksuffix="%",
    tickprefix="",
)

fig.update_yaxes(
    title_text="Budget-neutral annual UBI (head tax)",
    tickprefix="$",
    tickfont={"size": 14},
    title_standoff=25,
)

fig.update_xaxes(title_font=dict(size=16, color="black"))
fig.update_yaxes(title_font=dict(size=16, color="black"))
fig.update_layout(
    title_text="Budget-neutral UBI (head tax) by flat tax rate",
    hoverlabel_align="right",
    font_family="Roboto",
    title_font_size=20,
)

add_ubi_center_watermark(fig, 0.98)

fig.update_layout(plot_bgcolor="white", hovermode="x")
fig.update_layout(legend=dict(yanchor="top", y=0.99, xanchor="left", x=0.8))
fig.update_traces(mode="markers+lines")

fig.show(config=CONFIG)