California Homelessness

In my last post on homelessness, I documented that the rise in homelessness since 2015 is almost entirely a California phenomenon, driven primarily by a rise in the unsheltered homeless. In this post, I dig a little deeper into the California data.

Total, Sheltered, and Unsheltered Homelessness

Here’s the time-series for sheltered and unsheltered homelessness in California. Homelessness rose by 23,000 from 2007 to 2020. Most of the increase occurred from 2015-2020, where homelessness went up by 46,000. Most of this was due to an increase in unsheltered homelessness, which rose by 40,000 from 2015-2020.

Codelibrary(ggplot2) library(ggthemes) library(scales) library(tidyverse) library(knitr) library(sf) library(stargazer) PIT.by.CoC.Year <- read.csv("PIT_by_CoC_Year.csv") HIC.by.CoC.Year <- read.csv("HIC_by_CoC_Year.csv") # Focus on California PIT.by.CoC.Year <- PIT.by.CoC.Year %>% subset(substr(CoC.Id,1,2)=="CA") HIC.by.CoC.Year <- HIC.by.CoC.Year %>% subset(substr(CoC.Id,1,2)=="CA") PIT.by.Year <- PIT.by.CoC.Year %>% group_by(Year) %>% summarize( Homeless = sum(Homeless, na.rm=T), Sheltered.Homeless = sum(Sheltered.Homeless, na.rm=T), Unsheltered.Homeless = sum(Unsheltered.Homeless, na.rm=T), Chronic.Homeless = sum(Chronic.Homeless, na.rm=T), Sheltered.Chronic.Homeless = sum(Sheltered.Chronic.Homeless, na.rm=T), Unsheltered.Chronic.Homeless = sum(Unsheltered.Chronic.Homeless, na.rm=T), ) # Time-Series: Sheltered and Unsheltered PIT.by.Year[14,"lab.total"] <- "Total" PIT.by.Year[14,"lab.sheltered"] <- "Sheltered" PIT.by.Year[14,"lab.unsheltered"] <- "Unsheltered" ggplot(data=PIT.by.Year) + geom_line(aes(x=Year, y=Homeless), size=1, color=hue_pal()(3)[1]) + geom_point(aes(x=Year, y=Homeless), size=3, color=hue_pal()(3)[1]) + geom_text(aes(x=Year, y=Homeless, label=lab.total), color=hue_pal()(3)[1], hjust=1.2, vjust=-0.2) + geom_line(aes(x=Year, y=Sheltered.Homeless), size=1, color=hue_pal()(3)[2]) + geom_point(aes(x=Year, y=Sheltered.Homeless), size=3, color=hue_pal()(3)[2]) + geom_text(aes(x=Year, y=Sheltered.Homeless, label=lab.sheltered), color=hue_pal()(3)[2], hjust=1.1, vjust=-0.2) + geom_line(aes(x=Year, y=Unsheltered.Homeless), size=1, color=hue_pal()(3)[3]) + geom_point(aes(x=Year, y=Unsheltered.Homeless), size=3, color=hue_pal()(3)[3]) + geom_text(aes(x=Year, y=Unsheltered.Homeless, label=lab.unsheltered), color=hue_pal()(3)[3], hjust=1.05, vjust=-0.2) + scale_y_continuous(labels=function(x) format(x,big.mark=",",scientific=F), limits=c(0,200000)) + ggtitle("Sheltered and Unsheltered Homeless in California: 2007-2020") + ylab("Count") + theme_bw()

Housing Inventory Counts

Now let’s take a look at how the number of beds dedicated to sheltering the homeless has changed.

Note There are five categories of beds. Emergency shelter (ES), transitional housing (TH), safe haven (SH), rapid rehousing (RRH), and permanent supportive housing (PSH). People living in RRH and PSH are not considered homeless for the purpose of HUD’s PIT count.
CodeHIC.by.Year <- HIC.by.CoC.Year %>% group_by(Year) %>% summarize( Total.Year.Round.Beds.ES = sum(Total.Year.Round.Beds.ES, na.rm=T), Total.Year.Round.Beds.TH = sum(Total.Year.Round.Beds.TH, na.rm=T), Total.Year.Round.Beds.SH = sum(Total.Year.Round.Beds.SH, na.rm=T), Total.Year.Round.Beds.RRH = sum(Total.Year.Round.Beds.RRH, na.rm=T), Total.Year.Round.Beds.PSH = sum(Total.Year.Round.Beds.PSH, na.rm=T), Total.Year.Round.Beds.OPH = sum(Total.Year.Round.Beds.OPH, na.rm=T), Total.Year.Round.Beds = sum(Total.Year.Round.Beds.ES + Total.Year.Round.Beds.TH + Total.Year.Round.Beds.SH, na.rm=T) ) HIC.by.Year[14,"tot.lab"] <- "ES+TH+SH" HIC.by.Year[14,"rrh.lab"] <- "RRH" HIC.by.Year[14,"psh.lab"] <- "PSH" ggplot(data=HIC.by.Year) + geom_line(aes(x=Year, y=Total.Year.Round.Beds), size=1, color=hue_pal()(3)[1]) + geom_point(aes(x=Year, y=Total.Year.Round.Beds), size=3, color=hue_pal()(3)[1]) + geom_text(aes(x=Year, y=Total.Year.Round.Beds, label=tot.lab), hjust=1.1, vjust=-0.2, color=hue_pal()(3)[1]) + geom_line(aes(x=Year, y=Total.Year.Round.Beds.RRH), size=1, color=hue_pal()(3)[2]) + geom_point(aes(x=Year, y=Total.Year.Round.Beds.RRH), size=3, color=hue_pal()(3)[2]) + geom_text(aes(x=Year, y=Total.Year.Round.Beds.RRH, label=rrh.lab), hjust=1.2, vjust=-0.5, color=hue_pal()(3)[2]) + geom_line(aes(x=Year, y=Total.Year.Round.Beds.PSH), size=1, color=hue_pal()(3)[3]) + geom_point(aes(x=Year, y=Total.Year.Round.Beds.PSH), size=3, color=hue_pal()(3)[3]) + geom_text(aes(x=Year, y=Total.Year.Round.Beds.PSH, label=psh.lab), hjust=1.2, vjust=-0.5, color=hue_pal()(3)[3]) + scale_y_continuous(limits=c(0,75000), labels=function(x) format(x,big.mark=",",scientific=F)) + coord_cartesian(clip="off") + ggtitle("Total Year Round Beds in California, 2007-2020") + ylab("Count") + theme_bw()

The number of emergency shelter (ES), transitional housing (TH), and safe haven (SH) beds has remained relatively stable since 2007. The amount of permanent supportive housing (PSH) and rapid rehousing (RRH) beds has increased substantially.

It should be noted that RRH and PSH are considered permanent housing. Therefore people living in RRH and PSH are not considered homeless for the PIT count. This raises the question: How much homelessness did the expansion of PSH and RRH prevent? Would California’s homelessness have been even higher without the expansion of PSH and RRH?

Geographic Distribution of Homelessness

Now let’s take a look at the geographic distribution of homelessness change in California. I’ll focus on the 2015-2020 period because that’s when the recent rise occurred. The map below shows the change from 2015 to 2020 by CoC. (CoC stands for Continuum of Care and is the local body responsible for providing homeless services.)

CodeCoC.shp <- st_read("../HUD/CoC_GIS_National_Boundary_2020/FY20_CoC_National_Bnd.gdb") CoC.shp <- subset(CoC.shp, ST=="CA") PIT.by.CoC <- select(PIT.by.CoC.Year, CoC.Id, Year, Homeless) %>% pivot_wider(names_from=Year, values_from=c("Homeless"), names_prefix="Homeless.") %>% mutate(Homeless.Chg.2015.2020 = Homeless.2020 - Homeless.2015) d <- left_join(CoC.shp, PIT.by.CoC, by=c("COCNUM"="CoC.Id")) ggplot(data=d) + geom_sf(aes(fill=Homeless.Chg.2015.2020), size=0.2) + scale_fill_distiller(palette="Spectral") + labs(fill="Change in Homelessness, 2015-2020") + theme_bw()

And here’s a zoom-in on the bay.

Codeggplot(data=d) + geom_sf(aes(fill=Homeless.Chg.2015.2020), size=0.2) + scale_fill_distiller(palette="Spectral") + labs(fill="Change in Homelessness, 2015-2020") + coord_sf(xlim=c(-123.5,-121.5),ylim=c(37,38.5)) + theme_bw()

And here are the top 10 CoCs in California for homelessness change from 2015 to 2020.

Codetbl <- d %>% select(COCNAME, Homeless.Chg.2015.2020) %>% st_set_geometry(NULL) %>% arrange(desc(Homeless.Chg.2015.2020)) kable(tbl[1:10, ], col.names=c("CoC Name", "Homeless Change 2015-2020"), format="html", format.args=list(big.mark=","))
CoC Name Homeless Change 2015-2020
Los Angeles City & County CoC 22,532
Oakland, Berkeley/Alameda County CoC 4,097
San Jose/Santa Clara City & County CoC 3,049
Sacramento City & County CoC 2,852
Santa Ana, Anaheim/Orange County CoC 2,526
Fresno City & County/Madera County CoC 1,919
San Francisco CoC 1,349
San Bernardino City & County CoC 976
Imperial County CoC 973
Stockton/San Joaquin County CoC 969

Los Angeles is the clear culprit in terms of driving the California homelessness increase from 2015 to 2020.

Geographic Distribution of Housing Inventory Count

Now let’s take a look at how the change in homeless housing is distributed. First, let’s map the change in shelters (ES+TH+SH):

CodeHIC.by.CoC.Year <- HIC.by.CoC.Year %>% mutate(Total.Year.Round.Beds = Total.Year.Round.Beds.ES + Total.Year.Round.Beds.TH + Total.Year.Round.Beds.SH) HIC.by.CoC <- select(HIC.by.CoC.Year, CoC.Id, Year, Total.Year.Round.Beds, Total.Year.Round.Beds.RRH, Total.Year.Round.Beds.PSH) %>% pivot_wider(names_from=Year, values_from=c("Total.Year.Round.Beds","Total.Year.Round.Beds.RRH","Total.Year.Round.Beds.PSH")) %>% mutate( Total.Year.Round.Beds.Chg.2015.2020 = Total.Year.Round.Beds_2020 - Total.Year.Round.Beds_2015, Total.Year.Round.Beds.RRH.Chg.2015.2020 = Total.Year.Round.Beds.RRH_2020 - Total.Year.Round.Beds.RRH_2015, Total.Year.Round.Beds.PSH.Chg.2015.2020 = Total.Year.Round.Beds.PSH_2020 - Total.Year.Round.Beds.PSH_2015 ) %>% mutate( Total.Year.Round.Beds.PH.Chg.2015.2020 = Total.Year.Round.Beds.RRH.Chg.2015.2020 + Total.Year.Round.Beds.PSH.Chg.2015.2020 ) d <- left_join(CoC.shp, HIC.by.CoC, by=c("COCNUM"="CoC.Id")) ggplot(data=d) + geom_sf(aes(fill=Total.Year.Round.Beds.Chg.2015.2020), size=0.2) + scale_fill_distiller(palette="Spectral") + labs(fill="Change in Total Beds (ES+TH+SH), 2015-2020") + theme_bw()

And now let’s map the change in permanent housing (RRH+PSH):

Codeggplot(data=d) + geom_sf(aes(fill=Total.Year.Round.Beds.PH.Chg.2015.2020), size=0.2) + scale_fill_distiller(palette="Spectral") + labs(fill="Change in Total Beds (RRH+PSH), 2015-2020") + theme_bw()

Are CoC Bed Counts Keeping Pace with the Homeless?

It’s hard to tell what’s going on from just the maps because Los Angeles swamps everything. But let’s see if CoC bed counts are keeping pace with their homeless populations. Here’s a scatter plot of the change in homeless vs. change in beds (all types) from 2015 to 2020:

CodeALL.by.CoC <- full_join(PIT.by.CoC, HIC.by.CoC, by="CoC.Id") %>% mutate( Total.Year.Round.Beds.All.Chg.2015.2020 = Total.Year.Round.Beds.Chg.2015.2020 + Total.Year.Round.Beds.PH.Chg.2015.2020 ) ggplot(data=ALL.by.CoC, aes(x=Homeless.Chg.2015.2020, y=Total.Year.Round.Beds.All.Chg.2015.2020)) + geom_point() + geom_smooth(method="lm", formula=y~x, se=F) + scale_x_continuous(trans="log10") + scale_y_continuous(trans="log10") + ylab("Change in Beds (All Types), 2015-2020") + xlab("Change in Homeless, 2015-2020") + ggtitle("Homelessness and Beds, 2015-2020 Change by CoC") + theme_bw()

(Amazingly, a log-log scale had to be used just because of Los Angeles.)

It does appear that CoCs are responsive in increasing their housing inventory as homelessness increases. But is housing inventory keeping pace? Let’s take a look at a linear regression:

Codemyfit <- lm(Total.Year.Round.Beds.All.Chg.2015.2020 ~ Homeless.Chg.2015.2020, data=ALL.by.CoC) stargazer(myfit, type="html", dep.var.labels="Change in Beds (All Types), 2015-2020", covariate.labels=c("Change in Homeless, 2015-2020", "Constant") )
Dependent variable:
Change in Beds (All Types), 2015-2020
Change in Homeless, 2015-2020 0.632***
(0.033)
Constant 238.764*
(119.085)
Observations 42
R2 0.904
Adjusted R2 0.902
Residual Std. Error 737.463 (df = 40)
F Statistic 377.259*** (df = 1; 40)
Note: p<0.1; p<0.05; p<0.01

The results say that from 2015 to 2020, CoCs added an average of 0.632 beds per additional homeless.

Conclusion

As we already saw last time, California experienced a large increase in homelessness from 2015 to 2020, driven mostly by an increase in the unsheltered. Today we learned that most of this is happening in Los Angeles. CoCs appear to be responsive to homeless needs, though the number of beds has not increased one for one with the homeless. It’s not clear that it has to, however. Despite an increase in the total number of beds, the unsheltered homeless population has continued to rise. The increase in the number of shelter beds (ES+TH+SH) has increased by more than the number of sheltered homeless, suggesting that the problem isn’t primarily a lack of shelter beds. The problem may be a lack of awareness or mismatch; that is, available shelters may be undesirable options for the homeless.

Another question is the impact of PSH and RRH expansion on the homeless. There was a large expansion in the number of RRH and PSH beds from 2007 to 2020. We can’t tell from this data what the occupancy rate of these beds were. That may be the next thing to explore. We also don’t know the counterfactual. How much would homelessness had increased if not for the RRH/PSH expansion? We may have to look to the literature for those answers. And if the literature does not have answers, then this may be an interesting question to research.