Does Adding Expensive Housing Help The Little Guy?

According to our analysis, expensive housing helps not only the little guy but every other income group.
By Sonja Trauss | Jul 03, 2018 |
By Sonja Trauss | Jul 03, 2018 |
Graph from @localpolitics

A central question of our housing debate is whether building new (expensive) housing protects existing low-cost housing, or destroys it. I have had the great fortune over the last year and a half to discuss this question with hundreds of people. What we all have in common is whatever side we take, we believe the relationship is perfectly obvious.

In an effort to clarify my own thinking, and double check that my mental model didn’t have any hidden internal inconsistencies, Davi Caetano, Phil Nova, Matt Lichti, Avi Flamholz, Jean-Ezra Yeung and I wrote a simulation of a housing market. Our initial conditions were 15,000 people and 10,000 housing units. Our intervention was adding 2,000 more “luxury” units.  What we found was that after adding luxury units, displacement decreased at every income level.


1. The primary assumption of this model is that the number of people who want to live in the housing market (demand for housing) is exogenous. Exogenous means that the demand for housing, 15,000, is determined by something outside the model (“exo” means “outside.” Think of “exoskeleton”).

The thinking here is that the number of people who want to live in the Bay Area is determined by how many jobs are in the bay area. Our model is of the housing market, not the whole economy, so the number of jobs is outside of the model.

This is not a universally held assumption. There is a widespread belief that demand for housing, and especially the demand for certain types of housing, is determined by the supply of that housing. This is the foundational assumption of the Residential Nexus Analysis, justifying inclusionary zoning and in-lieu fees. The idea there is that building high priced housing causes high income people to move to the Bay Area, who otherwise would not have moved here.

2. In this draft of the model no landlords have an effective (or binding) reserve price. All landlords here have decided they want to rent out their apartment and they will accept whatever rent they can. Prices of apartments are determined by bidding amongst renters.

The type of simulation we built is called an Agent Based Model. An agent based model is a short computer program that has agents, rules for the agents’ interactions, and a function that forces the agents to interact.


The agents in this model are Renters and Houses. Here is the code for our agents.

The agent called “Renter” is initialized with two attributes: willingness (or ability, really) to pay for housing, and an attribute called “min_score.” Min_score is a number between 1 and 5 that expresses how flexible or specific the Renter is with respect to his or her housing needs. For simplicity, this is a composite score. A renter with a min_score of 5 might be a single person with expensive tastes, but it could also be a large family. The person with expensive tastes will filter out most apartments based on his or her perception of their quality, the large family will filter out most apartments because they are too small, irrespective of their quality.

The agent called “House” is initialized with only one attribute: score. This is a number between 1 and 5 that expresses how nice or big or conveniently located the apartment is. It corresponds with the min_score described above. Like min_score, it is a composite. An apartment with a score of 3 might be a small, ugly apartment in a convenient neighborhood, or a large, beautiful apartment in a remote or run down neighborhood.

Generating the Agents

As mentioned above, we generated 15,000 renters for this demonstration. The income distribution of the 15,000 generated renters is based on 2013 distribution of San Francisco household incomes. Assuming each household can spend a max of 1/3 of pretax income on rent, we divided each renters’ annual income by 36 to get their maximum monthly willingness to pay.


The income distribution of the generated agents is skewed right, which means it has a long tail on the right. Most people’s maximum rent is between $0 and $5,000 per month, with a small number of people able to afford up to $20,000 per month.

The distribution of agents’ preferences was uniform. 3,000 renters would accept an apartment of quality at least “1,” 3,000 renters renters would accept an apartment of quality at least “2,” 3,000 renters would accept an apartment of quality of at least “3,” and so on.


Here is a scatter plot of generated agents. As we see in the previous plot, most agents can afford between $0 and $5000 a month in rent, with fewer agents able to afford higher priced apartments. However, agents are evenly distributed with respect to the vertical (y) axis. There are as many renters with specific needs as there are renters with no particular criteria in renting a house. (These labels are exaggerated, the people on the far right are the kinds of super rich that none of us have ever encountered in person. Properly, “D” and “B” should be above the “5″ in this picture)

Next we generated housing units. The houses only had one characteristic - score. The distribution of house scores is roughly normal: Most houses are “2”, “3” or “4” and a few are “1” or “5”.

