About Ben Lockwood

I'm interested in behavioral economics, normative tax policy, and reducing the commute time between Boston and New York.

Taxation and the Allocation of Talent

Working paper
Joint with Charles Nathanson and E. Glen Weyl.

Abstract

Taxation affects the allocation of talented individuals across industries by blunting material incentives and thus relatively magnifying the non-pecuniary benefits of pursuing a “calling”. If higher-paying industries (e.g. finance and management) generate less positive net externalities than lower-paying professions (e.g. public service and education) this may enhance efficiency. We develop a theory of income taxation as implicit Pigouvian taxation of these externalities and calibrate it using data on the distribution of income and talent across industries. Even without any redistributive motive, tax rates are highly sensitive to the externalities assumed within a spectrum many would consider reasonable: they range from extremely regressive to highly progressive at high incomes. Our theory thus offers an alternative, pure efficiency rationale for non-linear income taxation, challenging the connection between high long-run labor supply elasticities and low optimal tax rates and motivating further study of the externalities generated by professions.

Download PDF

See the online applet associated with this paper.

Concise function for calculating tax burden in Matlab

For a given vector of tax bracket thresholds and marginal tax rates, this code calculates the tax burden for any vector of incomes. This and other utilities are available on GitHub.

function taxdue = tax(y,g)

% For a vector of incomes y, calculate the associated vector of taxes
% resulting from a bracketed income tax; g is the demogrant. 

t = [0.1 0.2 0.3 0.4 0.5];  % vector of marginal tax rates
b = [0 5 10 20 30 Inf];     % vector of tax bracket thresholds (inclusive)

I = length(y);
M = length(t);

bMat = repmat(b,I,1);
yMat = repmat(y,1,M+1);

% Calculate income exposure in each tax bracket
eMat = max(min(bMat(:,2:end),yMat(:,2:end)) - bMat(:,1:end-1),zeros(I,M));

% Calculate tax due
taxdue = eMat*t' - g;

The Pareto distribution in Matlab

Often when I want to use a simple Pareto distribution in Matlab, I have to spend a bunch of time remembering how exactly the generalized Pareto distribution (for which Matlab has a function) relates to the standard Pareto distribution, which has fewer parameters. Here is a function to compute the Pareto CDF, with shape parameter a and location parameter xm (as in the Pareto distribution Wikipedia entry) from Matlab’s Generalized Pareto CDF, gpcdf():

function f = ppdf(x,a,xm)
f = gppdf(x,1./a,xm./a,xm);

Quickly plotting a list of addresses in Google Maps from a Google Docs spreadsheet

I used Google’s Spreadsheet Mapper template, which generates both a .kmz file that can be opened in Google Earth and a link to a live Google Maps page with the relevant addresses plotted. I did have an issue getting the custom “Spreadsheet Mapper” menu to appear in the template, which I resolved by following the instructions on this page:

…click the “Tools” menu, and select “Script Editor”.  When the script editor opens, you should see a script called “Copy of SM3.0″, which is about 460 lines long. …  Force the menu creation by clicking the “Run” menu and selecting “addSpreadsheetMapperMenu”.  Then go back to the spreadsheet and see if the menu has appeared.

Although the Spreadsheet Mapper template purportedly works with a list of addresses, the instructions say it works much better if the addresses are first geocoded (i.e., if an address database is used to first look up the points’ lat/long coordinates). I used the Mapbox Geo for Google Docs toolkit to do this geocoding, which worked quite well using Yahoo’s geocoding service. (The instructions say you need a Yahoo API key for this, but it worked fine for me without one — perhaps due to the small number of queries I submitted.)

Replicating Mirrlees 1971

Here is my discussion of my attempt to replicate the numerical computations in Mirrlees’s seminal analysis of the optimal nonlinear income tax (Restud, 1971) which can be downloaded here (gated).  Although my computations yield reasonable results, they do not exactly replicate those in Mirrlees’s tables, suggesting I’ve likely made a coding error of some sort.

The code for the replication is available at github.com/bblockwood/Mirrlees-1971-Replication.

Romney’s tax rate is not really 14%

It’s been widely reported that Romney’s effective tax rate is 13.9%. The low rate is largely because he receives most of his income from investments (stock portfolio appreciation and the like), which are taxed at 15% (a far lower rate than earned income).

Greg Mankiw (Harvard economist and Romney advisor) and others have argued that the tax rate on capital returns is actually much higher, since those returns come from corporate profits, which are subject to corporate income taxation (as high as 35%). Romney himself has said that this means his tax rate is “really closer to 45 or 50 percent.”

Economist Rajiv Sethi (Columbia) has argued that this reasoning is totally wrong. The existence of the capital gains tax, he says, was already priced into Romney’s shareholdings when he bought them. The idea is this: suppose you’re bidding on a $10,000 (pre-scratched) winning lottery ticket on eBay (probably not legal, but ignore that for now). Lottery winnings are heavily taxed — say at 50% — so that when the winning bidder turns in the ticket (s)he’ll have to send the IRS $5,000 in extra taxes on the lottery winnings. With this in mind, what would you expect the winning bid to be? Obviously not more than $5,000. Suppose you bid $4,900 and win the ticket. At the end of the year, should we say you paid an extra $5,000 in taxes because of this transaction? Of course not! It’s true that you cashed a lottery ticket worth $10,000 which was taxed at 50%. But that tax was already taken into account by bidders for the ticket, so the $5,000 tax payment didn’t cost you anything. Similarly (this argument goes) we shouldn’t take the corporate income tax into account when calculating Romney’s tax rate, because the prices of his shares were already reduced accordingly when he bought them.

These two stories seem glaringly inconsistent — according to Mankiw, Romney pays a higher tax rate than any of us; according to Sethi, Romney’s tax rate is very low. So what’s going on? I emailed Mankiw to ask for his take on Sethi’s post, and he responded with a one-liner:

If we levied a tax on land, to whom would you attribute the tax burden?

I thought about this a bit and wrote back:

Good point. I would expect land prices to fall immediately at the time the tax is announced, effectively making a transfer from the (then) landowner to the government. Thereafter, land prices would be such that cash flow from the land generates the risk free rate of return.

In the case of securities, I would expect share prices to be such that the post-tax cash flow (net of both corporate and capital gains taxes) equals the market interest rate. So it might not make sense to attribute a corporate tax burden (or a capital gains tax burden) to current capital holders at all, since the burden was born entirely by whoever held the capital when the tax was announced. Is that similar to how you think about this? (Obviously there are GE [general equilibrium] effects as well, since the higher tax means fewer projects will generate positive net returns, and the tax harms those marginal project-holders.)

To which Mankiw responded:

Yes, I think so. 

 In general, the CBO calculations on tax incidence are static.  That is, they assume capital bears the burden of all capital taxes, and labor bears the burden of all labor taxes.  That is right in one-period model if capital and labor are inelastically supplied.   

But as you point out, there are complicated intertemporal issues, which surely complicate things.  To the extent taxes are capitalized into prices, the original owners bear the entire burden. 

 I get the feeling that you won’t know the “right” answer until the question is more precisely posed.  That is, what are these effective tax rates supposed to measure?

Upshot: it’s not really clear what we mean when we say “Jane’s tax rate was X.” Do we mean “The IRS received a check for X*(Jane’s income) from Jane”? The lottery ticket example demonstrates that this is a completely uninformative statement. Someone could have sent the IRS a very large check without incurring any costs. In fact, if the winning bidder had a low enough income, (s)he could have a tax rate over 100%! We probably mean something more like “Taxes imposed a cost of X on Jane”. That seems like a more interesting question — but it also means that we need to take into account price movements caused by taxes. These issues are covered in the tax incidence literature. The calculations depend on the elasticities of demand and supply in the relevant markets.

One final note: in these incidence calculations, both the corporate income tax and the capital gains tax enter in the same way — they create a wedge between the cash flow paid by a security and the net income received by the shareholder. Therefore it’s almost certainly not right to talk about Romney’s 14% tax rate — the range could be anywhere between 0 and 50% depending on how well you think prices incorporate future taxes, but there’s not a clear reason to count the capital gains tax while ignoring the corporate income tax.

To follow Reagan, be SMART (not contractionary)

Asked for my take on John Taylor’s WSJ opinion piece today. Here was my quick reaction:

I find articles like this frustrating, because they recount a bunch of coincident occurrences and (implicitly) assume causation. “This then that (so this must have caused that, right?)” I much prefer empirical studies that try to establish causation — and fortunately there are loads of such studies on these topics. Obviously there are challenges even there, but they are way more convincing than Taylor’s narrative.

As for the content, I completely agree with the need for a simpler tax system, broader tax base and lower marginal tax rates (corporate, income, maybe capital gains too). Taylor writes as if tax complexity, permanent big government, Keynesian fiscal policy, and expansionary monetary policy all go hand in hand. That’s not right — I oppose the first two, cautiously favor the third, and strongly favor the fourth. Moreover, Taylor gives the impression that because Reagan did well in the 80s, current Republican policy is what we need now.

But in fact I find current Republicans on exactly the wrong side of some of these issues. The right way to interpret Reagan’s monetary policy is that it was smart given the circumstances — not that we should be all-contractionary-all-the-time. In the current environment, smart monetary policy is expansionary. Unlike the contraction in the 80s, which was driven by supply side forces (e.g. high oil prices), much of the current problem is insufficient demand (which explains why inflation is so low), and expansionary monetary policy helps correct that. I think Milton Friedman would agree here. But many Republicans are criticizing Bernanke’s (somewhat) expansionary monetary policy, and rather than taking advice from economists and standing up to those critics, too many Republican leaders are deferring to them. (Here’s an interesting article on Romney suggesting as much.) Gingrich says similar things, and Ron Paul, much as I love his tenacity and independence, is the worst of all of them on this point.

Upshot: yes, let’s go for simplicity and broad-based, low-marginal-rate taxes. But let’s not confuse that with contractionary short-run monetary and fiscal policy, as many current R’s seem to be doing.

Calculating the normal CDF in AMPL with shared libraries

UPDATE: AMPL has since added support for the GNU Scientific Library which includes an error function, as discussed here.

AMPL does not have a built in function for the normal cdf (error function) — see the post from Robert Fourer on the Google Groups page for AMPL (a great resource). To use the function in a model, you need to use a shared C library that can do the computation. I got it working (on my Mac) using the following process.

The AMPL site has a page on this topic. It turns out you need to find the folder …/ampl/solvers/ on your system. I couldn’t find it for my version of AMPL (perhaps because I have a version that comes packaged with the Knitro solver). But netlib.org hosts a copy of the folder. They say you can get a copy of the whole thing by emailing them, but this didn’t work quickly for me, so I used wget to download the whole thing, as described here, with the following command:

wget -r -np -nH –cut-dirs=3 -R index.html http://www.netlib.org/ampl/solvers

The goal is to compile the file …/ampl/solvers/funclink/funcadd.c into the library amplfunc.dlll. (This funcadd.c doesn’t include the error function, but that’s the easy part once you get this working…) I tried to compile with the following commands (which require compilers — you can get these on a Mac by downloading Xcode):

cd .../ampl/solvers/funclink
make -f makefile.macosx

This threw me an error that there was no stdio1.h. I tried renaming …/ampl/solvers/stdio1.h0 to …/ampl/solvers/stdio1.h and that seemed to resolve the issue. I was able to successfully run

ampl silly.x >silly.out 2>silly.2

as described in the funclink README. But we still don’t have error function code itself. To get it, downloaded Robert Vanderbei’s code for his version of funcadd.c, which includes a function myerf(). I replaced the file …/ampl/solvers/funclink/funcadd.c from netlib.org with Vanderbei’s version and tried to recompile using the make command above. Turns out I also needed to download Vanderbei’s file myalloc.h, which I placed in …/ampl/solvers/funclink/, and the compiler couldn’t initially find OS X’s built-in malloc.h, so I changed the following line in myalloc.h:

#include <malloc.h>

to

#include </usr/include/sys/malloc.h>

This worked, and regenerated the file amplfunc.dlll, though it threw a bunch of warnings in the process. I copied this file into the directory where I wanted to run the AMPL model from (AMPL automatically looks for such a file in the directory where it is launched). Upon launching AMPL interactively, I typed

function myerf;

to import the function, then

display myerf(1.96);

and I got the output:

myerf(1.96) = 0.975002