Forcing the agents to interact

The matching algorithm is based on the Gale-Shapley stable matching algorithm: In each round, renters bid for their most preferred house out of 20 randomly selected houses. If the bid exceeds the previous highest offer, it becomes the new highest offer. In subsequent rounds, all unmatched renters proceed as before. This continues until all houses are matched. We assume that renters want the highest-quality house with price below their maximum willingness to pay. “Stable” in this context means that, given their incomes, no 2 renters want to trade places with each other.

Discovering and graphing the results

Once the matching algorithm is run, we output the results in a csv and then generate graphs to see the results. First we look to see who got housing and who didn’t.


As expected, the more flexible renters were more likely to get housing. In fact, 100% of the agents with a min_score of 1 got housing, even the poorest. Also as expected, all of the people with more specific needs who didn’t get housing are in the lower income brackets.

Now we look at who got what kinds of housing.


Also as expected, higher income people got more desirable houses, and displaced people (light blue, got no house) are clustered at the moderate to lower end of the ability to pay spectrum. Notice that there are displaced people in the moderate income category. These are medium income renters who need a high scoring house.

Adding new housing units

Here’s the fun part! What happens if we add 2000 more units, but all of them have housing score “5”? Immediately apparent is that displacement is going to go from 5,000 people displaced to 3,000 people displaced.


But who benefits from the new units? Is it only the higher income displaced people?

Let’s compare just the blue sections before and after the addition of the 2000 high-scoring units.


Displacement decreases in every income category, and completely disappears in the higher income categories. This part of the result is particularly relevant to the conversation in San Francisco over whether to subsidize middle income housing, and whether to build “luxury” housing with abandon.

Renters who have very low and intermittent, or zero income - the elderly, people on disability, the temporarily unemployed - will need subsidies in order to afford to live in SF, or anywhere. That is uncontroversial. What’s phenomenal about the past few years in San Francisco is how many middle and higher income people are finding themselves displaced. Famous example: Kelly Dwyer. Dwyer works for the City of SF, and her husband is a firefighter. Nonetheless, they find they cannot afford the type of housing they want in San Francisco. Ironically, throughout her political career Dwyer has been an opponent of the rapid and substantial increases in residential housing capacity that would have enabled her to stay in SF.

Why is the result of this model obvious here, but counter-intuitive in daily life?

In daily life, we don’t see the displaced or potential San Franciscans, they’re gone or invisible. In our model, we have made them visible. In the model they are the light blue cloud, hovering over the left side of the graph. In real life, they’ve moved to Tracy, or Reno, LA, New York, Vermont, Louisiana, Arizona or Vacaville. Or they moved back in with their parents, or they are still living with their ex-spouse, or horrible roommate, or in a living room. Or they haven’t moved here yet - they’re still living in Kansas City, or Buffalo, still saving up to move here to join their family, friends or cultural affinity group, or to pursue success in our boom town.

When we don’t build for them, we can’t see them. When we do finally build, they become visible. This makes it appear that the buildings caused the new people to move here, when actually the unmet demand is always present, but hidden.

Why don’t you test what happens when you add 2000 low income units?

In the next blog post, I can have that result for you, or you can run that scenario yourself. We started with only adding “luxury” units because market rate units are what’s on offer. In other words, adding 2000 low income units to the model will be an interesting experiment, but since no one is offering to build 76,000 subsidized housing units in SF, the result of that experiment would be irrelevant. Adding that many subsidized housing units is not an option in this universe of reality.

However, SF already has 50,000 market rate units in the pipeline, and every week hundreds more market rate units are proposed at planning. Building 76,000 market rate units in SF (over the next decade) is not at all impossible, if we demonstrate the political will to do so.

How do I demonstrate political will?!

Put yourself in our database of sympathetic voters (and register to vote where you actually live if you haven’t already): (lower right of page). Subscribe to our google calendar, facebook page or googlegroup (I suggest you enable the forums tab in your gmail inbox). Every week there are opportunities to either write a letter or show up in person to comment on some particular project, and thereby demonstrate overall support for fast building.

Or you can just give us money.

[This article was originally published on the Medium blog @localpolitics]


Slides from our presentation at Hack for America:

Housing Model on Github:

Insight about hidden demand: