PAF 515: Data Science III Project Management

Lab 05: Measuring The Intervention - Middle Atlantic Division

Lecture Videos




Introduction

This week we will be exploring the usage of APIs to import data, the theory behind regression and Diff-in-Diff models as a method to evaluate policy interventions, and slopegraphs as a tool to visualize the outcomes of these interventions.

Thus, while this week’s lesson will require a bit more background reading before we can begin coding, you will have a solid understanding of regression model development and how to embark on the process of completing a study of your own.

APIs

Throughout the majority of the course we have utilized local data sources (CSV, Excel, and .RDS files) to access our data and complete our analyses. However, while local data sources are useful to keep subsets of data readily accessible, sometimes we need to access information from databases that are too large to keep stored on our local machines. In these cases we can virtually connect to these systems via Application Programming Interfaces known as (APIs). These interfaces allow programmers to send a query to a database and extract the data they need to download locally. Recall in Lab 01 we queried the Census API to find the population size of our Census Division. In this lab, we will use the U.S. Census Bureau’s API once again to access information on Median Home Values and Median Incomes for our census tracts of interest.

Watch the video below to learn more about APIs:



Variable Selection

As we explored in Lab 04, the New Markets Tax Credit (NMTC) and Low Income Housing Tax Credit (LIHTC) programs were created with the intention of improving communities by increasing affordable housing and economic activity. Recall that our CDC Social Vulnerability Index (SVI) data provides us with multiple variables to measure vulnerability within a community based on the following:

  • Socioeconomic Status variables (Below 150% Poverty, Unemployed, Housing Cost Burden, No High School Diploma, No Health Insurance)

  • Household Characteristics (Aged 65 & Older, Aged 17 & Younger, Civilian with a Disability, Single-Parent Households, English Language Proficiency)

  • Racial and Ethnic Minority Status (Hispanic or Latino (of any race); Black and African American, American Indian and Alaska Native, Asian, Native Hawaiian and Other Pacific Islander, Two or More Races, Other Races)

  • Housing Type and Transportation (Multi-Unit Structures, Mobile Homes, Crowding, No Vehicle, Group Quarters)

In addition to these variables, extensive research on community well-being and development has indicated that home values and income serve as good indicators of potential inequalities and susceptibility to adverse living conditions (University of Wisconsin Population Health Institute County Health Rankings, 2023; Zabel, 2015).

The majority of community development work using home values as an indicator of community well being employ “Hedonic Housing Models” which are models that rely on the effect of a location’s characteristics on home price (Rey-Blanco, Zofío, and González-Arias, 2024). Specifically, these models assert that home values are a good price mechanism to capture the state of a neighborhood because they “price in” all of the characteristics of the house as well as the features of the neighborhood and surrounding city.

Anyone who has ever paid $2,500 to rent a 400-square foot apartment in New York City know that when you acquire a dwelling you are paying for location as much as for the space to store your things and sleep at night. Location really means proximity to amenities, assurance of safety, and access to things like low taxes or high-performing schools.

Hedonic pricing models use home value as the dependent variable, typically include features of the house (lot size, square footage, year built, number of bedrooms and bathrooms, etc.) to establish a baseline prediction of the value of the home based upon the house itself. They then incorporate many additional attributes of the neighborhood to determine how people value things. Using this approach you can answer questions like, what is the value of having a park withing walking distance, i.e. what is the premium people will pay for homes that are near a park? What is the value of being in a good school district? What is the real-estate cost of proximity to a factory that produces toxic smoke? Does crime reduce the value of a home? Do new nearby bike lanes increase the value of homes?

We don’t have data on individual houses for this project, thus we can’t run formal hedonic models that account for the features of a home. Instead, we will be pulling in the U.S. Census Bureau’s estimate of median home value within our census tracts and the Federal Housing Finance Agency (FHFA)’s House Price Index data which “is a comprehensive collection of publicly available house price indexes that measure changes in single-family home values based on data that extend back to the mid-1970s from all 50 states and over 400 American cities”.

The Census calculates its estimates for Median Home Value by asking people how much their homes are worth. There are definite limitations to this methodology (people who are attached to their homes might over-value them, people who don’t follow real estate might under-value them). But there is good work on “the wisdom of crowds” that shows that many independent guesses on topics like these, once aggregated, are pretty accurate.

This fact was established partly by watching people try to guess the weight of a pig at the state fair to win a prize. The typical person was not very good at the task and thus their estimate was off by several dozen pounds. But people that do not have experience guessing the weight of pigs will get close enough, and they are also equally as likely to guess too high as they are to guess to low. So if you take all of the guesses from the crowd and average them you typically come within a pound or two of the actual weight (Surowiecki, 2005).

In contrast, the FHFA summarizes its Housing Price Index in the following way:

The FHFA HPI is a broad measure of the movement of single-family house prices. The FHFA HPI is a weighted, repeat-sales index, meaning that it measures average price changes in repeat sales or refinancings on the same properties. This information is obtained by reviewing repeat mortgage transactions on single-family properties whose mortgages have been purchased or securitized by Fannie Mae or Freddie Mac since January 1975.

The FHFA HPI serves as a timely, accurate indicator of house price trends at various geographic levels. Because of the breadth of the sample, it provides more information than is available in other house price indexes. It also provides housing economists with an improved analytical tool that is useful for estimating changes in the rates of mortgage defaults, prepayments and housing affordability in specific geographic areas.

Source FHFA House Price Index

In addition to our two sources of data on housing, we will evaluate income levels with the US Census Bureau’s median income variable. Although it is also an estimate, the large sample size of individuals aged 15 and over with income allows us to once again rely on the “wisdom of the crowd” and utilize these estimates as representative of our area of interest. Research across social science and public health domains has found that inequities in income levels are highly correlated with poverty and vulnerability to poorer quality of (Killingsworth, 2021; University of Wisconsin Population Health Institute County Health Rankings, 2023; US Department of Health and Human Services, 2021).

Thus, we can combine our SVI, Median Home Value, and Median Income variables to build a Diff-in-Diff regression model to evaluate whether the implementation of the NMTC and LIHTC programs has actually effected changes in either social vulnerability, median home values, or median income in the vulnerable communities that they target.

Variable Selection Considerations

While we are using pre-created indices from the CDC to examine social vulnerability for our study in this course, in the future you will likely need to select variables of your own to measure abstract concepts like “social vulnerability”. Thus, it is important to ensure that you understand the importance of the process of variable selection.

Broadly, variable selection is the process of picking the variables and their functional form that you will include in the model.

It is one of the most important steps in the process, but also it is an art, not a science.

The goal in evaluation models is to achieve strong model fit while accounting for competing hypotheses (alternative explanations to the assertion that the program or policy caused the change we see in the data).

Thus, it is important to ensure that you select variables that are related to the topic that you are interesting in measuring. To begin, you can conduct a literature review to identify what kinds of variables previous studies have utilized and determine whether these variables would be useful for your particular study.

This is similar to what we have done here by implementing the CDC’s SVI model and citing previous research on Hedonic Housing Models and Median Incomes as measures of community well-being. However, the CDC’s SVI model is not the only measure of community well-being. We could also seek out other resources such as the following guides that evaluate community change and gentrification:

Types of Measures

Once we have selected our variables, we then need to determine the level and types of metrics that we are interested in. For example, in Lab 02, we created functions that ranked our SVI data at several levels: tract, county, state, divisional, regional, and national. For our visualizations we have aggregated our reports up to the county, state, and national level. In addition, we have data from 2010 and 2020.

This gives us metrics from 2 years and several units of analysis with the majority of our analyses being on the census tract and county level.

We also have two ways to represent quantitative variables - as counts and as proportions where counts are raw numbers while proportions are percentages or ratios.

Sometimes only one type is meaningful - the population of a census tract is not very meaningful because tracts are designed to hold 2000 to 4000 people, and they split when they grow.

Population density, on the other hand, might be meaningful. The growth of a city or county between 2010 and 2020 is likely meaningful.

The number of people of a certain racial or ethnic group in a tract might not be meaningful, but the proportion of individuals of a certain racial or ethnic background in a tract (a measure of diversity) likely is.

So in the future if you need to construct your own indices, pay attention to how you are constructing variables, and whether the way you are presenting a variable (unit of analysis, time period, and count versus proportion) makes sense.

Challenges in Variable Selection

Let’s say we have 10 independent variables to choose from, and we want a simple model with 3 independent variables.

Each variable can be represented at the community (tract) or an aggregated (metro, county, state, divisional, regional, national) level (unit of analysis).

And each variable can be measured as counts or proportions.

So each variable turns into at least 4 potential variables:

X as count, tract level X as proportion, tract level X as count, aggregated level X as proportion, tract level

So 10 variables x 2 units of analysis x 2 metrics translates to approximately 40 distinct variables that we need to choose from:

So here is the real challenge: with 40 variables we can construct almost 10,000 unique 3-variable models!

Code
choose( 40, 3 ) %>% format( big.mark="," )
[1] "9,880"

As a complete dataset, the American Community Survey has thousands of variables and our data set has a total of 44 individual estimates that have been summarized to 4 SVI categories and 2 additional variables for Median Income and Median Home Values (see ACS variables here. Therefore it quickly becomes evident that there are literally millions of ways to construct any given model.

In a data set with just 100 variables we get more than 10 million possibilities:

Code
choose( (4*100), 3 ) %>% format( big.mark="," )
[1] "10,586,800"

This gives further insight into why it is so important to begin with a literature review to ensure you have background knowledge on your topic. Understanding the basic factors driving change in your area of interest can help you identify variables that can serve as proxies for some of these factors.

It is helpful to test your understanding of your policy domain by trying to explain the main drivers of change to a hypothetical undergraduate student. Is the idea clear enough in your own mind to explain it to another person? How confident do you feel in your story? If you don’t feel comfortable with this exercise, perhaps you should do some more background reading and reflection before you try to model anything!

P-Value Hacking

Now that we understand the challenges related to variable selection, it is important to have a discussion on “P-Value Hacking”.

As mentioned above, the process of variable selection and model specification is complex partly because of the combinatorics of choice - with a large dataset even a small model with three independent variables results in millions of possible models.

The number sounds overwhelming, but it is less daunting when you consider that we never conduct analysis by trying random combinations of variables. Rather, we usually know which is the policy variable. We need to select the units of measure and functional form, so there are a couple of decisions necessary. Once we have settled on our first variable in the model we have removed a single degree of freedom, but that has a huge impact on remaining decisions.

We have gone from over 10 million to around 78 thousand since we now just need to pick any combination of 2 remaining variables:

Code
choose( (4*99), 2 ) %>% format( big.mark="," )
[1] "78,210"

If based upon our background reading we know that there is one significant competing hypothesis that we want to account for, e.g. the socio-economic status of parents in the school classroom size example, then we can select that variable to eliminate more degrees of freedom.

In this way, the process of selecting a model looks like a decision tree:

Alt-text: Decision Tree Example

In the end we might have 10 million possible models but when we follow some modeling process we see that several easy choices will eliminate lots of others. There will be many instances where you come to a fork in the road with two or more paths forward (variables to include, or units of measure to select). Often times you will try all of the roads one at a time, then return to the fork and use model fit statistics to determine which path forward is best. This is actually how some machine learning applications work - the process is called pruning the decision tree.

And here lies the fundamental tension in social sciences. We want to find the model that best describes the data, but due to the incremental nature of model selection we will gravitate toward the options that we can make sense of. It is much more common to assume that a program is effective at the onset and look for evidence accordingly. It is a lot less common to begin an evaluation looking for lack of evidence of program success. As a result we are always vulnerable to confirmation bias.

Alt-text: Confirmation Bias Diagram

We are never objective bystanders or disinterested parties that approach the data with no agenda, merely interpreting the patterns for our audience. We are interested parties because our careers or our contracts often depend upon not missing something that would have allowed us to lend support to the program we are evaluating. As a result, we are extremely susceptible to confirmation bias. We are not the judge in the courtroom adjudicating truth in the data, we are the prosecutor that was given a job to make the strongest case possible about the guilt of the client, or in our case the effectiveness of a program. We try hard to tell a story with the data, and the funding providers or the peer reviewers serve as the jury that decides whether they believe the evidence.

A natural consequence of this iterative process of model selection is that we tend to find our way to the models that support our theories. Partly this is because it is much easier to make the case that impact exists than it is to make the case that it doesn’t. If you have done a reasonable job of accounting for sources of bias and you are able to identify program impact then your audience will be open to the results. The hard part is eliminating alternative competing hypotheses so you can make a convincing claim that the outcomes are a result of the program and not another explanation.

If, however, you arrive at null results it is comparatively much harder to make the case that the program has no impact because there are so many things that can lead to null findings other than lack of program impact. If your sample size is too small you will have null results. If you have too much noise (measurement error) in the dependent variable you will have null results. If you have any bias that shifts the estimate of impact toward zero it can lead to null results. Oddly, it requires more evidence to convince people that something doesn’t work than to convince them it does. One of the key contributors to the crisis of reproducibility in science is that it is much harder to publish null results than it is to publish a model with significant results.

It’s important to note that there is nothing nefarious about the process. The typical analyst is not manipulating data to achieve desired results. They are also typically not using brute force methods to run thousands of models that select the one that returns the largest program effects or smallest p-values. Rather, when you land on a branch of the decision tree where the data makes sense according to your task at hand or mental model of how the world works, it generates a comfortableness with the models. Alternatively, when you are getting null results you keep thinking that you must be doing something wrong, that there is something you are not seeing, so you continue to transform variables and try new models.

As a result, journals inadvertently act as gatekeepers to suppress evidence that programs don’t work or that a theory does not explain the world. Analysts and authors acquiesce and tweak the models so they fit expectations. Journals get interesting results. Authors get tenure. Everyone is happy.

The problem is that all of these decisions are innocent enough, subtle enough, and harmless enough when they occur on a single paper. But at scale they begin to skew the body of evidence of an entire field. The problem is impossible to detect in a single paper because there is always randomness in sampling that could explain the result. In an era of big data and meta-analysis, however, it is possible to aggregate results across thousands of paper to see the distribution of published p-values. Sampling theory can be used to determine what the distribution of p-values should look like within a field. When compared against observed values in published studies it is possible to test for publication bias in a scientific field. As an example, some recent papers have aggregated thousands of published studies to demonstrate the improbable clustering of p-values right below 0.05 across various disciplines. It looks very similar to reported income in tax data right around the threshold where a slightly higher income would bump people into a higher tax bracket. When people are right near the threshold, they all of a sudden need to take four weeks of vacation at the end of the year, or else they become very generous and donate thousands of dollars to a tax-deductible charity, thus dropping their taxable income below the threshold again.

Alt-text: P-Value Clustering in Academic Journals

What these patterns often suggest is that the peer review process results in an under-reporting of null results. If we think about research as a cumulative endeavor where lots of studies on a topic contribute to the consensus about a phenomenon, then suppressing studies that generate small effect sizes is analogous to chopping off the lower third of your data - the average effect in a literature will be artificially large. And consequently, we might have too much confidence in the effectiveness of a cancer drug, we might believe management practices work when they don’t, and we might promote public policies that we believe will improve lives but they end up generating very little impact and costing a lot of money.

There is no evil villain in the story and there are no easy solutions to problems that arise naturally from cognitive biases that emerge from the way the brain manages complexity and incentives in high-stakes systems. But science is adapting and professional norms are changing. Most notably, after recognizing that analysts operate like prosecutors making their case with data, it became apparent that a fair court requires a defense attorney as well. An important keystone of trial law is that all evidence must be shared between the legal teams so that the arguments for guilt or innocence are built through logic and persuasion, not suppression of information.

Similarly, many evidence-based fields are moving toward open data and open science models because it has become apparent that peer review only works when reviewers have access to all of the same information that the authors do. A jury would never believe a prosecutor that makes the argument, I have evidence that exonerates my client, and I am not going to share the evidence with you but I need you to trust me that it exists and it is good evidence. The judge would throw the prosecutor out of the courtroom and require that all evidence be shared with the defense.

Research and evaluation is no different. The evaluator’s job is to make a strong case for the program. The emerging consensus is that a data and methods section in a paper or report is not sufficient to describe the process that generated the results. A proper court would give the data and code to the defense team so they can do their best to poke holes in the evidence and build counter-arguments. If the story can hold up to that level of scrutiny and cross-examination, then the research is robust.

As you are learning during the project, sharing data and code is a non-trivial task. If you don’t have clear documentation about the data, the process, and the programs that were used to generate results then no one will be able to make sense of a bunch of folders that contain a bunch of files. Similarly, the evidence might make it through adjudication via a jury of peers, but to have impact it has to also be adopted widely. Projects that use open data, share code via platforms like GitHub, and leverage free open-source tools are much more likely to be shared and replicated, leading to more impact. Project management is a key component of effectiveness for the data scientist.

Most importantly, awareness of the challenges of working with data should remind you to be diligent and humble. The next part of this tutorial will highlight some of the challenges of model specification to emphasize that caution and humility are required when doing data analytics. Running regressions and interpreting coefficients is the easy part. Being confident that you are explaining the world with any veracity is the hard part. It takes a lot of practice to become comfortable with the process, but it also takes a commitment to curiosity, a self-awareness about the process to avoid any aggregious types of p-hacking, and the willingness to test your assumptions.

Specification and The Sins of Regression

The formal statistical term for this process of selecting variables and their functional form for your model is “Specification”.

As we have previously discussed, typically you will go through the process of selecting variables that you believe capture your theory and allow you to test for important competing hypotheses.

After creating your baseline model you will likely want to explore the functional form of variables in your model to see if there are transformations that improve your model.

Throughout the process and in the final stages you will conduct sensitivity analysis and robustness checks to ensure that your results are not being biased or entirely driven by an outlier or the wrong functional form.

There are many subtle ways that bias can sneak into models other than omitted variables.

Review the following video on the Anscombe’s Quartet where four datasets produced identical regression models (coefficients and significance levels) but graphed have four different forms:

Alt-text: Anscombe’s Quarter

Note: Sometimes this video has difficulties loading from the embed link. You can access it directly on YouTube here: https://www.youtube.com/watch?v=Kd–Q-aTwpM

One clear lesson is to never rely entirely on model fit statistics reported by your statistical software. You need to visualize your data, check summary statistics to make sure variables seem plausible, and visualize your data as much as possible.

Many problems are subtle. For example, maybe you are very comfortable with the functional form of your policy variable and your model fit. What happens if you transform a control variable? Change the measure from counts to proportions or add a quadratic term? Do your inferences remain the same, or do they vary widely when you alter controls?

A good data scientist is always paranoid about problems in the data that are hard to see, especially when you want to use observational data to make consequential decisions, like whether or not to continue a multi-billion dollar federal program or mandate state-wide reductions in class size.

A Taxonomy of Specification Problems

In CPP 523/PAF 510 you were introduced to the Seven Sins of Regression - issues that commonly plague cross-sectional models and prevent us from using observational data for causal inference.

You can review the reading materials on these topics here: Seven Sins of Regression Resources

When working with US Census Data, it is particularly important to ensure that you understand the following specification problems:

  • Variable skew
  • Multicollinearity
  • Outliers
  • Group Bias

Variable Skew

It is common to have data that is not normally distributed, especially in the social sciences. Variables that have a high level of skew or kurtosis can cause problems with inferential statistics by biasing slopes or inflating standard errors.

There are formal tests for skew, but the easiest way to diagnose the problem is by visualizing distributions using histograms or box and whisker plots.

Let’s take a look at potential issues with skew in Poverty and Vacancy Rates and how we can resolve this by using logged values for percentages:

Poverty Rate
Code
# Example code to log a poverty rate
log.pov.rate <- log10( d$pov.rate + 1 )

Alt-text: Poverty Rate Skew
Vacancy Percentage
Code
# Example code to log vacancy percentage
log.p.vacant <- log10( d$p.vacant + 1 )

Alt-text: Vacancy Rate Skew

We know that bell-shaped curves are typically preferable, but it’s not clear how that helps when looking at a single variable. The issues are clearer when looking at the relationship between two skewed variables:

Alt-text: Logged Regression

Variable Skew and Log Transformations

What exactly does a log transformation do again? Technically, they convert a one-unit change in a variable from a level to a rate of growth. You can read the more precise technical definition here.

But the real intuition comes from understanding the origins of skew. There are many processes in natural and social systems that are governed by exponential, not linear, growth. As the systems progress and differences compound, each additional unit of time results in larger changes in the system.

We can think of another example that originates from diminishing marginal returns. How much does it cost to increase the quality of a bottle of wine? Vineyards can use things like better grapes, better fertilizer, better viticulture, and better land to improve the quality of their product. Producers will do the cheapest things first, maybe buy new equipment to harvest and press grapes. Planting better grapes is expensive because it costs money for the vine stocks and grapes from newly-planted vines are not used in wine-making for at least a year. But they are fixed cost investments that can be amortized over time. Hiring a better vintner to oversee the production of wine will have a big impact on quality, but requires the ongoing cost of paying a large salary to a highly-paid specialist. When all of these options have been exhausted, the last step to improving wine quality is acquiring better land in a region amenable to grapes. This land, however, is very expensive.

As a result, if you ever pay attention to the price of wine at the store you will see that there are what appear to be several jumps in price. The cheapest table wine you can find costs around $3. It’s not great wine, so if you want to upgrade to a decent table wine the prices cluster around $6. If you are bringing a bottle to dinner at a friend’s house and you want something slightly nicer the price is about $12. If you want to splurge for a holiday celebration you will find the next step up in class clusters around $25, and after that $50.

Do you see the pattern here? For each additional unit increase in quality the price doubles. It is an exponential scale. When you are producing cheap wine you can spend a small amount of money to get better equipment to improve quality by one point on this five point scale. The next step up in quality is more costly. And the step after that requires even more capital.

Alt-text: Wine Bottle Prices Chart

Consequently, if you look at data on wine prices you will find a skewed distribution with the market dominated by inexpensive wine and more limited selection in each additional quality traunch (Source-AC-Nielsen):

Alt-text: Wine Bottle Prices Bar Graph

If we wanted to conduct a study on the relationship between wine price and customer satisfaction (spoiler alert, the relationship is nebulous) we would introduce specification bias by trying to model quality as a linear function of price.

Alternatively, if we take into account that the relationship between price and quality might not be linear and knowing that price is a skewed variable we can adjust our hypothesis and specification accordingly. It’s not that price doesn’t matter (as the article in the previous paragraph suggests) but we need a better specification to model the relationship. If we transform price using a log scale the relationship becomes clear.

Alt-text: Wine Bottle Prices Chart

In the regular levels data the relationship between price and satisfaction is very strong up until $20, then it weakens considerably. In the model where price has been converted to a log scale the relationship is a lot cleaner and the model is a better fit, which will results in smaller standard errors and a higher likelihood of finding results that support our theorized relationship between price and quality.

Alt-text: Wine Bottle Prices Correlation

Addressing Variable Skew in Census Data:

Returning to our census variables, when we look at the relationship between variables in the scatterplot we see that a lot of the data clusters in the lower left hand corner of the scatterplots, which is a sign of skew:

Alt-text: Raw Census Data Correlation Plot

After applying log transformations note that the bivariate correlations increase except for relationship between MHV (mhv.growth) and vacancy rates (p.vacant):

Alt-text: Logged Census Data Correlation Plot

The correlation between the transformed version of median home value change and vacancy rates falls, but is that a bad thing? The non-transformed version contains a statistically-significant correlation, but take a look at the scatterplot:

Alt-text: Median Home Value and Vacancy Correlation Plot

It is likely an inflated correlation because of the handful of outliers. Does the graph look familiar? Recall the plot on the right from Anscombe’s Quartet:

Alt-text: Spurious Correlation Plot

So fixing skew made the correlation weaker, but represents a case of mitigating a spurious correlation that was caused by outliers in the data.

Recall from Lab 04 that we can also explore the clusters of variables within our dataset of interest to identify whether a trend holds without influential outliers or if it truly is non-existent such as the example above where there would be no trend without the outlier in the upper right corner.

Multicollinearity

Recall that one way to think about a control variable that serves as a competing hypothesis is a variable that deletes “problematic” variance that might be the true explanation for the program change, reducing the variance available for the policy variable to the components that are independent (uncorrelated) with the controls.

Alt-text: Multicollinearity Venn Diagram

Multicollinearity occurs when two variables in the model are highly correlated. If both are included in the model at the same time they can essentially cancel each other out. Standard errors will increase and slopes typically shift toward the null. As a result, even if they pair of variables are individually significant and have large effect sizes, they will have small slopes and lack statistical significance when included together.

Alt-text: Multicollinearity Lollipop Chart

Multicollinearity is common when there are multiple variables that represent different measures of the same underlying construct in the same dataset. In studies of firms, for example, revenue, firm expenses, and number of employees are all measures of firm size and thus will be highly correlated. Including them all in the model will results in none of them having large or significant slopes.

This is important specifically when you need to interpret a regression coefficient. In the firm example, perhaps you are interested in whether or not companies that use a specific HR practice are more profitable, controlling for size and industry. In this case including all of the size controls together would not hurt because you are not interpreting the control in your analysis.

In our case, perhaps we are interested in whether economically distressed tracts are likely to grow faster than tracts that have already gentrified because of rent gap theory (urban core neighborhoods with lots condemned houses and vacant lots are easier to use for large-scale projects since land is cheap, so developers would target these communities instead of stable neighborhoods where land is expensive and zoning more complicated). If we include multiple measures of distress (unemployment rate, poverty rate, high school drop-out rate) and multiple measures of stability (number of people working in professional industries, percentage with college degrees, rates of divorce) then the high correlation between any set of variables can mute the slopes, making it hard to interpret the results.

Take this example where we try to include both poverty rate and unemployment. A sign of multicollinearity is when both coefficients get smaller and the standard errors get bigger when the two variables are included in the same model (model 3 here):

Code
reg.data <- d
reg.data$mhv.growth[ reg.data$mhv.growth > 200 ] <- NA
reg.data$p.unemp <- log10( reg.data$p.unemp + 1 )
reg.data$p.vacant <- log10( reg.data$p.vacant + 1 )
reg.data$pov.rate <- log10( reg.data$pov.rate + 1 )
m1 <- lm( mhv.growth ~  pov.rate, data=reg.data )
m2 <- lm( mhv.growth ~  p.unemp, data=reg.data )
m3 <- lm( mhv.growth ~  pov.rate + p.unemp, data=reg.data )
stargazer( m1, m2, m3, 
           type=S_TYPE, digits=2,
           omit.stat = c("rsq","f") )

Alt-text: Multicollinearity Regression

Note that:

  • coefficient sizes are smaller
  • standard errors are larger
  • R-square did not increase
  • The SER did not decrease

*The standard error of the regression (SER) is the “average distance” of each data point to the regression line, so a measure of how accurate the model is when used for prediction. Similar to R-square, it is a measure of model fit.

This suggests that these variables contain redundant information and including them both together causes them to cancel each other out.

If these were simply control variables it would not harm your model, per se. But if these are competing hypotheses and thus you are interpretting the magnitude of effects relative to the policy variable you have now muted part of their effect, making them look less important. If they are highly correlated they can cancel each other out almost completely in your model.

When you are worried about multicollinearity:

  • Check your correlation matrix for independent variables that are highly correlated. Ask yourself, are these two distinct constructs, or two measures of the same construct?

  • Run the model with each of the suspect variables separately and one with them all together like the example above. This will show you how much the estimate of their impact changes when all are included together.

If you have high multicollinearity and you want to interpret the variables then:

  • Select which variable you believe best captures the theory / hypothesis or the one you belive to be the best measure of the underlying construct.

  • Combine the variables into a single scale or index. Use factor analysis (preferred option) or normalize variables and select a set that generates a reliable metric like you have done in a previous lab.

Group Structure

When building models it is important to think about whether there are groups in the data that would influence the outcome. You will cover this topic in the lecture on Fixed Effect Models in CPP 525/PAF 512.

In this domain we know that neighborhoods belong to cities, and cities each have distinctive histories, political structures, economies, geographies and climates. Some cities may be thriving over the study period and experience population growth and strong economic expansion while others are in decline, losing population and enduring shrinking economies. It is also important to consider there may be universal difficulties for a particular region (for example, all US cities were impacted by the 2001 and 2008 economic crises) or globally (for example the entire world has suffered economic impacts following the 2020 COVID-19 Pandemic).

There are broad city-level processes that unfold over decades. No individual census tract within a city will be isolated from these trends occurring metro-wide. As a result we would expect the overall health of the city to impact the home values in each tract.

Therefore, when evaluating city-level changes it is important to account for metro-level effects. Similarly, when evaluating a particular program, all eligible participants for the program should be included in the model.

This is why in Lab 04 we created a flag for all eligible NMTC and LIHTC census tracts and we will employ this in our data filtering for this lab.

Evaluation Methodology Selection

Once we have completed our specification step and ensured that we have accounted for potential bias in our variables, we can embark on selecting the appropriate methodology to evaluate our model and determine whether our outcomes are significant.

We have 7 primary regression tools for evaluation:

  • Interrupted Time Series
  • Difference-in-Difference Models
  • Instrumental Variables
  • Fixed Effect Models
  • Regression Discontinuity Design
  • Logistic Regression
  • Matching

Let’s evaluate each of these methodologies to determine which would be best for our analysis:

Interrupted Time Series

This methodology evaluates program outcomes for an entire population over time.

While we have two time periods of data (2010 and 2020) for before and after our interventions, our entire population that is eligible for the programs did not actually receive the intervention. Therefore we can not simply look at the before and after periods and measure outcomes.

Difference-in-Difference (Diff-In-Diff) Models

This methodology evaluates data outcomes for a subset of a population that enrolled in a program versus population members that did not participate and compares their before and after outcomes.

For this study, we have two time periods of data (2010 and 2020) and we have two subsets of data (program participants and non-participants).

Therefore, we can utilize this methodology for analysis.

Instrumental Variables

This methodology is utilized when we believe we have an omitted variable that is difficult to measure, but impacts the outcome of our study.

For example, if we are interested in studying the relationship between wages and education, but we know that individual ability is also a factor in salary increases we can utilize this methodology to control for the “unmeasurable” impact of ability.

For our current study, we do not have any “unmeasurable” variables. We have defined variables for social vulnerability, home values, and income.

Therefore, we do not need this methodology.

Fixed Effects Models

This methodology measures changes over time within groups and between groups where the groups remain constant over the time period.

This is similar to the diff-in-diff model, however this methodology works best with multiple time periods. When there are only two periods, it works similarly to the diff-in-diff model, thus since the diff-in-diff model is better tailored for two time periods, we can utilize that model.

Regression Discontinuity Design

As stated in the Program Evaluation for Public Service textbook:

The regression discontinuity model was created to deal with one very specific type of selection - cases where people have to qualify for the program, and the criteria for qualification is a measure that is highly correlated with performance. Some threshold is created and all people that score above the threshold are accepted into the program, and all people below are not allowed to participate, or vice-versa.”

While there are qualification standards for both the NMTC and LIHTC programs (see Lab 04), all of the census tracts eligible for the NMTC and LIHTC programs do not participate in the program. Therefore, we can not use this methodology.

Logistic Regression

Logistic regression is utilized when our outcome variable is binary (yes/no, 1/0). For example, if we simply wanted to ask if social vulnerability decreased (by however we choose to measure a decrease), if home values increased, or if income increased, then we could employ this methodology.

However, since we have continuous variables, we need to use a linear regression model.

Matching

Our final option is to utilize a Matched model for regression. The primary element of this strategy is to filter our data set to find controls that closely match our program participants on selected characteristics.

In our study for example, we could use a matching algorithm to find non-participant census tracts that closely mirror our treated census tracts on the number of SVI flags, the percentage of poverty, or any other characteristics of interest.

In fact, we could even combine this matching technique with another evaluation tool such as diff-in-diff.

Since we already have filtered our data set to create a reasonably comparable control set (census tracts that are eligible for the NMTC and LIHTC programs, but did not receive an intervention), we do not have to take this additional step. However, it is helpful to keep in mind, though, that if we suspect that eligible tracts that participated in the program are different from eligible tracts that did not participate, we could always return to this methodology to further explore our data.

Diff-In-Diff Model

Now that we have selected the Diff-In-Diff model as our best methodology, let’s take a look at two short videos that show this methodology in practice:




As explained in the videos above, the diff-in-diff model provides us with a relatively easy fix to the challenge of measuring changes due to an intervention over two different points in time.

We will explore this further in the lab.

Slopegraphs

Now that we finally have our variables and evaluation methodology determined, the last thing we need to do is identify the best data visualization technique to readily present our findings to a non-technical audience.

While there are a few different ways that we can visualize the outcomes of our regression model, in this lab we will utilize slopegraphs. We will walk through the code of how to create a slopegraph in the lab, but you can watch the following video on the difference between traditional line graphs and slopegraphs:



Additional Readings

If you would like to review additional resources on this week’s topics, feel free to explore the followink links:

US Census API Guide:

CDC SVI Documentation:

Readings on home values as an indicator of community well-being:

  • Rey-Blanco, D., Zofío, J. L., & González-Arias, J. (2024). Improving hedonic housing price models by integrating optimal accessibility indices into regression and random forest analyses. Expert Systems with Applications, 235, 121059-. https://doi.org/10.1016/j.eswa.2023.121059 download

  • Surowiecki, J. (2005). The wisdom of crowds: Why the many are smarter than the few and how collective wisdom shapes business, economies, societies, and nations. Random House.

  • Zabel, J. (2015). The hedonic model and the housing cycle. Regional Science and Urban Economics, 54, 74–86. https://doi.org/10.1016/j.regsciurbeco.2015.07.005 download

Readings on FHFA House Price Index:

Readings on income as an indicator of community well-being:

Readings on 7 Sins of Regression:

Readings on Diff-In-Diff Models:

Readings on slopecharts/graphs:

Note: This lab has been updated from a previous version in CPP 528 and this introduction includes sections written by Prof. Jesse Lecy, PhD and Instructor Cristian Nuno, M.S.: https://watts-college.github.io/cpp-528-template/labs/lab-04-tutorial.html#hedonic-housing-models

Library

To begin, we will need to install a few new packages and load some packages that we’ve previously installed:

Code
utils::install.packages("rio")
utils::install.packages("unhcrthemes")
utils::install.packages("ggrepel")
utils::install.packages("rcompanion")
utils::install.packages("ggpubr")
utils::install.packages("moments")
utils::install.packages("tinytable")
utils::install.packages("modelsummary")
Code
# Load packages
library(here)         # relative filepaths for reproducibility
library(rio)          # read excel file from URL
library(tidyverse)    # data wrangling
library(stringi)      # string data wrangling
library(tidycensus)   # US census data
library(ggplot2)      # data visualization
library(kableExtra)   # table formatting
library(scales)       # palette and number formatting
library(unhcrthemes)  # data visualization themes
library(ggrepel)      # data visualization formatting to avoid overlapping
library(rcompanion)   # data visualization of variable distribution
library(ggpubr)       # data visualization of variable distribution
library(moments)      # measures of skewness and kurtosis
library(tinytable)    # format regression tables
library(modelsummary) # format regression tables

Functions and Constant Variables

Next we need to import our functions and variables from our project_data_steps.R file. Remember, your file should have your initials at the end to avoid confusion with your teammates. For example, in a shared repo my file name would be project_data_steps_CS.R.

Recall that we should use the here::here() function for relative file paths. We also can use double colons :: to indicate both the specific library and function name we want to use to avoid any overriding.

Import Functions

Code
import::here( "fips_census_regions",
              "load_svi_data",
              "merge_svi_data",
              "census_division",
             # notice the use of here::here() that points to the .R file
             # where all these R objects are created
             .from = here::here("analysis/project_data_steps.R"),
             .character_only = TRUE)

Create slopegraph plotting function

Code
slopegraph_plot <- function(df, status1_label, status2_label, title_label, subtitle_label) {
  # Plot
  ggplot(df, aes(
    x = year,
    y = outcome,
    group = status
  )) +
    geom_line(
      linewidth = 0.75,
      color = "steelblue",
      lineend = "round"
    ) +
    geom_text_repel(
      data = df %>%filter(year == 2020),
      aes(label = paste0(status, ", ", outcome_label)),
      size = 8 / .pt,
      hjust = 0,
      vjust = -.5,
      direction = "y",
      nudge_x = 0.3
    ) +
    geom_point(
      size = 2.5,
      color = "steelblue" 
    ) +
    geom_text_repel(
      data = df %>%filter(year == 2010) %>% filter(status == status1_label),
      aes(label = outcome_label
      ),
      size = 8 / .pt,
      hjust = 0,
      vjust = -1,
      direction = "y",
      nudge_x = -1
    ) +
    geom_text_repel(
      data = df %>%filter(year == 2010) %>% filter(status == status2_label),
      aes(label = outcome_label
      ),
      size = 8 / .pt,
      hjust = 0,
      vjust = -.5,
      direction = "y",
      nudge_x = -1
    ) +
    labs(
      title = title_label, 
      subtitle = subtitle_label
    ) +
    scale_x_continuous(
      breaks = c(2010, 2020),
      limits = c(2005, 2025)
    ) +
     theme_unhcr(
      grid = "X",
      axis = FALSE,
      axis_title = FALSE,
      axis_text = "X"
    )
}

Import API Key

Code
# Load API key, assign to TidyCensus Package
source(here::here("analysis/password.R"))
census_api_key(census_api_key)
To install your API key for use in future sessions, run this function with `install = TRUE`.

Data

Next, recall that we can load up our data sets and process them with our functions to create data sets on a national and divisional level for 2010 and 2020.

Note

Note that we are loading up the data we saved in Lab 04 with our NMTC and LIHTC flags in addition to our divisional data:

Code
# Load NMTC AND LIHTC data sets

svi_divisional_nmtc <- readRDS(here::here(paste0("data/wrangling/", str_replace_all(census_division, " ", "_"), "_svi_divisional_nmtc.rds")))

svi_national_nmtc <- readRDS(here::here(paste0("data/wrangling/", str_replace_all(census_division, " ", "_"), "_svi_national_nmtc.rds")))

svi_divisional_lihtc <- readRDS(here::here(paste0("data/wrangling/", str_replace_all(census_division, " ", "_"), "_svi_divisional_lihtc.rds")))

svi_national_lihtc <- readRDS(here::here(paste0("data/wrangling/", str_replace_all(census_division, " ", "_"), "_svi_national_lihtc.rds")))
Code
colnames(svi_divisional_lihtc)[str_detect(colnames(svi_divisional_lihtc), "^E_")]
 [1] "E_TOTPOP_10"     "E_HU_10"         "E_HH_10"         "E_POV150_10"    
 [5] "E_UNEMP_10"      "E_HBURD_OWN_10"  "E_HBURD_RENT_10" "E_HBURD_10"     
 [9] "E_NOHSDP_10"     "E_UNINSUR_12"    "E_AGE65_10"      "E_AGE17_10"     
[13] "E_DISABL_12"     "E_SNGPNT_10"     "E_LIMENG_10"     "E_MINRTY_10"    
[17] "E_STRHU_10"      "E_MUNIT_10"      "E_MOBILE_10"     "E_CROWD_10"     
[21] "E_NOVEH_10"      "E_GROUPQ_10"     "E_TOTPOP_20"     "E_HU_20"        
[25] "E_HH_20"         "E_POV150_20"     "E_UNEMP_20"      "E_HBURD_OWN_20" 
[29] "E_HBURD_RENT_20" "E_HBURD_20"      "E_NOHSDP_20"     "E_UNINSUR_20"   
[33] "E_AGE65_20"      "E_AGE17_20"      "E_DISABL_20"     "E_SNGPNT_20"    
[37] "E_LIMENG_20"     "E_MINRTY_20"     "E_STRHU_20"      "E_MUNIT_20"     
[41] "E_MOBILE_20"     "E_CROWD_20"      "E_NOVEH_20"      "E_GROUPQ_20"    

View NMTC Data

Code
svi_divisional_nmtc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt FIPS_st FIPS_county FIPS_tract state state_name county region_number region division_number division E_TOTPOP_10 E_HU_10 E_HH_10 E_POV150_10 ET_POVSTATUS_10 EP_POV150_10 EPL_POV150_10 F_POV150_10 E_UNEMP_10 ET_EMPSTATUS_10 EP_UNEMP_10 EPL_UNEMP_10 F_UNEMP_10 E_HBURD_OWN_10 ET_HOUSINGCOST_OWN_10 EP_HBURD_OWN_10 EPL_HBURD_OWN_10 F_HBURD_OWN_10 E_HBURD_RENT_10 ET_HOUSINGCOST_RENT_10 EP_HBURD_RENT_10 EPL_HBURD_RENT_10 F_HBURD_RENT_10 E_HBURD_10 ET_HOUSINGCOST_10 EP_HBURD_10 EPL_HBURD_10 F_HBURD_10 E_NOHSDP_10 ET_EDSTATUS_10 EP_NOHSDP_10 EPL_NOHSDP_10 F_NOHSDP_10 E_UNINSUR_12 ET_INSURSTATUS_12 EP_UNINSUR_12 EPL_UNINSUR_12 F_UNINSUR_12 E_AGE65_10 EP_AGE65_10 EPL_AGE65_10 F_AGE65_10 E_AGE17_10 EP_AGE17_10 EPL_AGE17_10 F_AGE17_10 E_DISABL_12 ET_DISABLSTATUS_12 EP_DISABL_12 EPL_DISABL_12 F_DISABL_12 E_SNGPNT_10 ET_FAMILIES_10 EP_SNGPNT_10 EPL_SNGPNT_10 F_SNGPNT_10 E_LIMENG_10 ET_POPAGE5UP_10 EP_LIMENG_10 EPL_LIMENG_10 F_LIMENG_10 E_MINRTY_10 ET_POPETHRACE_10 EP_MINRTY_10 EPL_MINRTY_10 F_MINRTY_10 E_STRHU_10 E_MUNIT_10 EP_MUNIT_10 EPL_MUNIT_10 F_MUNIT_10 E_MOBILE_10 EP_MOBILE_10 EPL_MOBILE_10 F_MOBILE_10 E_CROWD_10 ET_OCCUPANTS_10 EP_CROWD_10 EPL_CROWD_10 F_CROWD_10 E_NOVEH_10 ET_KNOWNVEH_10 EP_NOVEH_10 EPL_NOVEH_10 F_NOVEH_10 E_GROUPQ_10 ET_HHTYPE_10 EP_GROUPQ_10 EPL_GROUPQ_10 F_GROUPQ_10 SPL_THEME1_10 RPL_THEME1_10 F_THEME1_10 SPL_THEME2_10 RPL_THEME2_10 F_THEME2_10 SPL_THEME3_10 RPL_THEME3_10 F_THEME3_10 SPL_THEME4_10 RPL_THEME4_10 F_THEME4_10 SPL_THEMES_10 RPL_THEMES_10 F_TOTAL_10 E_TOTPOP_20 E_HU_20 E_HH_20 E_POV150_20 ET_POVSTATUS_20 EP_POV150_20 EPL_POV150_20 F_POV150_20 E_UNEMP_20 ET_EMPSTATUS_20 EP_UNEMP_20 EPL_UNEMP_20 F_UNEMP_20 E_HBURD_OWN_20 ET_HOUSINGCOST_OWN_20 EP_HBURD_OWN_20 EPL_HBURD_OWN_20 F_HBURD_OWN_20 E_HBURD_RENT_20 ET_HOUSINGCOST_RENT_20 EP_HBURD_RENT_20 EPL_HBURD_RENT_20 F_HBURD_RENT_20 E_HBURD_20 ET_HOUSINGCOST_20 EP_HBURD_20 EPL_HBURD_20 F_HBURD_20 E_NOHSDP_20 ET_EDSTATUS_20 EP_NOHSDP_20 EPL_NOHSDP_20 F_NOHSDP_20 E_UNINSUR_20 ET_INSURSTATUS_20 EP_UNINSUR_20 EPL_UNINSUR_20 F_UNINSUR_20 E_AGE65_20 EP_AGE65_20 EPL_AGE65_20 F_AGE65_20 E_AGE17_20 EP_AGE17_20 EPL_AGE17_20 F_AGE17_20 E_DISABL_20 ET_DISABLSTATUS_20 EP_DISABL_20 EPL_DISABL_20 F_DISABL_20 E_SNGPNT_20 ET_FAMILIES_20 EP_SNGPNT_20 EPL_SNGPNT_20 F_SNGPNT_20 E_LIMENG_20 ET_POPAGE5UP_20 EP_LIMENG_20 EPL_LIMENG_20 F_LIMENG_20 E_MINRTY_20 ET_POPETHRACE_20 EP_MINRTY_20 EPL_MINRTY_20 F_MINRTY_20 E_STRHU_20 E_MUNIT_20 EP_MUNIT_20 EPL_MUNIT_20 F_MUNIT_20 E_MOBILE_20 EP_MOBILE_20 EPL_MOBILE_20 F_MOBILE_20 E_CROWD_20 ET_OCCUPANTS_20 EP_CROWD_20 EPL_CROWD_20 F_CROWD_20 E_NOVEH_20 ET_KNOWNVEH_20 EP_NOVEH_20 EPL_NOVEH_20 F_NOVEH_20 E_GROUPQ_20 ET_HHTYPE_20 EP_GROUPQ_20 EPL_GROUPQ_20 F_GROUPQ_20 SPL_THEME1_20 RPL_THEME1_20 F_THEME1_20 SPL_THEME2_20 RPL_THEME2_20 F_THEME2_20 SPL_THEME3_20 RPL_THEME3_20 F_THEME3_20 SPL_THEME4_20 RPL_THEME4_20 F_THEME4_20 SPL_THEMES_20 RPL_THEMES_20 F_TOTAL_20 nmtc_eligibility pre10_nmtc_project_cnt pre10_nmtc_dollars pre10_nmtc_dollars_formatted post10_nmtc_project_cnt post10_nmtc_dollars post10_nmtc_dollars_formatted nmtc_flag
34001000100 34 001 000100 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 2907 1088 983 1127 2907 38.76849 0.8482 1 144 1433 10.048849 0.7544 1 280 435 64.36782 0.9529 1 204 548 37.22628 0.2998 0 484 983 49.23703 0.7813 1 468 1759 26.60603 0.8634 1 532 2543 20.92017 0.8978 1 250 8.599931 0.1777 0 944 32.47334 0.94170 1 186 1851 10.04862 0.2706 0 266 678 39.233038 0.8981 1 177 2611 6.779012 0.7778 1 1928 2907 66.32267 0.7743 1 1088 113 10.386029 0.6229 0 9 0.8272059 0.7223 0 80 983 8.138352 0.8657 1 265 983 26.95829 0.7354 0 0 2907 0 0.3512 0 4.1451 0.8935 5 3.06590 0.7944 3 0.7743 0.7667 1 3.2975 0.8414 1 11.28280 0.8862 10 2157 941 784 1182 2157 54.79833 0.9571 1 242 1058 22.873346 0.9922 1 215 342 62.86550 0.9780 1 316 442 71.49321 0.9481 1 531 784 67.72959 0.9893 1 396 1274 31.08320 0.9497 1 266 2157 12.331943 0.9041 1 185 8.576727 0.09430 0 552 25.59110 0.8128 1 297 1605 18.504673 0.74880 0 83 510 16.27451 0.6090 0 251 2020 12.425743 0.87100 1 1852 2157 85.85999 0.8476 1 941 118 12.5398512 0.6385 0 0 0.00000 0.3216 0 67 784 8.545918 0.8657 1 212 784 27.04082 0.7502 1 0 2157 0.0000000 0.1517 0 4.7924 0.9850 5 3.13590 0.8217 2 0.8476 0.8400 1 2.7277 0.6085 2 11.50360 0.9104 10 Yes 0 0 $0 0 0 $0 0
34001000200 34 001 000200 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3189 2217 1473 519 3189 16.27469 0.4806 0 109 1558 6.996149 0.5179 0 573 955 60.00000 0.9323 1 199 518 38.41699 0.3261 0 772 1473 52.41005 0.8418 1 405 2579 15.70376 0.6491 0 484 3547 13.64533 0.7154 0 847 26.560050 0.9629 1 436 13.67200 0.08181 0 608 3005 20.23295 0.8466 1 42 857 4.900817 0.1204 0 422 3072 13.736979 0.8799 1 1792 3189 56.19316 0.7390 0 2217 901 40.640505 0.8693 1 0 0.0000000 0.3251 0 48 1473 3.258656 0.7064 0 250 1473 16.97217 0.6444 0 0 3189 0 0.3512 0 3.2048 0.6963 1 2.89161 0.7231 3 0.7390 0.7317 0 2.8964 0.6887 1 9.73181 0.7340 5 3510 2046 1353 1021 3510 29.08832 0.7682 1 121 1852 6.533477 0.6717 0 343 696 49.28161 0.9273 1 416 657 63.31811 0.8696 1 759 1353 56.09756 0.9321 1 553 2338 23.65269 0.8871 1 354 3510 10.085470 0.8530 1 643 18.319088 0.60310 0 1002 28.54701 0.9055 1 450 2508 17.942584 0.72330 0 237 786 30.15267 0.8539 1 534 3375 15.822222 0.90620 1 2534 3510 72.19373 0.7818 1 2046 906 44.2815249 0.8690 1 0 0.00000 0.3216 0 119 1353 8.795270 0.8711 1 324 1353 23.94678 0.7255 0 0 3510 0.0000000 0.1517 0 4.1121 0.9003 4 3.99200 0.9781 3 0.7818 0.7747 1 2.9389 0.7011 2 11.82480 0.9310 10 Yes 0 0 $0 0 0 $0 0
34001000300 34 001 000300 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3997 1823 1357 1401 3968 35.30746 0.8164 1 382 2238 17.068811 0.9376 1 176 329 53.49544 0.8855 1 604 1028 58.75486 0.7947 1 780 1357 57.47973 0.9165 1 920 2677 34.36683 0.9346 1 1351 4149 32.56206 0.9811 1 314 7.855892 0.1437 0 937 23.44258 0.55900 0 319 3054 10.44532 0.3000 0 187 782 23.913044 0.7498 0 1080 3671 29.419777 0.9742 1 3357 3997 83.98799 0.8419 1 1823 363 19.912233 0.7535 1 0 0.0000000 0.3251 0 150 1357 11.053795 0.9136 1 651 1357 47.97347 0.8585 1 0 3997 0 0.3512 0 4.5862 0.9691 5 2.72670 0.6360 1 0.8419 0.8336 1 3.2019 0.8054 3 11.35670 0.8920 10 3801 1640 1226 1857 3801 48.85556 0.9333 1 226 1800 12.555556 0.9267 1 111 280 39.64286 0.8339 1 608 946 64.27061 0.8842 1 719 1226 58.64600 0.9528 1 650 2275 28.57143 0.9337 1 1027 3801 27.019206 0.9914 1 380 9.997369 0.14040 0 1223 32.17574 0.9607 1 219 2578 8.494957 0.15680 0 268 909 29.48295 0.8456 1 940 3400 27.647059 0.97280 1 3318 3801 87.29282 0.8579 1 1640 262 15.9756098 0.6917 0 0 0.00000 0.3216 0 124 1226 10.114192 0.8955 1 477 1226 38.90701 0.8258 1 0 3801 0.0000000 0.1517 0 4.7379 0.9829 5 3.07630 0.8013 3 0.8579 0.8501 1 2.8863 0.6781 2 11.55840 0.9150 11 Yes 0 0 $0 0 0 $0 0
34001000500 34 001 000500 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3483 1241 1027 1938 3483 55.64169 0.9533 1 124 1630 7.607362 0.5830 0 227 446 50.89686 0.8549 1 478 581 82.27194 0.9799 1 705 1027 68.64654 0.9863 1 733 2077 35.29129 0.9396 1 727 3258 22.31430 0.9149 1 377 10.824002 0.3081 0 1055 30.28998 0.90140 1 268 2401 11.16202 0.3549 0 209 763 27.391874 0.7940 1 911 3077 29.606760 0.9746 1 3036 3483 87.16624 0.8550 1 1241 52 4.190169 0.4505 0 4 0.3223207 0.6567 0 113 1027 11.002921 0.9128 1 422 1027 41.09056 0.8250 1 0 3483 0 0.3512 0 4.3771 0.9379 4 3.33300 0.8766 3 0.8550 0.8467 1 3.1962 0.8026 2 11.76130 0.9229 10 3385 1185 945 1682 3364 50.00000 0.9391 1 72 1577 4.565631 0.4586 0 185 468 39.52991 0.8332 1 362 477 75.89099 0.9703 1 547 945 57.88360 0.9477 1 592 1983 29.85376 0.9422 1 738 3385 21.802068 0.9817 1 240 7.090103 0.05988 0 1129 33.35303 0.9689 1 135 2256 5.984043 0.04817 0 110 717 15.34170 0.5822 0 721 3076 23.439532 0.95690 1 3029 3385 89.48301 0.8727 1 1185 9 0.7594937 0.2382 0 0 0.00000 0.3216 0 103 945 10.899471 0.9072 1 263 945 27.83069 0.7560 1 0 3385 0.0000000 0.1517 0 4.2693 0.9283 4 2.61605 0.5709 2 0.8727 0.8648 1 2.3747 0.4357 2 10.13275 0.7921 9 Yes 0 0 $0 0 0 $0 0
34001001100 34 001 001100 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 2204 1204 1204 1185 2204 53.76588 0.9457 1 219 927 23.624596 0.9830 1 97 172 56.39535 0.9094 1 462 1032 44.76744 0.4746 0 559 1204 46.42857 0.7197 0 346 1440 24.02778 0.8306 1 469 1942 24.15036 0.9360 1 363 16.470054 0.7020 0 578 26.22505 0.74410 0 442 1558 28.36970 0.9675 1 247 396 62.373737 0.9898 1 104 2051 5.070697 0.7260 0 2118 2204 96.09800 0.9204 1 1204 570 47.342193 0.8858 1 0 0.0000000 0.3251 0 14 1204 1.162791 0.4877 0 817 1204 67.85714 0.9413 1 0 2204 0 0.3512 0 4.4150 0.9451 4 4.12940 0.9805 2 0.9204 0.9114 1 2.9911 0.7243 2 12.45590 0.9597 9 1950 1267 1096 1131 1950 58.00000 0.9678 1 66 706 9.348442 0.8395 1 42 101 41.58416 0.8612 1 309 995 31.05528 0.1959 0 351 1096 32.02555 0.4782 0 510 1379 36.98332 0.9763 1 155 1950 7.948718 0.7660 1 392 20.102564 0.69880 0 447 22.92308 0.6712 0 570 1503 37.924152 0.99200 1 143 374 38.23529 0.9167 1 109 1841 5.920695 0.74640 0 1909 1950 97.89744 0.9529 1 1267 479 37.8058406 0.8464 1 0 0.00000 0.3216 0 33 1096 3.010949 0.6446 0 743 1096 67.79197 0.9414 1 0 1950 0.0000000 0.1517 0 4.0278 0.8848 4 4.02510 0.9798 2 0.9529 0.9442 1 2.9057 0.6869 2 11.91150 0.9365 9 Yes 0 0 $0 0 0 $0 0
34001001300 34 001 001300 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 2153 1026 857 695 2153 32.28054 0.7840 1 266 1112 23.920863 0.9840 1 168 432 38.88889 0.6425 0 271 425 63.76471 0.8714 1 439 857 51.22520 0.8184 1 210 1471 14.27600 0.5989 0 463 2215 20.90293 0.8974 1 334 15.513237 0.6436 0 539 25.03484 0.66990 0 222 1687 13.15945 0.4984 0 265 608 43.585526 0.9249 1 92 1905 4.829396 0.7187 0 1993 2153 92.56851 0.8890 1 1026 147 14.327485 0.6885 0 0 0.0000000 0.3251 0 20 857 2.333722 0.6326 0 142 857 16.56943 0.6382 0 0 2153 0 0.3512 0 4.0827 0.8798 4 3.45550 0.9039 1 0.8890 0.8804 1 2.6356 0.5687 0 11.06280 0.8673 6 1632 917 770 591 1632 36.21324 0.8455 1 203 854 23.770492 0.9928 1 164 291 56.35739 0.9604 1 364 479 75.99165 0.9710 1 528 770 68.57143 0.9914 1 150 1056 14.20455 0.7232 0 97 1632 5.943627 0.6352 0 301 18.443628 0.60940 0 271 16.60539 0.2292 0 314 1361 23.071271 0.88960 1 148 410 36.09756 0.9025 1 0 1585 0.000000 0.06953 0 1512 1632 92.64706 0.8931 1 917 246 26.8266085 0.7912 1 16 1.74482 0.7855 1 0 770 0.000000 0.1194 0 219 770 28.44156 0.7606 1 14 1632 0.8578431 0.6722 0 4.1881 0.9131 3 2.70023 0.6211 2 0.8931 0.8850 1 3.1289 0.7740 3 10.91033 0.8638 9 Yes 0 0 $0 0 0 $0 0
Code
svi_national_nmtc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt FIPS_st FIPS_county FIPS_tract state state_name county region_number region division_number division E_TOTPOP_10 E_HU_10 E_HH_10 E_POV150_10 ET_POVSTATUS_10 EP_POV150_10 EPL_POV150_10 F_POV150_10 E_UNEMP_10 ET_EMPSTATUS_10 EP_UNEMP_10 EPL_UNEMP_10 F_UNEMP_10 E_HBURD_OWN_10 ET_HOUSINGCOST_OWN_10 EP_HBURD_OWN_10 EPL_HBURD_OWN_10 F_HBURD_OWN_10 E_HBURD_RENT_10 ET_HOUSINGCOST_RENT_10 EP_HBURD_RENT_10 EPL_HBURD_RENT_10 F_HBURD_RENT_10 E_HBURD_10 ET_HOUSINGCOST_10 EP_HBURD_10 EPL_HBURD_10 F_HBURD_10 E_NOHSDP_10 ET_EDSTATUS_10 EP_NOHSDP_10 EPL_NOHSDP_10 F_NOHSDP_10 E_UNINSUR_12 ET_INSURSTATUS_12 EP_UNINSUR_12 EPL_UNINSUR_12 F_UNINSUR_12 E_AGE65_10 EP_AGE65_10 EPL_AGE65_10 F_AGE65_10 E_AGE17_10 EP_AGE17_10 EPL_AGE17_10 F_AGE17_10 E_DISABL_12 ET_DISABLSTATUS_12 EP_DISABL_12 EPL_DISABL_12 F_DISABL_12 E_SNGPNT_10 ET_FAMILIES_10 EP_SNGPNT_10 EPL_SNGPNT_10 F_SNGPNT_10 E_LIMENG_10 ET_POPAGE5UP_10 EP_LIMENG_10 EPL_LIMENG_10 F_LIMENG_10 E_MINRTY_10 ET_POPETHRACE_10 EP_MINRTY_10 EPL_MINRTY_10 F_MINRTY_10 E_STRHU_10 E_MUNIT_10 EP_MUNIT_10 EPL_MUNIT_10 F_MUNIT_10 E_MOBILE_10 EP_MOBILE_10 EPL_MOBILE_10 F_MOBILE_10 E_CROWD_10 ET_OCCUPANTS_10 EP_CROWD_10 EPL_CROWD_10 F_CROWD_10 E_NOVEH_10 ET_KNOWNVEH_10 EP_NOVEH_10 EPL_NOVEH_10 F_NOVEH_10 E_GROUPQ_10 ET_HHTYPE_10 EP_GROUPQ_10 EPL_GROUPQ_10 F_GROUPQ_10 SPL_THEME1_10 RPL_THEME1_10 F_THEME1_10 SPL_THEME2_10 RPL_THEME2_10 F_THEME2_10 SPL_THEME3_10 RPL_THEME3_10 F_THEME3_10 SPL_THEME4_10 RPL_THEME4_10 F_THEME4_10 SPL_THEMES_10 RPL_THEMES_10 F_TOTAL_10 E_TOTPOP_20 E_HU_20 E_HH_20 E_POV150_20 ET_POVSTATUS_20 EP_POV150_20 EPL_POV150_20 F_POV150_20 E_UNEMP_20 ET_EMPSTATUS_20 EP_UNEMP_20 EPL_UNEMP_20 F_UNEMP_20 E_HBURD_OWN_20 ET_HOUSINGCOST_OWN_20 EP_HBURD_OWN_20 EPL_HBURD_OWN_20 F_HBURD_OWN_20 E_HBURD_RENT_20 ET_HOUSINGCOST_RENT_20 EP_HBURD_RENT_20 EPL_HBURD_RENT_20 F_HBURD_RENT_20 E_HBURD_20 ET_HOUSINGCOST_20 EP_HBURD_20 EPL_HBURD_20 F_HBURD_20 E_NOHSDP_20 ET_EDSTATUS_20 EP_NOHSDP_20 EPL_NOHSDP_20 F_NOHSDP_20 E_UNINSUR_20 ET_INSURSTATUS_20 EP_UNINSUR_20 EPL_UNINSUR_20 F_UNINSUR_20 E_AGE65_20 EP_AGE65_20 EPL_AGE65_20 F_AGE65_20 E_AGE17_20 EP_AGE17_20 EPL_AGE17_20 F_AGE17_20 E_DISABL_20 ET_DISABLSTATUS_20 EP_DISABL_20 EPL_DISABL_20 F_DISABL_20 E_SNGPNT_20 ET_FAMILIES_20 EP_SNGPNT_20 EPL_SNGPNT_20 F_SNGPNT_20 E_LIMENG_20 ET_POPAGE5UP_20 EP_LIMENG_20 EPL_LIMENG_20 F_LIMENG_20 E_MINRTY_20 ET_POPETHRACE_20 EP_MINRTY_20 EPL_MINRTY_20 F_MINRTY_20 E_STRHU_20 E_MUNIT_20 EP_MUNIT_20 EPL_MUNIT_20 F_MUNIT_20 E_MOBILE_20 EP_MOBILE_20 EPL_MOBILE_20 F_MOBILE_20 E_CROWD_20 ET_OCCUPANTS_20 EP_CROWD_20 EPL_CROWD_20 F_CROWD_20 E_NOVEH_20 ET_KNOWNVEH_20 EP_NOVEH_20 EPL_NOVEH_20 F_NOVEH_20 E_GROUPQ_20 ET_HHTYPE_20 EP_GROUPQ_20 EPL_GROUPQ_20 F_GROUPQ_20 SPL_THEME1_20 RPL_THEME1_20 F_THEME1_20 SPL_THEME2_20 RPL_THEME2_20 F_THEME2_20 SPL_THEME3_20 RPL_THEME3_20 F_THEME3_20 SPL_THEME4_20 RPL_THEME4_20 F_THEME4_20 SPL_THEMES_20 RPL_THEMES_20 F_TOTAL_20 nmtc_eligibility pre10_nmtc_project_cnt pre10_nmtc_dollars pre10_nmtc_dollars_formatted post10_nmtc_project_cnt post10_nmtc_dollars post10_nmtc_dollars_formatted nmtc_flag
01001020200 01 001 020200 AL Alabama Autauga County 3 South Region 6 East South Central Division 2020 816 730 495 1992 24.84940 0.5954 0 68 834 8.153477 0.57540 0 49 439 11.16173 0.02067 0 105 291 36.08247 0.30190 0 154 730 21.09589 0.09312 0 339 1265 26.79842 0.8392 1 313 2012 15.55666 0.6000 0 204 10.09901 0.3419 0 597 29.55446 0.8192 1 359 1515 23.69637 0.8791 1 132 456 28.947368 0.8351 1 15 1890 0.7936508 0.40130 0 1243 2020 61.53465 0.7781 1 816 0 0.0000000 0.1224 0 34 4.1666667 0.6664 0 13 730 1.780822 0.5406 0 115 730 15.753425 0.8382 1 0 2020 0.0000 0.3640 0 2.70312 0.5665 1 3.27660 0.8614 3 0.7781 0.7709 1 2.5316 0.5047 1 9.28942 0.6832 6 1757 720 573 384 1511 25.41363 0.6427 0 29 717 4.044630 0.4132 0 33 392 8.418367 0.03542 0 116 181 64.08840 0.9086 1 149 573 26.00349 0.40410 0 139 1313 10.58644 0.5601 0 91 1533 5.936073 0.4343 0 284 16.163916 0.5169 0 325 18.49744 0.2851 0 164 1208.000 13.57616 0.4127 0 42 359.0000 11.699164 0.3998 0 0 1651 0.0000000 0.09479 0 1116 1757.000 63.51736 0.7591 1 720 3 0.4166667 0.2470 0 5 0.6944444 0.5106 0 9 573 1.5706806 0.4688 0 57 573.000 9.947644 0.7317 0 212 1757 12.0660216 0.9549 1 2.45440 0.4888 0 1.70929 0.1025 0 0.7591 0.7527 1 2.9130 0.6862 1 7.83579 0.4802 2 Yes 0 0 $0 0 0 $0 0
01001020700 01 001 020700 AL Alabama Autauga County 3 South Region 6 East South Central Division 2664 1254 1139 710 2664 26.65165 0.6328 0 29 1310 2.213741 0.05255 0 134 710 18.87324 0.13890 0 187 429 43.58974 0.47090 0 321 1139 28.18262 0.28130 0 396 1852 21.38229 0.7478 0 345 2878 11.98749 0.4459 0 389 14.60210 0.6417 0 599 22.48499 0.4007 0 510 2168 23.52399 0.8752 1 228 712 32.022472 0.8712 1 0 2480 0.0000000 0.09298 0 694 2664 26.05105 0.5138 0 1254 8 0.6379585 0.2931 0 460 36.6826156 0.9714 1 0 1139 0.000000 0.1238 0 125 1139 10.974539 0.7477 0 0 2664 0.0000 0.3640 0 2.16035 0.4069 0 2.88178 0.6997 2 0.5138 0.5090 0 2.5000 0.4882 1 8.05593 0.5185 3 3562 1313 1248 1370 3528 38.83220 0.8512 1 128 1562 8.194622 0.7935 1 168 844 19.905213 0.44510 0 237 404 58.66337 0.8359 1 405 1248 32.45192 0.60420 0 396 2211 17.91045 0.7857 1 444 3547 12.517620 0.7758 1 355 9.966311 0.1800 0 954 26.78271 0.7923 1 629 2593.000 24.25762 0.8730 1 171 797.0000 21.455458 0.7186 0 0 3211 0.0000000 0.09479 0 1009 3562.000 28.32678 0.4668 0 1313 14 1.0662605 0.3165 0 443 33.7395278 0.9663 1 73 1248 5.8493590 0.8211 1 17 1248.000 1.362180 0.1554 0 112 3562 3.1443010 0.8514 1 3.81040 0.8569 4 2.65869 0.5847 2 0.4668 0.4629 0 3.1107 0.7714 3 10.04659 0.7851 9 Yes 0 0 $0 0 0 $0 0
01001021100 01 001 021100 AL Alabama Autauga County 3 South Region 6 East South Central Division 3298 1502 1323 860 3298 26.07641 0.6211 0 297 1605 18.504673 0.94340 1 250 1016 24.60630 0.32070 0 74 307 24.10423 0.11920 0 324 1323 24.48980 0.17380 0 710 2231 31.82429 0.8976 1 654 3565 18.34502 0.7018 0 411 12.46210 0.5001 0 738 22.37720 0.3934 0 936 2861 32.71583 0.9807 1 138 825 16.727273 0.5715 0 9 3155 0.2852615 0.25010 0 1979 3298 60.00606 0.7703 1 1502 14 0.9320905 0.3234 0 659 43.8748336 0.9849 1 44 1323 3.325775 0.7062 0 137 1323 10.355253 0.7313 0 0 3298 0.0000 0.3640 0 3.33770 0.7351 2 2.69580 0.6028 1 0.7703 0.7631 1 3.1098 0.7827 1 9.91360 0.7557 5 3499 1825 1462 1760 3499 50.30009 0.9396 1 42 966 4.347826 0.4539 0 426 1274 33.437991 0.85200 1 52 188 27.65957 0.1824 0 478 1462 32.69494 0.61110 0 422 2488 16.96141 0.7638 1 497 3499 14.204058 0.8246 1 853 24.378394 0.8688 1 808 23.09231 0.5829 0 908 2691.100 33.74084 0.9808 1 179 811.6985 22.052524 0.7323 0 8 3248 0.2463054 0.26220 0 1986 3498.713 56.76373 0.7175 0 1825 29 1.5890411 0.3551 0 576 31.5616438 0.9594 1 88 1462 6.0191518 0.8269 1 148 1461.993 10.123166 0.7364 0 38 3499 1.0860246 0.7013 0 3.59300 0.8073 3 3.42700 0.9156 2 0.7175 0.7114 0 3.5791 0.9216 2 11.31660 0.9150 7 Yes 0 0 $0 0 0 $0 0
01003010200 01 003 010200 AL Alabama Baldwin County 3 South Region 6 East South Central Division 2612 1220 1074 338 2605 12.97505 0.2907 0 44 1193 3.688181 0.14720 0 172 928 18.53448 0.13090 0 31 146 21.23288 0.09299 0 203 1074 18.90130 0.05657 0 455 1872 24.30556 0.8016 1 456 2730 16.70330 0.6445 0 401 15.35222 0.6847 0 563 21.55436 0.3406 0 410 2038 20.11776 0.7755 1 64 779 8.215661 0.2181 0 0 2510 0.0000000 0.09298 0 329 2612 12.59571 0.3113 0 1220 38 3.1147541 0.4648 0 385 31.5573770 0.9545 1 20 1074 1.862197 0.5509 0 43 1074 4.003724 0.4088 0 0 2612 0.0000 0.3640 0 1.94057 0.3398 1 2.11188 0.2802 1 0.3113 0.3084 0 2.7430 0.6129 1 7.10675 0.3771 3 2928 1312 1176 884 2928 30.19126 0.7334 0 29 1459 1.987663 0.1356 0 71 830 8.554217 0.03726 0 134 346 38.72832 0.3964 0 205 1176 17.43197 0.12010 0 294 2052 14.32749 0.6940 0 219 2925 7.487179 0.5423 0 556 18.989071 0.6705 0 699 23.87295 0.6339 0 489 2226.455 21.96317 0.8122 1 191 783.8820 24.365914 0.7799 1 0 2710 0.0000000 0.09479 0 398 2927.519 13.59513 0.2511 0 1312 13 0.9908537 0.3111 0 400 30.4878049 0.9557 1 6 1176 0.5102041 0.2590 0 81 1176.202 6.886570 0.6115 0 7 2928 0.2390710 0.4961 0 2.22540 0.4183 0 2.99129 0.7634 2 0.2511 0.2490 0 2.6334 0.5496 1 8.10119 0.5207 3 Yes 0 0 $0 1 408000 $408,000 1
01003010500 01 003 010500 AL Alabama Baldwin County 3 South Region 6 East South Central Division 4230 1779 1425 498 3443 14.46413 0.3337 0 166 1625 10.215385 0.71790 0 151 1069 14.12535 0.04638 0 196 356 55.05618 0.73830 0 347 1425 24.35088 0.17010 0 707 2945 24.00679 0.7967 1 528 4001 13.19670 0.5005 0 619 14.63357 0.6436 0 790 18.67612 0.1937 0 536 3096 17.31266 0.6572 0 165 920 17.934783 0.6102 0 20 4021 0.4973887 0.32320 0 754 4230 17.82506 0.4023 0 1779 97 5.4525014 0.5525 0 8 0.4496908 0.4600 0 63 1425 4.421053 0.7762 1 90 1425 6.315790 0.5691 0 787 4230 18.6052 0.9649 1 2.51890 0.5121 1 2.42790 0.4539 0 0.4023 0.3986 0 3.3227 0.8628 2 8.67180 0.6054 3 5877 1975 1836 820 5244 15.63692 0.3902 0 90 2583 3.484321 0.3361 0 159 1345 11.821561 0.10530 0 139 491 28.30957 0.1924 0 298 1836 16.23094 0.09053 0 570 4248 13.41808 0.6669 0 353 5247 6.727654 0.4924 0 1109 18.870172 0.6645 0 1144 19.46571 0.3411 0 717 4102.545 17.47696 0.6332 0 103 1286.1180 8.008596 0.2341 0 0 5639 0.0000000 0.09479 0 868 5877.481 14.76823 0.2709 0 1975 26 1.3164557 0.3359 0 45 2.2784810 0.6271 0 9 1836 0.4901961 0.2540 0 116 1835.798 6.318779 0.5811 0 633 5877 10.7708014 0.9507 1 1.97613 0.3410 0 1.96769 0.1961 0 0.2709 0.2686 0 2.7488 0.6077 1 6.96352 0.3406 1 Yes 0 0 $0 0 0 $0 0
01003010600 01 003 010600 AL Alabama Baldwin County 3 South Region 6 East South Central Division 3724 1440 1147 1973 3724 52.98067 0.9342 1 142 1439 9.867964 0.69680 0 235 688 34.15698 0.62950 0 187 459 40.74074 0.40290 0 422 1147 36.79163 0.55150 0 497 1876 26.49254 0.8354 1 511 3661 13.95794 0.5334 0 246 6.60580 0.1481 0 1256 33.72718 0.9305 1 496 2522 19.66693 0.7587 1 274 838 32.696897 0.8779 1 32 3479 0.9198045 0.42810 0 2606 3724 69.97852 0.8184 1 1440 21 1.4583333 0.3683 0 321 22.2916667 0.9036 1 97 1147 8.456844 0.8956 1 167 1147 14.559721 0.8209 1 0 3724 0.0000 0.3640 0 3.55130 0.7859 2 3.14330 0.8145 3 0.8184 0.8108 1 3.3524 0.8725 3 10.86540 0.8550 9 4115 1534 1268 1676 3997 41.93145 0.8814 1 294 1809 16.252073 0.9674 1 341 814 41.891892 0.94320 1 204 454 44.93392 0.5438 0 545 1268 42.98107 0.83620 1 624 2425 25.73196 0.9002 1 994 4115 24.155529 0.9602 1 642 15.601458 0.4841 0 1126 27.36331 0.8175 1 568 2989.000 19.00301 0.7045 0 212 715.0000 29.650350 0.8592 1 56 3825 1.4640523 0.53120 0 2715 4115.000 65.97813 0.7732 1 1534 0 0.0000000 0.1079 0 529 34.4850065 0.9685 1 101 1268 7.9652997 0.8795 1 89 1268.000 7.018927 0.6184 0 17 4115 0.4131227 0.5707 0 4.54540 0.9754 5 3.39650 0.9081 2 0.7732 0.7667 1 3.1450 0.7858 2 11.86010 0.9520 10 Yes 0 0 $0 1 8000000 $8,000,000 1

View LIHTC Data

Code
svi_divisional_lihtc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt FIPS_st FIPS_county FIPS_tract state state_name county region_number region division_number division E_TOTPOP_10 E_HU_10 E_HH_10 E_POV150_10 ET_POVSTATUS_10 EP_POV150_10 EPL_POV150_10 F_POV150_10 E_UNEMP_10 ET_EMPSTATUS_10 EP_UNEMP_10 EPL_UNEMP_10 F_UNEMP_10 E_HBURD_OWN_10 ET_HOUSINGCOST_OWN_10 EP_HBURD_OWN_10 EPL_HBURD_OWN_10 F_HBURD_OWN_10 E_HBURD_RENT_10 ET_HOUSINGCOST_RENT_10 EP_HBURD_RENT_10 EPL_HBURD_RENT_10 F_HBURD_RENT_10 E_HBURD_10 ET_HOUSINGCOST_10 EP_HBURD_10 EPL_HBURD_10 F_HBURD_10 E_NOHSDP_10 ET_EDSTATUS_10 EP_NOHSDP_10 EPL_NOHSDP_10 F_NOHSDP_10 E_UNINSUR_12 ET_INSURSTATUS_12 EP_UNINSUR_12 EPL_UNINSUR_12 F_UNINSUR_12 E_AGE65_10 EP_AGE65_10 EPL_AGE65_10 F_AGE65_10 E_AGE17_10 EP_AGE17_10 EPL_AGE17_10 F_AGE17_10 E_DISABL_12 ET_DISABLSTATUS_12 EP_DISABL_12 EPL_DISABL_12 F_DISABL_12 E_SNGPNT_10 ET_FAMILIES_10 EP_SNGPNT_10 EPL_SNGPNT_10 F_SNGPNT_10 E_LIMENG_10 ET_POPAGE5UP_10 EP_LIMENG_10 EPL_LIMENG_10 F_LIMENG_10 E_MINRTY_10 ET_POPETHRACE_10 EP_MINRTY_10 EPL_MINRTY_10 F_MINRTY_10 E_STRHU_10 E_MUNIT_10 EP_MUNIT_10 EPL_MUNIT_10 F_MUNIT_10 E_MOBILE_10 EP_MOBILE_10 EPL_MOBILE_10 F_MOBILE_10 E_CROWD_10 ET_OCCUPANTS_10 EP_CROWD_10 EPL_CROWD_10 F_CROWD_10 E_NOVEH_10 ET_KNOWNVEH_10 EP_NOVEH_10 EPL_NOVEH_10 F_NOVEH_10 E_GROUPQ_10 ET_HHTYPE_10 EP_GROUPQ_10 EPL_GROUPQ_10 F_GROUPQ_10 SPL_THEME1_10 RPL_THEME1_10 F_THEME1_10 SPL_THEME2_10 RPL_THEME2_10 F_THEME2_10 SPL_THEME3_10 RPL_THEME3_10 F_THEME3_10 SPL_THEME4_10 RPL_THEME4_10 F_THEME4_10 SPL_THEMES_10 RPL_THEMES_10 F_TOTAL_10 E_TOTPOP_20 E_HU_20 E_HH_20 E_POV150_20 ET_POVSTATUS_20 EP_POV150_20 EPL_POV150_20 F_POV150_20 E_UNEMP_20 ET_EMPSTATUS_20 EP_UNEMP_20 EPL_UNEMP_20 F_UNEMP_20 E_HBURD_OWN_20 ET_HOUSINGCOST_OWN_20 EP_HBURD_OWN_20 EPL_HBURD_OWN_20 F_HBURD_OWN_20 E_HBURD_RENT_20 ET_HOUSINGCOST_RENT_20 EP_HBURD_RENT_20 EPL_HBURD_RENT_20 F_HBURD_RENT_20 E_HBURD_20 ET_HOUSINGCOST_20 EP_HBURD_20 EPL_HBURD_20 F_HBURD_20 E_NOHSDP_20 ET_EDSTATUS_20 EP_NOHSDP_20 EPL_NOHSDP_20 F_NOHSDP_20 E_UNINSUR_20 ET_INSURSTATUS_20 EP_UNINSUR_20 EPL_UNINSUR_20 F_UNINSUR_20 E_AGE65_20 EP_AGE65_20 EPL_AGE65_20 F_AGE65_20 E_AGE17_20 EP_AGE17_20 EPL_AGE17_20 F_AGE17_20 E_DISABL_20 ET_DISABLSTATUS_20 EP_DISABL_20 EPL_DISABL_20 F_DISABL_20 E_SNGPNT_20 ET_FAMILIES_20 EP_SNGPNT_20 EPL_SNGPNT_20 F_SNGPNT_20 E_LIMENG_20 ET_POPAGE5UP_20 EP_LIMENG_20 EPL_LIMENG_20 F_LIMENG_20 E_MINRTY_20 ET_POPETHRACE_20 EP_MINRTY_20 EPL_MINRTY_20 F_MINRTY_20 E_STRHU_20 E_MUNIT_20 EP_MUNIT_20 EPL_MUNIT_20 F_MUNIT_20 E_MOBILE_20 EP_MOBILE_20 EPL_MOBILE_20 F_MOBILE_20 E_CROWD_20 ET_OCCUPANTS_20 EP_CROWD_20 EPL_CROWD_20 F_CROWD_20 E_NOVEH_20 ET_KNOWNVEH_20 EP_NOVEH_20 EPL_NOVEH_20 F_NOVEH_20 E_GROUPQ_20 ET_HHTYPE_20 EP_GROUPQ_20 EPL_GROUPQ_20 F_GROUPQ_20 SPL_THEME1_20 RPL_THEME1_20 F_THEME1_20 SPL_THEME2_20 RPL_THEME2_20 F_THEME2_20 SPL_THEME3_20 RPL_THEME3_20 F_THEME3_20 SPL_THEME4_20 RPL_THEME4_20 F_THEME4_20 SPL_THEMES_20 RPL_THEMES_20 F_TOTAL_20 pre10_lihtc_project_cnt pre10_lihtc_project_dollars post10_lihtc_project_cnt post10_lihtc_project_dollars lihtc_flag lihtc_eligibility
34001001400 34 001 001400 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3736 1893 1503 2135 3736 57.14668 0.9592 1 411 1635 25.137615 0.9866 1 267 401 66.58354 0.9617 1 715 1102 64.88203 0.8844 1 982 1503 65.33599 0.9764 1 511 1696 30.129717 0.90050 1 527 4199 12.5506073 0.672800 0 269 7.200214 0.115100 0 1598 42.77302 0.9935 1 345 2252 15.319716 0.63090 0 787 941 83.63443 0.9990 1 63 3192 1.973684 0.54480 0 3463 3736 92.69272 0.8905 1 1893 427 22.556788 0.7770 1 0 0.000000 0.3251 0 22 1503 1.463739 0.5339 0 705 1503 46.90619 0.85330 1 0 3736 0.000000 0.3512 0 4.495500 0.9585 4 3.283300 0.8640 2 0.8905 0.8818 1 2.84050 0.66710 2 11.509800 0.9048 9 3812 1724 1549 2291 3754 61.028236 0.9760 1 380 1547 24.563672 0.9934 1 117 240 48.75000 0.9237 1 753 1309 57.52483 0.7816 1 870 1549 56.16527 0.9326 1 472 1913 24.673288 0.8987 1 294 3802 7.7327722 0.7558 1 363 9.52256 0.123100 0 1463 38.37880 0.9885 1 508 2339.000 21.718683 0.85640 1 564 948.000 59.49367 0.9910 1 201 3159 6.3627730 0.7613 1 3389 3812.000 88.90346 0.8683 1 1724 571 33.1206497 0.8294 1 0 0 0.3216 0 83 1549 5.358296 0.7754 1 661 1549.000 42.672692 0.8448 1 10 3812 0.2623295 0.4739 0 4.5565 0.9673 5 3.720300 0.9522 4 0.8683 0.8605 1 3.2451 0.81590 3 12.390200 0.9595 13 0 0 0 0 0 Yes
34001001500 34 001 001500 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 1074 901 752 656 1074 61.08007 0.9700 1 43 270 15.925926 0.9242 1 30 70 42.85714 0.7276 0 366 682 53.66569 0.6910 0 396 752 52.65957 0.8458 1 266 921 28.881650 0.88860 1 121 1064 11.3721805 0.613100 0 385 35.847300 0.990200 1 129 12.01117 0.0617 0 321 993 32.326284 0.98460 1 62 195 31.79487 0.8408 1 125 1050 11.904762 0.85620 1 965 1074 89.85102 0.8717 1 901 636 70.588235 0.9304 1 0 0.000000 0.3251 0 10 752 1.329787 0.5133 0 626 752 83.24468 0.98880 1 0 1074 0.000000 0.3512 0 4.241700 0.9134 4 3.733500 0.9515 4 0.8717 0.8632 1 3.10880 0.77090 2 11.955700 0.9362 11 1601 976 810 1001 1601 62.523423 0.9797 1 204 563 36.234458 0.9989 1 74 110 67.27273 0.9848 1 224 700 32.00000 0.2097 0 298 810 36.79012 0.6089 0 379 1145 33.100437 0.9610 1 272 1601 16.9893816 0.9572 1 451 28.16989 0.936300 1 251 15.67770 0.1835 0 411 1350.000 30.444444 0.97330 1 196 446.000 43.94619 0.9511 1 220 1532 14.3603133 0.8929 1 1435 1601.000 89.63148 0.8738 1 976 451 46.2090164 0.8742 1 0 0 0.3216 0 24 810 2.962963 0.6412 0 546 810.000 67.407407 0.9401 1 15 1601 0.9369144 0.6832 0 4.5057 0.9617 4 3.937100 0.9752 4 0.8738 0.8659 1 3.4603 0.87740 2 12.776900 0.9705 11 0 0 1 1497998 1 Yes
34001002400 34 001 002400 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3129 1759 1375 1916 3129 61.23362 0.9705 1 205 1075 19.069767 0.9574 1 28 60 46.66667 0.7987 1 670 1315 50.95057 0.6297 0 698 1375 50.76364 0.8102 1 632 2059 30.694512 0.90660 1 461 2365 19.4926004 0.873700 1 539 17.225951 0.744100 0 850 27.16523 0.7907 1 575 1736 33.122120 0.98650 1 237 594 39.89899 0.9035 1 312 2663 11.716110 0.85490 1 2357 3129 75.32758 0.8038 1 1759 1091 62.023877 0.9176 1 29 1.648664 0.7742 1 57 1375 4.145454 0.7529 1 696 1375 50.61818 0.87140 1 209 3129 6.679450 0.9003 1 4.518400 0.9608 5 4.279700 0.9831 4 0.8038 0.7960 1 4.21640 0.98320 5 13.818300 0.9835 15 2614 1726 1217 1579 2612 60.451761 0.9744 1 290 1171 24.765158 0.9939 1 69 127 54.33071 0.9521 1 538 1090 49.35780 0.5970 0 607 1217 49.87675 0.8624 1 697 1998 34.884885 0.9695 1 551 2614 21.0788064 0.9797 1 516 19.73986 0.679400 0 503 19.24254 0.3999 0 576 2111.000 27.285647 0.95060 1 257 567.000 45.32628 0.9571 1 556 2368 23.4797297 0.9570 1 2029 2614.000 77.62050 0.8058 1 1726 1166 67.5550406 0.9204 1 0 0 0.3216 0 115 1217 9.449466 0.8840 1 673 1217.000 55.299918 0.8978 1 223 2614 8.5309870 0.9307 1 4.7799 0.9845 5 3.944000 0.9756 3 0.8058 0.7985 1 3.9545 0.96510 4 13.484200 0.9845 13 0 0 0 0 0 Yes
34003015400 34 003 015400 NJ New Jersey Bergen County 1 Northeast Region 2 Middle Atlantic Division 5086 2258 2100 1485 5063 29.33044 0.7447 0 195 2873 6.787330 0.4938 0 223 478 46.65272 0.7984 1 876 1622 54.00740 0.6974 0 1099 2100 52.33333 0.8405 1 640 3682 17.381858 0.70160 0 1579 6178 25.5584331 0.949900 1 603 11.856075 0.377400 0 961 18.89501 0.2410 0 534 5000 10.680000 0.31600 0 254 1232 20.61688 0.6975 0 681 4763 14.297712 0.88510 1 3916 5086 76.99567 0.8096 1 2258 1028 45.527015 0.8820 1 0 0.000000 0.3251 0 28 2100 1.333333 0.5139 0 643 2100 30.61905 0.76370 1 57 5086 1.120724 0.7485 0 3.730500 0.8072 2 2.517000 0.5136 1 0.8096 0.8017 1 3.23320 0.81730 2 10.290300 0.7914 6 7543 3570 3054 1638 7543 21.715498 0.6364 0 320 4251 7.527641 0.7462 0 238 752 31.64894 0.6832 0 1211 2302 52.60643 0.6776 0 1449 3054 47.44597 0.8252 1 877 5631 15.574498 0.7611 1 1093 7543 14.4902559 0.9339 1 981 13.00544 0.282700 0 1174 15.56410 0.1785 0 756 6369.000 11.869995 0.37380 0 303 2013.000 15.05216 0.5737 0 970 7103 13.6562016 0.8846 1 5610 7543.000 74.37359 0.7916 1 3570 1871 52.4089636 0.8898 1 0 0 0.3216 0 258 3054 8.447937 0.8637 1 301 3054.000 9.855927 0.5207 0 15 7543 0.1988599 0.4315 0 3.9028 0.8603 3 2.293300 0.3701 1 0.7916 0.7845 1 3.0273 0.73680 2 10.015000 0.7805 7 0 0 0 0 0 Yes
34003018100 34 003 018100 NJ New Jersey Bergen County 1 Northeast Region 2 Middle Atlantic Division 6907 2665 2569 1865 6863 27.17470 0.7140 0 242 3781 6.400423 0.4509 0 434 834 52.03837 0.8694 1 1123 1735 64.72622 0.8830 1 1557 2569 60.60724 0.9450 1 1521 4649 32.716713 0.92270 1 2703 7124 37.9421673 0.992200 1 1024 14.825539 0.598800 0 1336 19.34270 0.2674 0 452 5848 7.729138 0.11920 0 363 1614 22.49071 0.7280 0 1324 6571 20.149140 0.93510 1 4209 6907 60.93818 0.7551 1 2665 517 19.399625 0.7487 0 0 0.000000 0.3251 0 136 2569 5.293889 0.7960 1 1043 2569 40.59945 0.82350 1 0 6907 0.000000 0.3512 0 4.024800 0.8697 3 2.648500 0.5885 1 0.7551 0.7477 1 3.04450 0.74620 2 10.472900 0.8112 7 7668 2912 2816 1803 7664 23.525574 0.6750 0 370 4727 7.827375 0.7646 1 441 819 53.84615 0.9501 1 1122 1997 56.18428 0.7544 1 1563 2816 55.50426 0.9274 1 1879 5775 32.536797 0.9576 1 1695 7668 22.1048513 0.9829 1 1041 13.57590 0.316600 0 1193 15.55816 0.1784 0 711 6474.819 10.981001 0.31250 0 197 1914.175 10.29164 0.3928 0 2045 7161 28.5574640 0.9756 1 5637 7667.630 73.51685 0.7875 1 2912 806 27.6785714 0.7973 1 0 0 0.3216 0 150 2816 5.326704 0.7742 1 833 2816.042 29.580522 0.7679 1 10 7668 0.1304121 0.3642 0 4.3075 0.9336 4 2.175900 0.2971 1 0.7875 0.7803 1 3.0252 0.73590 3 10.296100 0.8061 9 0 0 0 0 0 Yes
34005702101 34 005 702101 NJ New Jersey Burlington County 1 Northeast Region 2 Middle Atlantic Division 1637 702 483 445 1637 27.18387 0.7142 0 63 456 13.815789 0.8857 1 0 0 NaN NA NA 222 483 45.96273 0.5037 0 222 483 45.96273 0.7085 0 31 903 3.433001 0.08742 0 14 1965 0.7124682 0.008765 0 0 0.000000 0.002836 0 696 42.51680 0.9928 1 62 898 6.904232 0.08018 0 103 452 22.78761 0.7331 0 0 1379 0.000000 0.07335 0 248 1637 15.14966 0.4224 0 702 25 3.561254 0.4247 0 0 0.000000 0.3251 0 0 483 0.000000 0.1459 0 0 483 0.00000 0.01044 0 0 1637 0.000000 0.3512 0 2.404585 0.4890 1 1.882266 0.1557 1 0.4224 0.4183 0 1.25734 0.03853 0 5.966591 0.2021 2 3997 1271 1235 304 3996 7.607608 0.1919 0 46 901 5.105438 0.5252 0 0 0 NaN NA NA 731 1235 59.19028 0.8107 1 731 1235 59.19028 0.9566 1 49 1973 2.483528 0.0993 0 27 3057 0.8832188 0.0568 0 0 0.00000 0.001592 0 1651 41.30598 0.9924 1 58 1412.011 4.107616 0.01556 0 91 1092.793 8.32729 0.3046 0 32 3347 0.9560801 0.3989 0 1411 3996.883 35.30251 0.5750 0 1271 10 0.7867821 0.2414 0 0 0 0.3216 0 27 1235 2.186235 0.5699 0 11 1234.974 0.890707 0.0533 0 0 3997 0.0000000 0.1517 0 1.8298 0.3066 1 1.713052 0.1034 1 0.5750 0.5698 0 1.3379 0.06021 0 5.455752 0.1329 2 0 0 0 0 0 Yes
Code
svi_national_lihtc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt FIPS_st FIPS_county FIPS_tract state state_name county region_number region division_number division E_TOTPOP_10 E_HU_10 E_HH_10 E_POV150_10 ET_POVSTATUS_10 EP_POV150_10 EPL_POV150_10 F_POV150_10 E_UNEMP_10 ET_EMPSTATUS_10 EP_UNEMP_10 EPL_UNEMP_10 F_UNEMP_10 E_HBURD_OWN_10 ET_HOUSINGCOST_OWN_10 EP_HBURD_OWN_10 EPL_HBURD_OWN_10 F_HBURD_OWN_10 E_HBURD_RENT_10 ET_HOUSINGCOST_RENT_10 EP_HBURD_RENT_10 EPL_HBURD_RENT_10 F_HBURD_RENT_10 E_HBURD_10 ET_HOUSINGCOST_10 EP_HBURD_10 EPL_HBURD_10 F_HBURD_10 E_NOHSDP_10 ET_EDSTATUS_10 EP_NOHSDP_10 EPL_NOHSDP_10 F_NOHSDP_10 E_UNINSUR_12 ET_INSURSTATUS_12 EP_UNINSUR_12 EPL_UNINSUR_12 F_UNINSUR_12 E_AGE65_10 EP_AGE65_10 EPL_AGE65_10 F_AGE65_10 E_AGE17_10 EP_AGE17_10 EPL_AGE17_10 F_AGE17_10 E_DISABL_12 ET_DISABLSTATUS_12 EP_DISABL_12 EPL_DISABL_12 F_DISABL_12 E_SNGPNT_10 ET_FAMILIES_10 EP_SNGPNT_10 EPL_SNGPNT_10 F_SNGPNT_10 E_LIMENG_10 ET_POPAGE5UP_10 EP_LIMENG_10 EPL_LIMENG_10 F_LIMENG_10 E_MINRTY_10 ET_POPETHRACE_10 EP_MINRTY_10 EPL_MINRTY_10 F_MINRTY_10 E_STRHU_10 E_MUNIT_10 EP_MUNIT_10 EPL_MUNIT_10 F_MUNIT_10 E_MOBILE_10 EP_MOBILE_10 EPL_MOBILE_10 F_MOBILE_10 E_CROWD_10 ET_OCCUPANTS_10 EP_CROWD_10 EPL_CROWD_10 F_CROWD_10 E_NOVEH_10 ET_KNOWNVEH_10 EP_NOVEH_10 EPL_NOVEH_10 F_NOVEH_10 E_GROUPQ_10 ET_HHTYPE_10 EP_GROUPQ_10 EPL_GROUPQ_10 F_GROUPQ_10 SPL_THEME1_10 RPL_THEME1_10 F_THEME1_10 SPL_THEME2_10 RPL_THEME2_10 F_THEME2_10 SPL_THEME3_10 RPL_THEME3_10 F_THEME3_10 SPL_THEME4_10 RPL_THEME4_10 F_THEME4_10 SPL_THEMES_10 RPL_THEMES_10 F_TOTAL_10 E_TOTPOP_20 E_HU_20 E_HH_20 E_POV150_20 ET_POVSTATUS_20 EP_POV150_20 EPL_POV150_20 F_POV150_20 E_UNEMP_20 ET_EMPSTATUS_20 EP_UNEMP_20 EPL_UNEMP_20 F_UNEMP_20 E_HBURD_OWN_20 ET_HOUSINGCOST_OWN_20 EP_HBURD_OWN_20 EPL_HBURD_OWN_20 F_HBURD_OWN_20 E_HBURD_RENT_20 ET_HOUSINGCOST_RENT_20 EP_HBURD_RENT_20 EPL_HBURD_RENT_20 F_HBURD_RENT_20 E_HBURD_20 ET_HOUSINGCOST_20 EP_HBURD_20 EPL_HBURD_20 F_HBURD_20 E_NOHSDP_20 ET_EDSTATUS_20 EP_NOHSDP_20 EPL_NOHSDP_20 F_NOHSDP_20 E_UNINSUR_20 ET_INSURSTATUS_20 EP_UNINSUR_20 EPL_UNINSUR_20 F_UNINSUR_20 E_AGE65_20 EP_AGE65_20 EPL_AGE65_20 F_AGE65_20 E_AGE17_20 EP_AGE17_20 EPL_AGE17_20 F_AGE17_20 E_DISABL_20 ET_DISABLSTATUS_20 EP_DISABL_20 EPL_DISABL_20 F_DISABL_20 E_SNGPNT_20 ET_FAMILIES_20 EP_SNGPNT_20 EPL_SNGPNT_20 F_SNGPNT_20 E_LIMENG_20 ET_POPAGE5UP_20 EP_LIMENG_20 EPL_LIMENG_20 F_LIMENG_20 E_MINRTY_20 ET_POPETHRACE_20 EP_MINRTY_20 EPL_MINRTY_20 F_MINRTY_20 E_STRHU_20 E_MUNIT_20 EP_MUNIT_20 EPL_MUNIT_20 F_MUNIT_20 E_MOBILE_20 EP_MOBILE_20 EPL_MOBILE_20 F_MOBILE_20 E_CROWD_20 ET_OCCUPANTS_20 EP_CROWD_20 EPL_CROWD_20 F_CROWD_20 E_NOVEH_20 ET_KNOWNVEH_20 EP_NOVEH_20 EPL_NOVEH_20 F_NOVEH_20 E_GROUPQ_20 ET_HHTYPE_20 EP_GROUPQ_20 EPL_GROUPQ_20 F_GROUPQ_20 SPL_THEME1_20 RPL_THEME1_20 F_THEME1_20 SPL_THEME2_20 RPL_THEME2_20 F_THEME2_20 SPL_THEME3_20 RPL_THEME3_20 F_THEME3_20 SPL_THEME4_20 RPL_THEME4_20 F_THEME4_20 SPL_THEMES_20 RPL_THEMES_20 F_TOTAL_20 pre10_lihtc_project_cnt pre10_lihtc_project_dollars post10_lihtc_project_cnt post10_lihtc_project_dollars lihtc_flag lihtc_eligibility
01005950700 01 005 950700 AL Alabama Barbour County 3 South Region 6 East South Central Division 1753 687 563 615 1628 37.77641 0.8088 1 17 667 2.548726 0.06941 0 41 376 10.90426 0.01945 0 62 187 33.15508 0.2464 0 103 563 18.29485 0.04875 0 264 1208 21.85430 0.7570 1 201 1527 13.163065 0.4991 0 368 20.992584 0.89510 1 462 26.354820 0.66130 0 211 1085 19.44700 0.7505 1 107 399 26.81704 0.8048 1 0 1628 0.000000 0.09298 0 861 1753 49.11580 0.7101 0 687 17 2.474527 0.4324 0 38 5.5312955 0.6970 0 3 563 0.5328597 0.3037 0 19 563 3.374778 0.3529 0 233 1753 13.29150 0.9517 1 2.18306 0.4137 2 3.20468 0.8377 3 0.7101 0.7035 0 2.7377 0.6100 1 8.83554 0.6264 6 1527 691 595 565 1365 41.39194 0.8765 1 37 572 6.468532 0.6776 0 70 376 18.617021 0.38590 0 92 219 42.00913 0.4736 0 162 595 27.22689 0.4454 0 280 1114 25.13465 0.8942 1 105 1378 7.619739 0.5505 0 383 25.081860 0.88450 1 337 22.069417 0.51380 0 237 1041.0000 22.76657 0.8360 1 144 413.0000 34.86683 0.9114 1 11 1466 0.7503411 0.40700 0 711 1527.0000 46.56189 0.6441 0 691 13 1.881331 0.3740 0 37 5.3545586 0.7152 0 0 595 0.0000000 0.09796 0 115 595.0000 19.327731 0.8859 1 149 1527 9.757695 0.9470 1 3.4442 0.7707 2 3.55270 0.9403 3 0.6441 0.6387 0 3.02006 0.7337 2 10.66106 0.8537 7 0 0 0 0 0 Yes
01011952100 01 011 952100 AL Alabama Bullock County 3 South Region 6 East South Central Division 1652 796 554 564 1652 34.14044 0.7613 1 46 816 5.637255 0.33630 0 96 458 20.96070 0.19930 0 62 96 64.58333 0.8917 1 158 554 28.51986 0.29220 0 271 1076 25.18587 0.8163 1 155 1663 9.320505 0.3183 0 199 12.046005 0.47180 0 420 25.423729 0.60240 0 327 1279 25.56685 0.9151 1 137 375 36.53333 0.9108 1 0 1590 0.000000 0.09298 0 1428 1652 86.44068 0.8939 1 796 0 0.000000 0.1224 0 384 48.2412060 0.9897 1 19 554 3.4296029 0.7145 0 45 554 8.122744 0.6556 0 0 1652 0.00000 0.3640 0 2.52440 0.5138 2 2.99308 0.7515 2 0.8939 0.8856 1 2.8462 0.6637 1 9.25758 0.6790 6 1382 748 549 742 1382 53.69030 0.9560 1 40 511 7.827789 0.7730 1 110 402 27.363184 0.71780 0 45 147 30.61224 0.2307 0 155 549 28.23315 0.4773 0 181 905 20.00000 0.8253 1 232 1382 16.787265 0.8813 1 164 11.866860 0.27170 0 250 18.089725 0.26290 0 258 1132.0000 22.79152 0.8368 1 99 279.0000 35.48387 0.9162 1 33 1275 2.5882353 0.64520 0 1347 1382.0000 97.46744 0.9681 1 748 0 0.000000 0.1079 0 375 50.1336898 0.9922 1 0 549 0.0000000 0.09796 0 37 549.0000 6.739526 0.6039 0 0 1382 0.000000 0.1831 0 3.9129 0.8785 4 2.93280 0.7342 2 0.9681 0.9599 1 1.98506 0.2471 1 9.79886 0.7570 8 0 0 0 0 0 Yes
01015000300 01 015 000300 AL Alabama Calhoun County 3 South Region 6 East South Central Division 3074 1635 1330 1904 3067 62.08021 0.9710 1 293 1362 21.512482 0.96630 1 180 513 35.08772 0.65450 0 383 817 46.87882 0.5504 0 563 1330 42.33083 0.70280 0 720 2127 33.85049 0.9148 1 628 2835 22.151675 0.8076 1 380 12.361744 0.49340 0 713 23.194535 0.45030 0 647 2111 30.64898 0.9708 1 298 773 38.55110 0.9247 1 0 2878 0.000000 0.09298 0 2623 3074 85.32856 0.8883 1 1635 148 9.051988 0.6465 0 6 0.3669725 0.4502 0 68 1330 5.1127820 0.8082 1 303 1330 22.781955 0.9029 1 0 3074 0.00000 0.3640 0 4.36250 0.9430 4 2.93218 0.7233 2 0.8883 0.8800 1 3.1718 0.8070 2 11.35478 0.9009 9 2390 1702 1282 1287 2390 53.84937 0.9566 1 102 1066 9.568480 0.8541 1 158 609 25.944171 0.67520 0 286 673 42.49629 0.4856 0 444 1282 34.63339 0.6634 0 467 1685 27.71513 0.9180 1 369 2379 15.510719 0.8562 1 342 14.309623 0.40850 0 548 22.928870 0.57100 0 647 1831.0000 35.33588 0.9862 1 202 576.0000 35.06944 0.9130 1 16 2134 0.7497657 0.40690 0 1896 2390.0000 79.33054 0.8451 1 1702 96 5.640423 0.5329 0 0 0.0000000 0.2186 0 0 1282 0.0000000 0.09796 0 186 1282.0000 14.508580 0.8308 1 43 2390 1.799163 0.7727 1 4.2483 0.9395 4 3.28560 0.8773 2 0.8451 0.8379 1 2.45296 0.4602 2 10.83196 0.8718 9 0 0 0 0 0 Yes
01015000500 01 015 000500 AL Alabama Calhoun County 3 South Region 6 East South Central Division 1731 1175 743 1042 1619 64.36072 0.9767 1 124 472 26.271186 0.98460 1 136 461 29.50108 0.48970 0 163 282 57.80142 0.7919 1 299 743 40.24226 0.64910 0 340 1270 26.77165 0.8389 1 460 1794 25.641026 0.8722 1 271 15.655690 0.70190 0 368 21.259388 0.32190 0 507 1449 34.98965 0.9885 1 150 386 38.86010 0.9269 1 0 1677 0.000000 0.09298 0 1559 1731 90.06355 0.9123 1 1175 50 4.255319 0.5128 0 4 0.3404255 0.4480 0 0 743 0.0000000 0.1238 0 122 743 16.419919 0.8473 1 0 1731 0.00000 0.3640 0 4.32150 0.9362 4 3.03218 0.7679 2 0.9123 0.9038 1 2.2959 0.3818 1 10.56188 0.8244 8 940 907 488 586 940 62.34043 0.9815 1 59 297 19.865320 0.9833 1 100 330 30.303030 0.79220 1 58 158 36.70886 0.3497 0 158 488 32.37705 0.6020 0 199 795 25.03145 0.8930 1 118 940 12.553192 0.7770 1 246 26.170213 0.90530 1 118 12.553192 0.08233 0 383 822.5089 46.56484 0.9984 1 30 197.8892 15.16000 0.5363 0 0 889 0.0000000 0.09479 0 898 940.3866 95.49264 0.9489 1 907 0 0.000000 0.1079 0 2 0.2205072 0.4456 0 2 488 0.4098361 0.23670 0 146 487.6463 29.939736 0.9404 1 0 940 0.000000 0.1831 0 4.2368 0.9379 4 2.61712 0.5593 2 0.9489 0.9409 1 1.91370 0.2196 1 9.71652 0.7468 8 0 0 0 0 0 Yes
01015000600 01 015 000600 AL Alabama Calhoun County 3 South Region 6 East South Central Division 2571 992 796 1394 2133 65.35396 0.9789 1 263 905 29.060773 0.98990 1 121 306 39.54248 0.75940 1 209 490 42.65306 0.4481 0 330 796 41.45729 0.68030 0 641 1556 41.19537 0.9554 1 416 1760 23.636364 0.8383 1 220 8.556982 0.24910 0 584 22.714897 0.41610 0 539 1353 39.83740 0.9955 1 243 466 52.14592 0.9783 1 30 2366 1.267963 0.48990 0 1944 2571 75.61260 0.8440 1 992 164 16.532258 0.7673 1 8 0.8064516 0.5110 0 46 796 5.7788945 0.8329 1 184 796 23.115578 0.9049 1 614 2571 23.88176 0.9734 1 4.44280 0.9548 4 3.12890 0.8088 2 0.8440 0.8362 1 3.9895 0.9792 4 12.40520 0.9696 11 1950 964 719 837 1621 51.63479 0.9467 1 157 652 24.079755 0.9922 1 22 364 6.043956 0.01547 0 129 355 36.33803 0.3420 0 151 719 21.00139 0.2303 0 363 1387 26.17159 0.9048 1 351 1613 21.760694 0.9435 1 249 12.769231 0.32090 0 356 18.256410 0.27140 0 332 1259.7041 26.35540 0.9135 1 136 435.6156 31.22018 0.8775 1 0 1891 0.0000000 0.09479 0 1463 1949.9821 75.02633 0.8219 1 964 14 1.452282 0.3459 0 8 0.8298755 0.5269 0 19 719 2.6425591 0.61120 0 197 719.0542 27.397100 0.9316 1 329 1950 16.871795 0.9655 1 4.0175 0.9001 4 2.47809 0.4764 2 0.8219 0.8149 1 3.38110 0.8712 2 10.69859 0.8583 9 0 0 0 0 0 Yes
01015002101 01 015 002101 AL Alabama Calhoun County 3 South Region 6 East South Central Division 3872 1454 1207 1729 2356 73.38710 0.9916 1 489 2020 24.207921 0.97860 1 20 168 11.90476 0.02541 0 718 1039 69.10491 0.9332 1 738 1207 61.14333 0.96900 1 113 725 15.58621 0.6035 0 664 3943 16.839970 0.6495 0 167 4.313016 0.05978 0 238 6.146694 0.02255 0 264 2359 11.19118 0.3027 0 94 263 35.74144 0.9050 1 46 3769 1.220483 0.48250 0 1601 3872 41.34814 0.6572 0 1454 761 52.338377 0.9504 1 65 4.4704264 0.6738 0 5 1207 0.4142502 0.2791 0 113 1207 9.362055 0.7004 0 1516 3872 39.15289 0.9860 1 4.19220 0.9133 3 1.77253 0.1304 1 0.6572 0.6511 0 3.5897 0.9337 2 10.21163 0.7885 6 3238 1459 1014 1082 1836 58.93246 0.9735 1 251 1403 17.890235 0.9767 1 31 155 20.000000 0.44920 0 515 859 59.95343 0.8554 1 546 1014 53.84615 0.9535 1 134 916 14.62882 0.7033 0 251 3238 7.751699 0.5588 0 167 5.157505 0.03597 0 169 5.219271 0.02111 0 323 1667.0000 19.37612 0.7205 0 94 277.0000 33.93502 0.9040 1 0 3164 0.0000000 0.09479 0 1045 3238.0000 32.27301 0.5125 0 1459 607 41.603838 0.9185 1 65 4.4551062 0.6949 0 24 1014 2.3668639 0.57900 0 85 1014.0000 8.382643 0.6775 0 1402 3238 43.298332 0.9876 1 4.1658 0.9263 3 1.77637 0.1225 1 0.5125 0.5082 0 3.85750 0.9661 2 10.31217 0.8160 6 0 0 0 0 0 Yes

Housing Price Index Data

We can download our housing price index data set and wrangle it to keep 2010 and 2020 data:

Code
hpi_df <- read.csv("https://r-class.github.io/paf-515-course-materials/data/raw/HPI/HPI_AT_BDL_tract.csv")
Code
hpi_df_10_20 <- hpi_df %>% 
  mutate(GEOID10 = str_pad(tract, 11, "left", pad=0)) %>% 
  filter(year %in% c(2010, 2020))  %>%
 select(GEOID10, state_abbr, year, hpi) %>%
  pivot_wider(names_from = year, values_from = hpi) %>%
  mutate(housing_price_index10 = `2010`,
         housing_price_index20 = `2020`) %>%
  select(GEOID10, state_abbr, housing_price_index10, housing_price_index20)

# View data
hpi_df_10_20 %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID10 state_abbr housing_price_index10 housing_price_index20
01001020100 AL 132.35 152.78
01001020200 AL 123.78 123.37
01001020300 AL 158.57 167.01
01001020400 AL 165.11 179.60
01001020501 AL 172.55 180.96
01001020502 AL 158.75 164.25
Code
# Drop state_abbr column for joining
hpi_df_10_20 <- hpi_df_10_20 %>% select(-state_abbr)

CBSA Crosswalk

In this lab we will be examining our tract-level data to determine whether the NMTC and LIHTC programs had an impact on our measures of Social Vulnerability or economic conditions.

However, since tracts are relatively small units of geographic that can be impacted by broader city-level trends, we will identify the overarching Core Based Statistical Areas that contain these tracts so that we can control for variance in city-level trends.

The US Census Bureau Explains:

The general concept of a metropolitan or micropolitan statistical area is that of a core area containing a substantial population nucleus, together with adjacent communities having a high degree of economic and social integration with that core. … Each metropolitan statistical area must have at least one urban area of 50,000 or more inhabitants. Each micropolitan statistical area must have at least one urban area of at least 10,000 but less than 50,000 population.

Under the standards, the county (or counties) in which at least 50 percent of the population resides within urban areas of 10,000 or more population, or that contain at least 5,000 people residing within a single urban area of 10,000 or more population, is identified as a “central county” (counties). Additional “outlying counties” are included in the CBSA if they meet specified requirements of commuting to or from the central counties. Counties or equivalent entities form the geographic “building blocks” for metropolitan and micropolitan statistical areas throughout the United States and Puerto Rico.

Source: US Census Bureau

Code
msa_csa_crosswalk <- rio::import("https://r-class.github.io/paf-515-course-materials/data/raw/CSA_MSA_Crosswalk/qcew-county-msa-csa-crosswalk.xlsx", which=4)

msa_csa_crosswalk <- msa_csa_crosswalk %>% 
  mutate(county_fips = str_pad(`County Code`, 5, "left", pad=0),
         cbsa = coalesce(`CSA Title`, `MSA Title`),
         cbsa_code = coalesce(`CSA Code`, `MSA Code`),
         county_title = `County Title`)  %>% 
  select(county_fips, county_title, cbsa, cbsa_code)

msa_csa_crosswalk %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
county_fips county_title cbsa cbsa_code
01001 Autauga County, Alabama Montgomery-Alexander City, AL CSA CS388
01003 Baldwin County, Alabama Mobile-Daphne-Fairhope, AL CSA CS380
01005 Barbour County, Alabama Eufaula, AL-GA MicroSA C2164
01007 Bibb County, Alabama Birmingham-Hoover-Cullman, AL CSA CS142
01009 Blount County, Alabama Birmingham-Hoover-Cullman, AL CSA CS142
01015 Calhoun County, Alabama Anniston-Oxford, AL MSA C1150

TidyCensus API Pull

Now that we have our SVI, housing price index, and CBSA metro data sets loaded, we need to pull in additional variables to find the Median Income and Median Home Value for our census tracts of interest.

If you recall from Lab 02, to build our SVI dataset, we pulled data from the 2010 American Community Survey 5-year (ACS5) estimate data (with 2012 ACS5 to supplement for Health Insurance and Disability Status data) and 2020 American Community Survey 5-year estimate data.

Since our 2020 data was assigned to different statistical boundaries based on the 2020 census than the 2010 statistical boundaries https://www.census.gov/programs-surveys/acs/geography-acs/geography-boundaries-by-year.2020.html#list-tab-626530102, we used the NHGIS Crosswalk’s population and housing weights https://www.nhgis.org/geographic-crosswalks to assign census block group data for 2020 to the 2010 statistical boundaries to allow for equitable comparison across time periods.

While this methodology works well for population and housing estimates, the grouped nature of Median Income and Median Home Values makes the process of cross-walking these variables more complicated. Therefore, for the purposes of our project, we will use 2010 ACS5 and 2019 ACS5 Median Income and Median Home Value data since the 2019 ACS5 used the 2010 statistical boundaries.

We will need to make a few adjustments to our 2019 dataset to account for minor errata in the 2010 Census Data that were fixed by the Census Bureau in subsequent releases https://www.census.gov/programs-surveys/geography/technical-documentation/user-note/2010-census-geography.html. Specifically, since the 2010 ACS5 data still has these errors we will need to undo the fixes to make our 2019 data exactly match the 2010 data. The technical documentation notes provide guidance on these adjustments.

Load and Search Variables

Before we begin our TidyCensus API pull, we first need to identify what variables we want to pull. We can use the package’s built in tidycensus::load_variables() function to view all of our variables. Documentation on this function is available on the website of the package creator, Kyle Walker: https://walker-data.com/tidycensus/articles/basic-usage.html#searching-for-variables.

We can also use a more general Census variable directory website to find variables of interest. Check out the following resources for median home value B25077:

2010

Code
acs_variables10 <- load_variables(2010, "acs5", cache = TRUE)
acs_variables10 %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
name label concept
B00001_001 Estimate!!Total UNWEIGHTED SAMPLE COUNT OF THE POPULATION
B00002_001 Estimate!!Total UNWEIGHTED SAMPLE HOUSING UNITS
B01001_001 Estimate!!Total SEX BY AGE
B01001_002 Estimate!!Total!!Male SEX BY AGE
B01001_003 Estimate!!Total!!Male!!Under 5 years SEX BY AGE
B01001_004 Estimate!!Total!!Male!!5 to 9 years SEX BY AGE

When using data from the load_variables() function, we can search for keywords by using grepl() to filter through the label or concept columns:

Code
acs_variables10 %>% filter(grepl('median income', concept, ignore.case = TRUE)) %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
name label concept
B06011_001 Estimate!!Median income in the past 12 months!!Total MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES
B06011_002 Estimate!!Median income in the past 12 months!!Total!!Born in state of residence MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES
B06011_003 Estimate!!Median income in the past 12 months!!Total!!Born in other state of the United States MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES
B06011_004 Estimate!!Median income in the past 12 months!!Total!!Native; born outside the United States MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES
B06011_005 Estimate!!Median income in the past 12 months!!Total!!Foreign born MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES
B06011PR_001 Estimate!!Median income in the past 12 months!!Total MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO
B06011PR_002 Estimate!!Median income in the past 12 months!!Total!!Born in Puerto Rico MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO
B06011PR_003 Estimate!!Median income in the past 12 months!!Total!!Born in other state of the United States MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO
B06011PR_004 Estimate!!Median income in the past 12 months!!Total!!Native; born elsewhere MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO
B06011PR_005 Estimate!!Median income in the past 12 months!!Total!!Foreign born MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2010 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO

In addition, if we have already found our table of interest using one of the variable explorer tools above, we can check that it’s available in our survey data by searching the name column:

Code
acs_variables10 %>% filter(grepl('B25077', name, ignore.case = TRUE)) 
# A tibble: 1 × 3
  name       label                            concept               
  <chr>      <chr>                            <chr>                 
1 B25077_001 Estimate!!Median value (dollars) MEDIAN VALUE (DOLLARS)

2019

We can then repeat the same steps for 2019:

Code
acs_variables19 <- load_variables(2019, "acs5", cache = TRUE)
acs_variables19 %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
name label concept geography
B01001A_001 Estimate!!Total: SEX BY AGE (WHITE ALONE) tract
B01001A_002 Estimate!!Total:!!Male: SEX BY AGE (WHITE ALONE) tract
B01001A_003 Estimate!!Total:!!Male:!!Under 5 years SEX BY AGE (WHITE ALONE) tract
B01001A_004 Estimate!!Total:!!Male:!!5 to 9 years SEX BY AGE (WHITE ALONE) tract
B01001A_005 Estimate!!Total:!!Male:!!10 to 14 years SEX BY AGE (WHITE ALONE) tract
B01001A_006 Estimate!!Total:!!Male:!!15 to 17 years SEX BY AGE (WHITE ALONE) tract
Code
acs_variables19 %>% filter(grepl('median income', concept, ignore.case = TRUE)) %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
name label concept geography
B06011PR_001 Estimate!!Median income in the past 12 months --!!Total: MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO NA
B06011PR_002 Estimate!!Median income in the past 12 months --!!Total:!!Born in Puerto Rico MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO NA
B06011PR_003 Estimate!!Median income in the past 12 months --!!Total:!!Born in other state of the United States MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO NA
B06011PR_004 Estimate!!Median income in the past 12 months --!!Total:!!Native; born elsewhere MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO NA
B06011PR_005 Estimate!!Median income in the past 12 months --!!Total:!!Foreign born MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN PUERTO RICO NA
B06011_001 Estimate!!Median income in the past 12 months --!!Total: MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES tract
B06011_002 Estimate!!Median income in the past 12 months --!!Total:!!Born in state of residence MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES tract
B06011_003 Estimate!!Median income in the past 12 months --!!Total:!!Born in other state of the United States MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES tract
B06011_004 Estimate!!Median income in the past 12 months --!!Total:!!Native; born outside the United States MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES tract
B06011_005 Estimate!!Median income in the past 12 months --!!Total:!!Foreign born MEDIAN INCOME IN THE PAST 12 MONTHS (IN 2019 INFLATION-ADJUSTED DOLLARS) BY PLACE OF BIRTH IN THE UNITED STATES tract
Code
acs_variables19 %>% filter(grepl('B25077', name, ignore.case = TRUE)) 
# A tibble: 1 × 4
  name       label                            concept                geography  
  <chr>      <chr>                            <chr>                  <chr>      
1 B25077_001 Estimate!!Median value (dollars) MEDIAN VALUE (DOLLARS) block group

Data Pull

Now that we have our data of interest identified, we can create a function to pull our data from the Census API using the tidycensus package:

Code
# TidyCensus pull
census_pull<- function(st, yr) {
df <- tibble(GEOID = "", NAME = "", variable = "", estimate = double(), moe = double())

pull <- get_acs(geography = "tract", 
              variables = c(
                            # Median Income
                            Median_Income = "B06011_001",
                            # Median Home Value
                            Median_Home_Value = "B25077_001"
                            ), 
              survey = "acs5",
              state = st, 
              year = yr)
df <- bind_rows(df, pull)
 }

Create list of states

Since we will need data for all of our states to complete a national analysis, we first need to create a list of all abbreviations:

Code
states <- list(svi_national_nmtc$state %>% unique())
states 
[[1]]
 [1] "AL" "AK" "AZ" "AR" "CA" "CO" "CT" "DE" "DC" "FL" "GA" "HI" "ID" "IL" "IN"
[16] "IA" "KS" "KY" "LA" "ME" "MD" "MA" "MI" "MN" "MS" "MO" "MT" "NE" "NV" "NH"
[31] "NJ" "NM" "NY" "NC" "ND" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT"
[46] "VT" "VA" "WA" "WV" "WI" "WY"

Pull Median Home Values and Median Income for 2010

Now we can loop over our list and use our function to pull the data:

Note

Note that since we are pulling data for all 50 states and DC, the census pull code chunks may take a few minutes to run. If you have difficulties completing the census pulls, you can download them directly from 2010 Census Download Link and 2019 Census Download Link and place them in your data/raw/Census_Data_SVI folder.

You can then load your data with the following code instead of completing the API query:

load(here::here("data/raw/Census_Data_SVI/lab_05_census_pull10_df.rds"))

load(here::here("data/raw/Census_Data_SVI/lab_05_census_pull19_df.rds"))

Code
census_pull10 <- lapply(states, census_pull, yr = 2010)
Code
census_pull10_df <- census_pull10[[1]] %>%  
  # Drop margin of error column
  select(-moe) %>%
  # Add suffix to variable names
  mutate(variable = paste0(variable, "_10")) %>%
  # Pivot data frame
  pivot_wider(
    names_from = variable,
    values_from = c(estimate)
  )

census_pull10_df %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID NAME Median_Income_10 Median_Home_Value_10
01001020100 Census Tract 201, Autauga County, Alabama 31769 120700
01001020200 Census Tract 202, Autauga County, Alabama 19437 138500
01001020300 Census Tract 203, Autauga County, Alabama 24146 111300
01001020400 Census Tract 204, Autauga County, Alabama 27735 126300
01001020500 Census Tract 205, Autauga County, Alabama 35517 173000
01001020600 Census Tract 206, Autauga County, Alabama 24597 110700
01001020700 Census Tract 207, Autauga County, Alabama 22114 93800
01001020801 Census Tract 208.01, Autauga County, Alabama 30841 258000
01001020802 Census Tract 208.02, Autauga County, Alabama 29006 145100
01001020900 Census Tract 209, Autauga County, Alabama 24841 108000

Pull Median Home Values and Median Income for 2019

We can repeat the steps from above for 2019:

Code
census_pull19 <- lapply(states, census_pull, yr = 2019)

Now for 2019 to adjust for the census errata, we need to process our data a bit further and undo the fixes for our census tract names to match the errors in the 2010 data since we are using 2010 census tracts:

Code
census_pull19_df <- census_pull19[[1]] %>% 
  # Select columns
  select(GEOID, NAME, variable, estimate, moe) %>% 
  # Create individual FIPS columns for state, county, and tract
  mutate(FIPS_st = substr(GEOID, 1, 2),
         FIPS_county = substr(GEOID, 3, 5),
         FIPS_tract = substr(GEOID, 6, 11)) %>%
# Los Angeles, CA Census Tract fixes
                      mutate(FIPS_tract2 = if_else((FIPS_county == "037" & FIPS_st == "06" & FIPS_tract == "137000"), "930401", FIPS_tract )) %>%
# Pima County, AZ Census Tract fixes
                      mutate(FIPS_tract2 = if_else((FIPS_county == "019" & FIPS_st == "04" & FIPS_tract == "002704"), "002701", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "019" & FIPS_st == "04" & FIPS_tract == "002906"), "002903", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "019" & FIPS_st == "04" & FIPS_tract == "004118"), "410501", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "019" & FIPS_st == "04" & FIPS_tract == "004121"), "410502", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "019" & FIPS_st == "04" & FIPS_tract == "004125"), "410503", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "019" & FIPS_st == "04" & FIPS_tract == "005200"), "470400", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "019" & FIPS_st == "04" & FIPS_tract == "005300"), "470500", FIPS_tract2 )) %>%
# Madison County, NY Census Tract fixes
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030101"), "940101", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030102"), "940102", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030103"), "940103", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030200"), "940200", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030300"), "940300", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030401"), "940401", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030403"), "940403", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030600"), "940600", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "053" & FIPS_st == "36" & FIPS_tract == "030402"), "940700", FIPS_tract2 )) %>%
# Oneida County, NY Census Tract fixes
                      mutate(FIPS_tract2 = if_else((FIPS_county == "065" & FIPS_st == "36" & FIPS_tract == "024800"), "940000", FIPS_tract2 )) %>% 
                      mutate(FIPS_tract2 = if_else((FIPS_county == "065" & FIPS_st == "36" & FIPS_tract == "024700"), "940100", FIPS_tract2 )) %>%
                      mutate(FIPS_tract2 = if_else((FIPS_county == "065" & FIPS_st == "36" & FIPS_tract == "024900"), "940200", FIPS_tract2 )) %>%  
                      # Move columns in data set
                      relocate(c(FIPS_st, FIPS_county, FIPS_tract, FIPS_tract2),.after = GEOID) %>%
                      # Create new GEOID column
                      mutate(GEOID = paste0(FIPS_st, FIPS_county, FIPS_tract2)) %>% 
                      # Drop newly created FIPS columns and margin of error
                      select(-FIPS_st, -FIPS_county, -FIPS_tract, -FIPS_tract2, -moe) %>% 
                      # Add suffix
                      mutate(variable = paste0(variable, "_19")) %>%
                      # Pivot data set
                      pivot_wider(
                        names_from = variable,
                        values_from = c(estimate)
                      ) 

census_pull19_df %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID NAME Median_Income_19 Median_Home_Value_19
01001020100 Census Tract 201, Autauga County, Alabama 25970 136100
01001020200 Census Tract 202, Autauga County, Alabama 20154 90500
01001020300 Census Tract 203, Autauga County, Alabama 27383 122600
01001020400 Census Tract 204, Autauga County, Alabama 34620 152700
01001020500 Census Tract 205, Autauga County, Alabama 41178 186900
01001020600 Census Tract 206, Autauga County, Alabama 21146 103600
01001020700 Census Tract 207, Autauga County, Alabama 20934 82400
01001020801 Census Tract 208.01, Autauga County, Alabama 31667 322900
01001020802 Census Tract 208.02, Autauga County, Alabama 33086 171500
01001020900 Census Tract 209, Autauga County, Alabama 32677 156900

Join data sets

Now that our data is downloaded and wrangled, we can combine our data sets. Before we do this, you may have noticed in our variable definitions that the Median Income values are inflation-adjusted. Since home prices are also subject to inflation, we need to adjust our 2010 data to match 2019 dollars. To accomplish this, we can utilize an inflation calculator to find the correct multiple for our 2010 to 2019 match.

Inflation calculator

There are several inflation calculators available including one from the Bureau of Labor Statistics https://www.bls.gov/data/inflation_calculator.htm.

Using the BLS’ inflation calculator, we can enter $1 in 2010 to see what it would be worth in 2019 and find that it would increase to $1.16. Thus, we can multiply our 2010 US dollars by 1.16 to make them equivalent to the 2019 numbers.

We can then assign this number to a variable and adjust our data accordingly:

Code
inflation_adj = 1.16
Code
# Join 2010 and 2019 Median Income and Home Value Data
census_pull_df <- left_join(census_pull10_df, census_pull19_df[c("GEOID", "Median_Income_19", "Median_Home_Value_19")], join_by("GEOID" == "GEOID"))

# Create new inflation adjusted columns for 2010 median income and median home value, find changes over time
census_pull_df <- census_pull_df %>% 
                   mutate(Median_Income_10adj = Median_Income_10*inflation_adj,
                          Median_Home_Value_10adj = Median_Home_Value_10*inflation_adj,
                          Median_Income_Change = Median_Income_19 - Median_Income_10adj,
                          Median_Income_Change_pct = (Median_Income_19 - Median_Income_10adj)/Median_Income_10adj,
                          Median_Home_Value_Change = Median_Home_Value_19 - Median_Home_Value_10adj,
                          Median_Home_Value_Change_pct = (Median_Home_Value_19 - Median_Home_Value_10adj)/Median_Home_Value_10adj)

# View data
census_pull_df %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID NAME Median_Income_10 Median_Home_Value_10 Median_Income_19 Median_Home_Value_19 Median_Income_10adj Median_Home_Value_10adj Median_Income_Change Median_Income_Change_pct Median_Home_Value_Change Median_Home_Value_Change_pct
01001020100 Census Tract 201, Autauga County, Alabama 31769 120700 25970 136100 36852.04 140012 -10882.04 -0.2952900 -3912 -0.0279405
01001020200 Census Tract 202, Autauga County, Alabama 19437 138500 20154 90500 22546.92 160660 -2392.92 -0.1061307 -70160 -0.4366986
01001020300 Census Tract 203, Autauga County, Alabama 24146 111300 27383 122600 28009.36 129108 -626.36 -0.0223625 -6508 -0.0504074
01001020400 Census Tract 204, Autauga County, Alabama 27735 126300 34620 152700 32172.60 146508 2447.40 0.0760709 6192 0.0422639
01001020500 Census Tract 205, Autauga County, Alabama 35517 173000 41178 186900 41199.72 200680 -21.72 -0.0005272 -13780 -0.0686665
01001020600 Census Tract 206, Autauga County, Alabama 24597 110700 21146 103600 28532.52 128412 -7386.52 -0.2588807 -24812 -0.1932218
01001020700 Census Tract 207, Autauga County, Alabama 22114 93800 20934 82400 25652.24 108808 -4718.24 -0.1839309 -26408 -0.2427027
01001020801 Census Tract 208.01, Autauga County, Alabama 30841 258000 31667 322900 35775.56 299280 -4108.56 -0.1148426 23620 0.0789227
01001020802 Census Tract 208.02, Autauga County, Alabama 29006 145100 33086 171500 33646.96 168316 -560.96 -0.0166719 3184 0.0189168
01001020900 Census Tract 209, Autauga County, Alabama 24841 108000 32677 156900 28815.56 125280 3861.44 0.1340054 31620 0.2523946

Create NMTC data sets

Join SVI data for NMTC with Median Income, Median Home Value, and Housing Price Index data:

Code
svi_divisional_nmtc_df0 <- left_join(svi_divisional_nmtc, census_pull_df, join_by("GEOID_2010_trt" == "GEOID"))

svi_divisional_nmtc_df1 <- left_join(svi_divisional_nmtc_df0, hpi_df_10_20, join_by("GEOID_2010_trt" == "GEOID10")) %>%
                          unite("county_fips", FIPS_st, FIPS_county, sep = "") 

svi_divisional_nmtc_df <- left_join(svi_divisional_nmtc_df1, msa_csa_crosswalk, join_by("county_fips" == "county_fips"))

svi_divisional_nmtc_df %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt county_fips FIPS_tract state state_name county region_number region division_number division E_TOTPOP_10 E_HU_10 E_HH_10 E_POV150_10 ET_POVSTATUS_10 EP_POV150_10 EPL_POV150_10 F_POV150_10 E_UNEMP_10 ET_EMPSTATUS_10 EP_UNEMP_10 EPL_UNEMP_10 F_UNEMP_10 E_HBURD_OWN_10 ET_HOUSINGCOST_OWN_10 EP_HBURD_OWN_10 EPL_HBURD_OWN_10 F_HBURD_OWN_10 E_HBURD_RENT_10 ET_HOUSINGCOST_RENT_10 EP_HBURD_RENT_10 EPL_HBURD_RENT_10 F_HBURD_RENT_10 E_HBURD_10 ET_HOUSINGCOST_10 EP_HBURD_10 EPL_HBURD_10 F_HBURD_10 E_NOHSDP_10 ET_EDSTATUS_10 EP_NOHSDP_10 EPL_NOHSDP_10 F_NOHSDP_10 E_UNINSUR_12 ET_INSURSTATUS_12 EP_UNINSUR_12 EPL_UNINSUR_12 F_UNINSUR_12 E_AGE65_10 EP_AGE65_10 EPL_AGE65_10 F_AGE65_10 E_AGE17_10 EP_AGE17_10 EPL_AGE17_10 F_AGE17_10 E_DISABL_12 ET_DISABLSTATUS_12 EP_DISABL_12 EPL_DISABL_12 F_DISABL_12 E_SNGPNT_10 ET_FAMILIES_10 EP_SNGPNT_10 EPL_SNGPNT_10 F_SNGPNT_10 E_LIMENG_10 ET_POPAGE5UP_10 EP_LIMENG_10 EPL_LIMENG_10 F_LIMENG_10 E_MINRTY_10 ET_POPETHRACE_10 EP_MINRTY_10 EPL_MINRTY_10 F_MINRTY_10 E_STRHU_10 E_MUNIT_10 EP_MUNIT_10 EPL_MUNIT_10 F_MUNIT_10 E_MOBILE_10 EP_MOBILE_10 EPL_MOBILE_10 F_MOBILE_10 E_CROWD_10 ET_OCCUPANTS_10 EP_CROWD_10 EPL_CROWD_10 F_CROWD_10 E_NOVEH_10 ET_KNOWNVEH_10 EP_NOVEH_10 EPL_NOVEH_10 F_NOVEH_10 E_GROUPQ_10 ET_HHTYPE_10 EP_GROUPQ_10 EPL_GROUPQ_10 F_GROUPQ_10 SPL_THEME1_10 RPL_THEME1_10 F_THEME1_10 SPL_THEME2_10 RPL_THEME2_10 F_THEME2_10 SPL_THEME3_10 RPL_THEME3_10 F_THEME3_10 SPL_THEME4_10 RPL_THEME4_10 F_THEME4_10 SPL_THEMES_10 RPL_THEMES_10 F_TOTAL_10 E_TOTPOP_20 E_HU_20 E_HH_20 E_POV150_20 ET_POVSTATUS_20 EP_POV150_20 EPL_POV150_20 F_POV150_20 E_UNEMP_20 ET_EMPSTATUS_20 EP_UNEMP_20 EPL_UNEMP_20 F_UNEMP_20 E_HBURD_OWN_20 ET_HOUSINGCOST_OWN_20 EP_HBURD_OWN_20 EPL_HBURD_OWN_20 F_HBURD_OWN_20 E_HBURD_RENT_20 ET_HOUSINGCOST_RENT_20 EP_HBURD_RENT_20 EPL_HBURD_RENT_20 F_HBURD_RENT_20 E_HBURD_20 ET_HOUSINGCOST_20 EP_HBURD_20 EPL_HBURD_20 F_HBURD_20 E_NOHSDP_20 ET_EDSTATUS_20 EP_NOHSDP_20 EPL_NOHSDP_20 F_NOHSDP_20 E_UNINSUR_20 ET_INSURSTATUS_20 EP_UNINSUR_20 EPL_UNINSUR_20 F_UNINSUR_20 E_AGE65_20 EP_AGE65_20 EPL_AGE65_20 F_AGE65_20 E_AGE17_20 EP_AGE17_20 EPL_AGE17_20 F_AGE17_20 E_DISABL_20 ET_DISABLSTATUS_20 EP_DISABL_20 EPL_DISABL_20 F_DISABL_20 E_SNGPNT_20 ET_FAMILIES_20 EP_SNGPNT_20 EPL_SNGPNT_20 F_SNGPNT_20 E_LIMENG_20 ET_POPAGE5UP_20 EP_LIMENG_20 EPL_LIMENG_20 F_LIMENG_20 E_MINRTY_20 ET_POPETHRACE_20 EP_MINRTY_20 EPL_MINRTY_20 F_MINRTY_20 E_STRHU_20 E_MUNIT_20 EP_MUNIT_20 EPL_MUNIT_20 F_MUNIT_20 E_MOBILE_20 EP_MOBILE_20 EPL_MOBILE_20 F_MOBILE_20 E_CROWD_20 ET_OCCUPANTS_20 EP_CROWD_20 EPL_CROWD_20 F_CROWD_20 E_NOVEH_20 ET_KNOWNVEH_20 EP_NOVEH_20 EPL_NOVEH_20 F_NOVEH_20 E_GROUPQ_20 ET_HHTYPE_20 EP_GROUPQ_20 EPL_GROUPQ_20 F_GROUPQ_20 SPL_THEME1_20 RPL_THEME1_20 F_THEME1_20 SPL_THEME2_20 RPL_THEME2_20 F_THEME2_20 SPL_THEME3_20 RPL_THEME3_20 F_THEME3_20 SPL_THEME4_20 RPL_THEME4_20 F_THEME4_20 SPL_THEMES_20 RPL_THEMES_20 F_TOTAL_20 nmtc_eligibility pre10_nmtc_project_cnt pre10_nmtc_dollars pre10_nmtc_dollars_formatted post10_nmtc_project_cnt post10_nmtc_dollars post10_nmtc_dollars_formatted nmtc_flag NAME Median_Income_10 Median_Home_Value_10 Median_Income_19 Median_Home_Value_19 Median_Income_10adj Median_Home_Value_10adj Median_Income_Change Median_Income_Change_pct Median_Home_Value_Change Median_Home_Value_Change_pct housing_price_index10 housing_price_index20 county_title cbsa cbsa_code
34001000100 34001 000100 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 2907 1088 983 1127 2907 38.76849 0.8482 1 144 1433 10.048849 0.7544 1 280 435 64.36782 0.9529 1 204 548 37.22628 0.2998 0 484 983 49.23703 0.7813 1 468 1759 26.60603 0.8634 1 532 2543 20.92017 0.8978 1 250 8.599931 0.17770 0 944 32.47334 0.94170 1 186 1851 10.04862 0.2706 0 266 678 39.233038 0.8981 1 177 2611 6.779012 0.7778 1 1928 2907 66.32267 0.7743 1 1088 113 10.386029 0.6229 0 9 0.8272059 0.7223 0 80 983 8.138352 0.8657 1 265 983 26.95829 0.7354 0 0 2907 0 0.3512 0 4.1451 0.8935 5 3.06590 0.7944 3 0.7743 0.7667 1 3.2975 0.8414 1 11.28280 0.8862 10 2157 941 784 1182 2157 54.79833 0.9571 1 242 1058 22.873346 0.9922 1 215 342 62.86550 0.9780 1 316 442 71.49321 0.9481 1 531 784 67.72959 0.9893 1 396 1274 31.083202 0.9497 1 266 2157 12.331943 0.9041 1 185 8.576727 0.09430 0 552 25.59110 0.8128 1 297 1605 18.504673 0.74880 0 83 510 16.27451 0.6090 0 251 2020 12.425743 0.87100 1 1852 2157 85.85999 0.8476 1 941 118 12.5398512 0.6385 0 0 0.00000 0.3216 0 67 784 8.545918 0.8657 1 212 784 27.04082 0.7502 1 0 2157 0.0000000 0.1517 0 4.7924 0.9850 5 3.13590 0.8217 2 0.8476 0.8400 1 2.7277 0.6085 2 11.50360 0.9104 10 Yes 0 0 $0 0 0 $0 0 Census Tract 1, Atlantic County, New Jersey 23841 227800 19425 155600 27655.56 264248 -8230.56 -0.2976096 -108648 -0.4111592 139.73 111.11 Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001000200 34001 000200 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3189 2217 1473 519 3189 16.27469 0.4806 0 109 1558 6.996149 0.5179 0 573 955 60.00000 0.9323 1 199 518 38.41699 0.3261 0 772 1473 52.41005 0.8418 1 405 2579 15.70376 0.6491 0 484 3547 13.64533 0.7154 0 847 26.560050 0.96290 1 436 13.67200 0.08181 0 608 3005 20.23295 0.8466 1 42 857 4.900817 0.1204 0 422 3072 13.736979 0.8799 1 1792 3189 56.19316 0.7390 0 2217 901 40.640505 0.8693 1 0 0.0000000 0.3251 0 48 1473 3.258656 0.7064 0 250 1473 16.97217 0.6444 0 0 3189 0 0.3512 0 3.2048 0.6963 1 2.89161 0.7231 3 0.7390 0.7317 0 2.8964 0.6887 1 9.73181 0.7340 5 3510 2046 1353 1021 3510 29.08832 0.7682 1 121 1852 6.533477 0.6717 0 343 696 49.28161 0.9273 1 416 657 63.31811 0.8696 1 759 1353 56.09756 0.9321 1 553 2338 23.652695 0.8871 1 354 3510 10.085470 0.8530 1 643 18.319088 0.60310 0 1002 28.54701 0.9055 1 450 2508 17.942584 0.72330 0 237 786 30.15267 0.8539 1 534 3375 15.822222 0.90620 1 2534 3510 72.19373 0.7818 1 2046 906 44.2815249 0.8690 1 0 0.00000 0.3216 0 119 1353 8.795270 0.8711 1 324 1353 23.94678 0.7255 0 0 3510 0.0000000 0.1517 0 4.1121 0.9003 4 3.99200 0.9781 3 0.7818 0.7747 1 2.9389 0.7011 2 11.82480 0.9310 10 Yes 0 0 $0 0 0 $0 0 Census Tract 2, Atlantic County, New Jersey 26736 320400 25729 187900 31013.76 371664 -5284.76 -0.1704005 -183764 -0.4944358 184.06 165.71 Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001000300 34001 000300 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3997 1823 1357 1401 3968 35.30746 0.8164 1 382 2238 17.068811 0.9376 1 176 329 53.49544 0.8855 1 604 1028 58.75486 0.7947 1 780 1357 57.47973 0.9165 1 920 2677 34.36683 0.9346 1 1351 4149 32.56206 0.9811 1 314 7.855892 0.14370 0 937 23.44258 0.55900 0 319 3054 10.44532 0.3000 0 187 782 23.913044 0.7498 0 1080 3671 29.419777 0.9742 1 3357 3997 83.98799 0.8419 1 1823 363 19.912233 0.7535 1 0 0.0000000 0.3251 0 150 1357 11.053795 0.9136 1 651 1357 47.97347 0.8585 1 0 3997 0 0.3512 0 4.5862 0.9691 5 2.72670 0.6360 1 0.8419 0.8336 1 3.2019 0.8054 3 11.35670 0.8920 10 3801 1640 1226 1857 3801 48.85556 0.9333 1 226 1800 12.555556 0.9267 1 111 280 39.64286 0.8339 1 608 946 64.27061 0.8842 1 719 1226 58.64600 0.9528 1 650 2275 28.571429 0.9337 1 1027 3801 27.019206 0.9914 1 380 9.997369 0.14040 0 1223 32.17574 0.9607 1 219 2578 8.494957 0.15680 0 268 909 29.48295 0.8456 1 940 3400 27.647059 0.97280 1 3318 3801 87.29282 0.8579 1 1640 262 15.9756098 0.6917 0 0 0.00000 0.3216 0 124 1226 10.114192 0.8955 1 477 1226 38.90701 0.8258 1 0 3801 0.0000000 0.1517 0 4.7379 0.9829 5 3.07630 0.8013 3 0.8579 0.8501 1 2.8863 0.6781 2 11.55840 0.9150 11 Yes 0 0 $0 0 0 $0 0 Census Tract 3, Atlantic County, New Jersey 21045 250500 19420 147300 24412.20 290580 -4992.20 -0.2044961 -143280 -0.4930828 NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001000500 34001 000500 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3483 1241 1027 1938 3483 55.64169 0.9533 1 124 1630 7.607362 0.5830 0 227 446 50.89686 0.8549 1 478 581 82.27194 0.9799 1 705 1027 68.64654 0.9863 1 733 2077 35.29129 0.9396 1 727 3258 22.31430 0.9149 1 377 10.824002 0.30810 0 1055 30.28998 0.90140 1 268 2401 11.16202 0.3549 0 209 763 27.391874 0.7940 1 911 3077 29.606760 0.9746 1 3036 3483 87.16624 0.8550 1 1241 52 4.190169 0.4505 0 4 0.3223207 0.6567 0 113 1027 11.002921 0.9128 1 422 1027 41.09056 0.8250 1 0 3483 0 0.3512 0 4.3771 0.9379 4 3.33300 0.8766 3 0.8550 0.8467 1 3.1962 0.8026 2 11.76130 0.9229 10 3385 1185 945 1682 3364 50.00000 0.9391 1 72 1577 4.565631 0.4586 0 185 468 39.52991 0.8332 1 362 477 75.89099 0.9703 1 547 945 57.88360 0.9477 1 592 1983 29.853757 0.9422 1 738 3385 21.802068 0.9817 1 240 7.090103 0.05988 0 1129 33.35303 0.9689 1 135 2256 5.984043 0.04817 0 110 717 15.34170 0.5822 0 721 3076 23.439532 0.95690 1 3029 3385 89.48301 0.8727 1 1185 9 0.7594937 0.2382 0 0 0.00000 0.3216 0 103 945 10.899471 0.9072 1 263 945 27.83069 0.7560 1 0 3385 0.0000000 0.1517 0 4.2693 0.9283 4 2.61605 0.5709 2 0.8727 0.8648 1 2.3747 0.4357 2 10.13275 0.7921 9 Yes 0 0 $0 0 0 $0 0 Census Tract 5, Atlantic County, New Jersey 17287 197000 21700 131800 20052.92 228520 1647.08 0.0821367 -96720 -0.4232452 NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001001100 34001 001100 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 2204 1204 1204 1185 2204 53.76588 0.9457 1 219 927 23.624596 0.9830 1 97 172 56.39535 0.9094 1 462 1032 44.76744 0.4746 0 559 1204 46.42857 0.7197 0 346 1440 24.02778 0.8306 1 469 1942 24.15036 0.9360 1 363 16.470054 0.70200 0 578 26.22505 0.74410 0 442 1558 28.36970 0.9675 1 247 396 62.373737 0.9898 1 104 2051 5.070697 0.7260 0 2118 2204 96.09800 0.9204 1 1204 570 47.342193 0.8858 1 0 0.0000000 0.3251 0 14 1204 1.162791 0.4877 0 817 1204 67.85714 0.9413 1 0 2204 0 0.3512 0 4.4150 0.9451 4 4.12940 0.9805 2 0.9204 0.9114 1 2.9911 0.7243 2 12.45590 0.9597 9 1950 1267 1096 1131 1950 58.00000 0.9678 1 66 706 9.348442 0.8395 1 42 101 41.58416 0.8612 1 309 995 31.05528 0.1959 0 351 1096 32.02555 0.4782 0 510 1379 36.983321 0.9763 1 155 1950 7.948718 0.7660 1 392 20.102564 0.69880 0 447 22.92308 0.6712 0 570 1503 37.924152 0.99200 1 143 374 38.23529 0.9167 1 109 1841 5.920695 0.74640 0 1909 1950 97.89744 0.9529 1 1267 479 37.8058406 0.8464 1 0 0.00000 0.3216 0 33 1096 3.010949 0.6446 0 743 1096 67.79197 0.9414 1 0 1950 0.0000000 0.1517 0 4.0278 0.8848 4 4.02510 0.9798 2 0.9529 0.9442 1 2.9057 0.6869 2 11.91150 0.9365 9 Yes 0 0 $0 0 0 $0 0 Census Tract 11, Atlantic County, New Jersey 16008 238500 15402 162500 18569.28 276660 -3167.28 -0.1705656 -114160 -0.4126364 NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001001300 34001 001300 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 2153 1026 857 695 2153 32.28054 0.7840 1 266 1112 23.920863 0.9840 1 168 432 38.88889 0.6425 0 271 425 63.76471 0.8714 1 439 857 51.22520 0.8184 1 210 1471 14.27600 0.5989 0 463 2215 20.90293 0.8974 1 334 15.513237 0.64360 0 539 25.03484 0.66990 0 222 1687 13.15945 0.4984 0 265 608 43.585526 0.9249 1 92 1905 4.829396 0.7187 0 1993 2153 92.56851 0.8890 1 1026 147 14.327485 0.6885 0 0 0.0000000 0.3251 0 20 857 2.333722 0.6326 0 142 857 16.56943 0.6382 0 0 2153 0 0.3512 0 4.0827 0.8798 4 3.45550 0.9039 1 0.8890 0.8804 1 2.6356 0.5687 0 11.06280 0.8673 6 1632 917 770 591 1632 36.21324 0.8455 1 203 854 23.770492 0.9928 1 164 291 56.35739 0.9604 1 364 479 75.99165 0.9710 1 528 770 68.57143 0.9914 1 150 1056 14.204546 0.7232 0 97 1632 5.943627 0.6352 0 301 18.443628 0.60940 0 271 16.60539 0.2292 0 314 1361 23.071271 0.88960 1 148 410 36.09756 0.9025 1 0 1585 0.000000 0.06953 0 1512 1632 92.64706 0.8931 1 917 246 26.8266085 0.7912 1 16 1.74482 0.7855 1 0 770 0.000000 0.1194 0 219 770 28.44156 0.7606 1 14 1632 0.8578431 0.6722 0 4.1881 0.9131 3 2.70023 0.6211 2 0.8931 0.8850 1 3.1289 0.7740 3 10.91033 0.8638 9 Yes 0 0 $0 0 0 $0 0 Census Tract 13, Atlantic County, New Jersey 32444 233700 23773 162300 37635.04 271092 -13862.04 -0.3683280 -108792 -0.4013103 66.52 44.91 Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001001400 34001 001400 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3736 1893 1503 2135 3736 57.14668 0.9592 1 411 1635 25.137615 0.9866 1 267 401 66.58354 0.9617 1 715 1102 64.88203 0.8844 1 982 1503 65.33599 0.9764 1 511 1696 30.12972 0.9005 1 527 4199 12.55061 0.6728 0 269 7.200214 0.11510 0 1598 42.77302 0.99350 1 345 2252 15.31972 0.6309 0 787 941 83.634432 0.9990 1 63 3192 1.973684 0.5448 0 3463 3736 92.69272 0.8905 1 1893 427 22.556788 0.7770 1 0 0.0000000 0.3251 0 22 1503 1.463739 0.5339 0 705 1503 46.90619 0.8533 1 0 3736 0 0.3512 0 4.4955 0.9585 4 3.28330 0.8640 2 0.8905 0.8818 1 2.8405 0.6671 2 11.50980 0.9048 9 3812 1724 1549 2291 3754 61.02824 0.9760 1 380 1547 24.563672 0.9934 1 117 240 48.75000 0.9237 1 753 1309 57.52483 0.7816 1 870 1549 56.16527 0.9326 1 472 1913 24.673288 0.8987 1 294 3802 7.732772 0.7558 1 363 9.522560 0.12310 0 1463 38.37880 0.9885 1 508 2339 21.718683 0.85640 1 564 948 59.49367 0.9910 1 201 3159 6.362773 0.76130 1 3389 3812 88.90346 0.8683 1 1724 571 33.1206497 0.8294 1 0 0.00000 0.3216 0 83 1549 5.358296 0.7754 1 661 1549 42.67269 0.8448 1 10 3812 0.2623295 0.4739 0 4.5565 0.9673 5 3.72030 0.9522 4 0.8683 0.8605 1 3.2451 0.8159 3 12.39020 0.9595 13 Yes 0 0 $0 0 0 $0 0 Census Tract 14, Atlantic County, New Jersey 16780 255800 17487 139100 19464.80 296728 -1977.80 -0.1016091 -157628 -0.5312205 NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001001500 34001 001500 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 1074 901 752 656 1074 61.08007 0.9700 1 43 270 15.925926 0.9242 1 30 70 42.85714 0.7276 0 366 682 53.66569 0.6910 0 396 752 52.65957 0.8458 1 266 921 28.88165 0.8886 1 121 1064 11.37218 0.6131 0 385 35.847300 0.99020 1 129 12.01117 0.06170 0 321 993 32.32628 0.9846 1 62 195 31.794872 0.8408 1 125 1050 11.904762 0.8562 1 965 1074 89.85102 0.8717 1 901 636 70.588235 0.9304 1 0 0.0000000 0.3251 0 10 752 1.329787 0.5133 0 626 752 83.24468 0.9888 1 0 1074 0 0.3512 0 4.2417 0.9134 4 3.73350 0.9515 4 0.8717 0.8632 1 3.1088 0.7709 2 11.95570 0.9362 11 1601 976 810 1001 1601 62.52342 0.9797 1 204 563 36.234458 0.9989 1 74 110 67.27273 0.9848 1 224 700 32.00000 0.2097 0 298 810 36.79012 0.6089 0 379 1145 33.100437 0.9610 1 272 1601 16.989382 0.9572 1 451 28.169894 0.93630 1 251 15.67770 0.1835 0 411 1350 30.444444 0.97330 1 196 446 43.94619 0.9511 1 220 1532 14.360313 0.89290 1 1435 1601 89.63148 0.8738 1 976 451 46.2090164 0.8742 1 0 0.00000 0.3216 0 24 810 2.962963 0.6412 0 546 810 67.40741 0.9401 1 15 1601 0.9369144 0.6832 0 4.5057 0.9617 4 3.93710 0.9752 4 0.8738 0.8659 1 3.4603 0.8774 2 12.77690 0.9705 11 Yes 0 0 $0 0 0 $0 0 Census Tract 15, Atlantic County, New Jersey 11549 172400 12339 NA 13396.84 199984 -1057.84 -0.0789619 NA NA NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001001900 34001 001900 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 1656 1159 903 524 1656 31.64251 0.7755 1 72 879 8.191126 0.6337 0 41 50 82.00000 0.9900 1 407 853 47.71395 0.5494 0 448 903 49.61240 0.7888 1 210 1318 15.93323 0.6573 0 409 1748 23.39817 0.9270 1 134 8.091787 0.15270 0 262 15.82126 0.12460 0 268 1303 20.56792 0.8570 1 87 338 25.739645 0.7731 1 93 1617 5.751392 0.7497 0 1416 1656 85.50725 0.8482 1 1159 897 77.394305 0.9416 1 0 0.0000000 0.3251 0 91 903 10.077519 0.9007 1 516 903 57.14286 0.9002 1 0 1656 0 0.3512 0 3.7823 0.8187 3 2.65710 0.5936 2 0.8482 0.8400 1 3.4188 0.8829 3 10.70640 0.8361 9 1343 1022 751 694 1343 51.67535 0.9465 1 136 665 20.451128 0.9868 1 54 65 83.07692 0.9939 1 455 686 66.32653 0.9072 1 509 751 67.77630 0.9894 1 68 926 7.343413 0.4249 0 270 1343 20.104244 0.9746 1 161 11.988086 0.22700 0 281 20.92331 0.5297 0 212 1062 19.962335 0.80630 1 69 206 33.49515 0.8825 1 104 1225 8.489796 0.81120 1 1038 1343 77.28965 0.8047 1 1022 802 78.4735812 0.9398 1 0 0.00000 0.3216 0 34 751 4.527297 0.7388 0 376 751 50.06658 0.8789 1 0 1343 0.0000000 0.1517 0 4.3222 0.9357 4 3.25670 0.8567 3 0.8047 0.7974 1 3.0308 0.7381 2 11.41440 0.9049 10 Yes 0 0 $0 0 0 $0 0 Census Tract 19, Atlantic County, New Jersey 20965 223700 18803 254400 24319.40 259492 -5516.40 -0.2268313 -5092 -0.0196230 NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001002300 34001 002300 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 2251 1108 703 1183 2251 52.55442 0.9403 1 137 842 16.270784 0.9292 1 119 230 51.73913 0.8660 1 213 473 45.03171 0.4822 0 332 703 47.22617 0.7383 0 370 1322 27.98790 0.8776 1 811 2471 32.82072 0.9821 1 153 6.796979 0.09922 0 738 32.78543 0.94640 1 191 1646 11.60389 0.3890 0 189 519 36.416185 0.8771 1 480 1860 25.806452 0.9639 1 1961 2251 87.11684 0.8548 1 1108 72 6.498195 0.5264 0 0 0.0000000 0.3251 0 43 703 6.116643 0.8192 1 338 703 48.07966 0.8595 1 0 2251 0 0.3512 0 4.4675 0.9532 4 3.27562 0.8621 3 0.8548 0.8465 1 2.8814 0.6831 2 11.47932 0.9018 10 2410 1143 789 1222 2409 50.72644 0.9419 1 118 1396 8.452722 0.7982 1 103 219 47.03196 0.9109 1 428 570 75.08772 0.9667 1 531 789 67.30038 0.9884 1 729 1582 46.080910 0.9943 1 754 2410 31.286307 0.9952 1 84 3.485477 0.01502 0 592 24.56432 0.7651 1 258 1818 14.191419 0.52410 0 273 537 50.83799 0.9753 1 826 2255 36.629712 0.99160 1 2193 2410 90.99585 0.8826 1 1143 71 6.2117235 0.4953 0 0 0.00000 0.3216 0 202 789 25.602028 0.9894 1 362 789 45.88086 0.8609 1 0 2410 0.0000000 0.1517 0 4.7180 0.9818 5 3.27112 0.8607 3 0.8826 0.8746 1 2.8189 0.6488 2 11.69062 0.9229 11 Yes 0 0 $0 0 0 $0 0 Census Tract 23, Atlantic County, New Jersey 18704 223300 18470 116700 21696.64 259028 -3226.64 -0.1487161 -142328 -0.5494696 NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
Code
svi_national_nmtc_df0 <- left_join(svi_national_nmtc, census_pull_df, join_by("GEOID_2010_trt" == "GEOID"))

svi_national_nmtc_df1 <- left_join(svi_national_nmtc_df0, hpi_df_10_20, join_by("GEOID_2010_trt" == "GEOID10")) %>%
                          unite("county_fips", FIPS_st, FIPS_county, sep = "") 

svi_national_nmtc_df <- left_join(svi_national_nmtc_df1, msa_csa_crosswalk, join_by("county_fips" == "county_fips"))

svi_national_nmtc_df %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt county_fips FIPS_tract state state_name county region_number region division_number division E_TOTPOP_10 E_HU_10 E_HH_10 E_POV150_10 ET_POVSTATUS_10 EP_POV150_10 EPL_POV150_10 F_POV150_10 E_UNEMP_10 ET_EMPSTATUS_10 EP_UNEMP_10 EPL_UNEMP_10 F_UNEMP_10 E_HBURD_OWN_10 ET_HOUSINGCOST_OWN_10 EP_HBURD_OWN_10 EPL_HBURD_OWN_10 F_HBURD_OWN_10 E_HBURD_RENT_10 ET_HOUSINGCOST_RENT_10 EP_HBURD_RENT_10 EPL_HBURD_RENT_10 F_HBURD_RENT_10 E_HBURD_10 ET_HOUSINGCOST_10 EP_HBURD_10 EPL_HBURD_10 F_HBURD_10 E_NOHSDP_10 ET_EDSTATUS_10 EP_NOHSDP_10 EPL_NOHSDP_10 F_NOHSDP_10 E_UNINSUR_12 ET_INSURSTATUS_12 EP_UNINSUR_12 EPL_UNINSUR_12 F_UNINSUR_12 E_AGE65_10 EP_AGE65_10 EPL_AGE65_10 F_AGE65_10 E_AGE17_10 EP_AGE17_10 EPL_AGE17_10 F_AGE17_10 E_DISABL_12 ET_DISABLSTATUS_12 EP_DISABL_12 EPL_DISABL_12 F_DISABL_12 E_SNGPNT_10 ET_FAMILIES_10 EP_SNGPNT_10 EPL_SNGPNT_10 F_SNGPNT_10 E_LIMENG_10 ET_POPAGE5UP_10 EP_LIMENG_10 EPL_LIMENG_10 F_LIMENG_10 E_MINRTY_10 ET_POPETHRACE_10 EP_MINRTY_10 EPL_MINRTY_10 F_MINRTY_10 E_STRHU_10 E_MUNIT_10 EP_MUNIT_10 EPL_MUNIT_10 F_MUNIT_10 E_MOBILE_10 EP_MOBILE_10 EPL_MOBILE_10 F_MOBILE_10 E_CROWD_10 ET_OCCUPANTS_10 EP_CROWD_10 EPL_CROWD_10 F_CROWD_10 E_NOVEH_10 ET_KNOWNVEH_10 EP_NOVEH_10 EPL_NOVEH_10 F_NOVEH_10 E_GROUPQ_10 ET_HHTYPE_10 EP_GROUPQ_10 EPL_GROUPQ_10 F_GROUPQ_10 SPL_THEME1_10 RPL_THEME1_10 F_THEME1_10 SPL_THEME2_10 RPL_THEME2_10 F_THEME2_10 SPL_THEME3_10 RPL_THEME3_10 F_THEME3_10 SPL_THEME4_10 RPL_THEME4_10 F_THEME4_10 SPL_THEMES_10 RPL_THEMES_10 F_TOTAL_10 E_TOTPOP_20 E_HU_20 E_HH_20 E_POV150_20 ET_POVSTATUS_20 EP_POV150_20 EPL_POV150_20 F_POV150_20 E_UNEMP_20 ET_EMPSTATUS_20 EP_UNEMP_20 EPL_UNEMP_20 F_UNEMP_20 E_HBURD_OWN_20 ET_HOUSINGCOST_OWN_20 EP_HBURD_OWN_20 EPL_HBURD_OWN_20 F_HBURD_OWN_20 E_HBURD_RENT_20 ET_HOUSINGCOST_RENT_20 EP_HBURD_RENT_20 EPL_HBURD_RENT_20 F_HBURD_RENT_20 E_HBURD_20 ET_HOUSINGCOST_20 EP_HBURD_20 EPL_HBURD_20 F_HBURD_20 E_NOHSDP_20 ET_EDSTATUS_20 EP_NOHSDP_20 EPL_NOHSDP_20 F_NOHSDP_20 E_UNINSUR_20 ET_INSURSTATUS_20 EP_UNINSUR_20 EPL_UNINSUR_20 F_UNINSUR_20 E_AGE65_20 EP_AGE65_20 EPL_AGE65_20 F_AGE65_20 E_AGE17_20 EP_AGE17_20 EPL_AGE17_20 F_AGE17_20 E_DISABL_20 ET_DISABLSTATUS_20 EP_DISABL_20 EPL_DISABL_20 F_DISABL_20 E_SNGPNT_20 ET_FAMILIES_20 EP_SNGPNT_20 EPL_SNGPNT_20 F_SNGPNT_20 E_LIMENG_20 ET_POPAGE5UP_20 EP_LIMENG_20 EPL_LIMENG_20 F_LIMENG_20 E_MINRTY_20 ET_POPETHRACE_20 EP_MINRTY_20 EPL_MINRTY_20 F_MINRTY_20 E_STRHU_20 E_MUNIT_20 EP_MUNIT_20 EPL_MUNIT_20 F_MUNIT_20 E_MOBILE_20 EP_MOBILE_20 EPL_MOBILE_20 F_MOBILE_20 E_CROWD_20 ET_OCCUPANTS_20 EP_CROWD_20 EPL_CROWD_20 F_CROWD_20 E_NOVEH_20 ET_KNOWNVEH_20 EP_NOVEH_20 EPL_NOVEH_20 F_NOVEH_20 E_GROUPQ_20 ET_HHTYPE_20 EP_GROUPQ_20 EPL_GROUPQ_20 F_GROUPQ_20 SPL_THEME1_20 RPL_THEME1_20 F_THEME1_20 SPL_THEME2_20 RPL_THEME2_20 F_THEME2_20 SPL_THEME3_20 RPL_THEME3_20 F_THEME3_20 SPL_THEME4_20 RPL_THEME4_20 F_THEME4_20 SPL_THEMES_20 RPL_THEMES_20 F_TOTAL_20 nmtc_eligibility pre10_nmtc_project_cnt pre10_nmtc_dollars pre10_nmtc_dollars_formatted post10_nmtc_project_cnt post10_nmtc_dollars post10_nmtc_dollars_formatted nmtc_flag NAME Median_Income_10 Median_Home_Value_10 Median_Income_19 Median_Home_Value_19 Median_Income_10adj Median_Home_Value_10adj Median_Income_Change Median_Income_Change_pct Median_Home_Value_Change Median_Home_Value_Change_pct housing_price_index10 housing_price_index20 county_title cbsa cbsa_code
01001020200 01001 020200 AL Alabama Autauga County 3 South Region 6 East South Central Division 2020 816 730 495 1992 24.84940 0.5954 0 68 834 8.153477 0.57540 0 49 439 11.16173 0.02067 0 105 291 36.08247 0.30190 0 154 730 21.09589 0.09312 0 339 1265 26.798419 0.8392 1 313 2012 15.55666 0.6000 0 204 10.09901 0.3419 0 597 29.55446 0.8192 1 359 1515 23.69637 0.8791 1 132 456 28.947368 0.8351 1 15 1890 0.7936508 0.40130 0 1243 2020 61.534653 0.77810 1 816 0 0.0000000 0.1224 0 34 4.1666667 0.6664 0 13 730 1.780822 0.5406 0 115 730 15.7534247 0.83820 1 0 2020 0.0000 0.3640 0 2.70312 0.5665 1 3.27660 0.8614 3 0.77810 0.7709 1 2.53160 0.5047 1 9.28942 0.6832 6 1757 720 573 384 1511 25.413633 0.6427 0 29 717 4.044630 0.41320 0 33 392 8.418367 0.03542 0 116 181 64.08840 0.9086 1 149 573 26.00349 0.40410 0 139 1313 10.586443 0.5601 0 91 1533 5.936073 0.4343 0 284 16.163916 0.5169 0 325 18.49744 0.28510 0 164 1208.000 13.576159 0.4127 0 42 359.0000 11.6991643 0.39980 0 0 1651 0.0000000 0.09479 0 1116 1757.000 63.5173591 0.759100 1 720 3 0.4166667 0.2470 0 5 0.6944444 0.5106 0 9 573 1.5706806 0.46880 0 57 573.000 9.947644 0.7317 0 212 1757 12.0660216 0.9549 1 2.45440 0.4888 0 1.70929 0.10250 0 0.759100 0.752700 1 2.91300 0.6862 1 7.835790 0.4802 2 Yes 0 0 $0 0 0 $0 0 Census Tract 202, Autauga County, Alabama 19437 138500 20154 90500 22546.92 160660 -2392.92 -0.1061307 -70160 -0.4366986 123.78 123.37 Autauga County, Alabama Montgomery-Alexander City, AL CSA CS388
01001020700 01001 020700 AL Alabama Autauga County 3 South Region 6 East South Central Division 2664 1254 1139 710 2664 26.65165 0.6328 0 29 1310 2.213741 0.05255 0 134 710 18.87324 0.13890 0 187 429 43.58974 0.47090 0 321 1139 28.18262 0.28130 0 396 1852 21.382289 0.7478 0 345 2878 11.98749 0.4459 0 389 14.60210 0.6417 0 599 22.48499 0.4007 0 510 2168 23.52399 0.8752 1 228 712 32.022472 0.8712 1 0 2480 0.0000000 0.09298 0 694 2664 26.051051 0.51380 0 1254 8 0.6379585 0.2931 0 460 36.6826156 0.9714 1 0 1139 0.000000 0.1238 0 125 1139 10.9745391 0.74770 0 0 2664 0.0000 0.3640 0 2.16035 0.4069 0 2.88178 0.6997 2 0.51380 0.5090 0 2.50000 0.4882 1 8.05593 0.5185 3 3562 1313 1248 1370 3528 38.832200 0.8512 1 128 1562 8.194622 0.79350 1 168 844 19.905213 0.44510 0 237 404 58.66337 0.8359 1 405 1248 32.45192 0.60420 0 396 2211 17.910448 0.7857 1 444 3547 12.517620 0.7758 1 355 9.966311 0.1800 0 954 26.78271 0.79230 1 629 2593.000 24.257617 0.8730 1 171 797.0000 21.4554580 0.71860 0 0 3211 0.0000000 0.09479 0 1009 3562.000 28.3267827 0.466800 0 1313 14 1.0662605 0.3165 0 443 33.7395278 0.9663 1 73 1248 5.8493590 0.82110 1 17 1248.000 1.362180 0.1554 0 112 3562 3.1443010 0.8514 1 3.81040 0.8569 4 2.65869 0.58470 2 0.466800 0.462900 0 3.11070 0.7714 3 10.046590 0.7851 9 Yes 0 0 $0 0 0 $0 0 Census Tract 207, Autauga County, Alabama 22114 93800 20934 82400 25652.24 108808 -4718.24 -0.1839309 -26408 -0.2427027 95.94 108.47 Autauga County, Alabama Montgomery-Alexander City, AL CSA CS388
01001021100 01001 021100 AL Alabama Autauga County 3 South Region 6 East South Central Division 3298 1502 1323 860 3298 26.07641 0.6211 0 297 1605 18.504673 0.94340 1 250 1016 24.60630 0.32070 0 74 307 24.10423 0.11920 0 324 1323 24.48980 0.17380 0 710 2231 31.824294 0.8976 1 654 3565 18.34502 0.7018 0 411 12.46210 0.5001 0 738 22.37720 0.3934 0 936 2861 32.71583 0.9807 1 138 825 16.727273 0.5715 0 9 3155 0.2852615 0.25010 0 1979 3298 60.006064 0.77030 1 1502 14 0.9320905 0.3234 0 659 43.8748336 0.9849 1 44 1323 3.325775 0.7062 0 137 1323 10.3552532 0.73130 0 0 3298 0.0000 0.3640 0 3.33770 0.7351 2 2.69580 0.6028 1 0.77030 0.7631 1 3.10980 0.7827 1 9.91360 0.7557 5 3499 1825 1462 1760 3499 50.300086 0.9396 1 42 966 4.347826 0.45390 0 426 1274 33.437991 0.85200 1 52 188 27.65957 0.1824 0 478 1462 32.69494 0.61110 0 422 2488 16.961415 0.7638 1 497 3499 14.204058 0.8246 1 853 24.378394 0.8688 1 808 23.09231 0.58290 0 908 2691.100 33.740844 0.9808 1 179 811.6985 22.0525243 0.73230 0 8 3248 0.2463054 0.26220 0 1986 3498.713 56.7637257 0.717500 0 1825 29 1.5890411 0.3551 0 576 31.5616438 0.9594 1 88 1462 6.0191518 0.82690 1 148 1461.993 10.123166 0.7364 0 38 3499 1.0860246 0.7013 0 3.59300 0.8073 3 3.42700 0.91560 2 0.717500 0.711400 0 3.57910 0.9216 2 11.316600 0.9150 7 Yes 0 0 $0 0 0 $0 0 Census Tract 211, Autauga County, Alabama 17997 74000 20620 88600 20876.52 85840 -256.52 -0.0122875 2760 0.0321528 134.13 145.41 Autauga County, Alabama Montgomery-Alexander City, AL CSA CS388
01003010200 01003 010200 AL Alabama Baldwin County 3 South Region 6 East South Central Division 2612 1220 1074 338 2605 12.97505 0.2907 0 44 1193 3.688181 0.14720 0 172 928 18.53448 0.13090 0 31 146 21.23288 0.09299 0 203 1074 18.90130 0.05657 0 455 1872 24.305556 0.8016 1 456 2730 16.70330 0.6445 0 401 15.35222 0.6847 0 563 21.55436 0.3406 0 410 2038 20.11776 0.7755 1 64 779 8.215661 0.2181 0 0 2510 0.0000000 0.09298 0 329 2612 12.595712 0.31130 0 1220 38 3.1147541 0.4648 0 385 31.5573770 0.9545 1 20 1074 1.862197 0.5509 0 43 1074 4.0037244 0.40880 0 0 2612 0.0000 0.3640 0 1.94057 0.3398 1 2.11188 0.2802 1 0.31130 0.3084 0 2.74300 0.6129 1 7.10675 0.3771 3 2928 1312 1176 884 2928 30.191257 0.7334 0 29 1459 1.987663 0.13560 0 71 830 8.554217 0.03726 0 134 346 38.72832 0.3964 0 205 1176 17.43197 0.12010 0 294 2052 14.327485 0.6940 0 219 2925 7.487179 0.5423 0 556 18.989071 0.6705 0 699 23.87295 0.63390 0 489 2226.455 21.963167 0.8122 1 191 783.8820 24.3659136 0.77990 1 0 2710 0.0000000 0.09479 0 398 2927.519 13.5951280 0.251100 0 1312 13 0.9908537 0.3111 0 400 30.4878049 0.9557 1 6 1176 0.5102041 0.25900 0 81 1176.202 6.886570 0.6115 0 7 2928 0.2390710 0.4961 0 2.22540 0.4183 0 2.99129 0.76340 2 0.251100 0.249000 0 2.63340 0.5496 1 8.101190 0.5207 3 Yes 0 0 $0 1 408000 $408,000 1 Census Tract 102, Baldwin County, Alabama 23862 103200 26085 136900 27679.92 119712 -1594.92 -0.0576201 17188 0.1435779 128.38 166.27 Baldwin County, Alabama Mobile-Daphne-Fairhope, AL CSA CS380
01003010500 01003 010500 AL Alabama Baldwin County 3 South Region 6 East South Central Division 4230 1779 1425 498 3443 14.46413 0.3337 0 166 1625 10.215385 0.71790 0 151 1069 14.12535 0.04638 0 196 356 55.05618 0.73830 0 347 1425 24.35088 0.17010 0 707 2945 24.006791 0.7967 1 528 4001 13.19670 0.5005 0 619 14.63357 0.6436 0 790 18.67612 0.1937 0 536 3096 17.31266 0.6572 0 165 920 17.934783 0.6102 0 20 4021 0.4973887 0.32320 0 754 4230 17.825059 0.40230 0 1779 97 5.4525014 0.5525 0 8 0.4496908 0.4600 0 63 1425 4.421053 0.7762 1 90 1425 6.3157895 0.56910 0 787 4230 18.6052 0.9649 1 2.51890 0.5121 1 2.42790 0.4539 0 0.40230 0.3986 0 3.32270 0.8628 2 8.67180 0.6054 3 5877 1975 1836 820 5244 15.636918 0.3902 0 90 2583 3.484321 0.33610 0 159 1345 11.821561 0.10530 0 139 491 28.30957 0.1924 0 298 1836 16.23094 0.09053 0 570 4248 13.418079 0.6669 0 353 5247 6.727654 0.4924 0 1109 18.870172 0.6645 0 1144 19.46571 0.34110 0 717 4102.545 17.476956 0.6332 0 103 1286.1180 8.0085961 0.23410 0 0 5639 0.0000000 0.09479 0 868 5877.481 14.7682323 0.270900 0 1975 26 1.3164557 0.3359 0 45 2.2784810 0.6271 0 9 1836 0.4901961 0.25400 0 116 1835.798 6.318779 0.5811 0 633 5877 10.7708014 0.9507 1 1.97613 0.3410 0 1.96769 0.19610 0 0.270900 0.268600 0 2.74880 0.6077 1 6.963520 0.3406 1 Yes 0 0 $0 0 0 $0 0 Census Tract 105, Baldwin County, Alabama 21585 121100 28301 148500 25038.60 140476 3262.40 0.1302948 8024 0.0571201 191.57 213.49 Baldwin County, Alabama Mobile-Daphne-Fairhope, AL CSA CS380
01003010600 01003 010600 AL Alabama Baldwin County 3 South Region 6 East South Central Division 3724 1440 1147 1973 3724 52.98067 0.9342 1 142 1439 9.867964 0.69680 0 235 688 34.15698 0.62950 0 187 459 40.74074 0.40290 0 422 1147 36.79163 0.55150 0 497 1876 26.492537 0.8354 1 511 3661 13.95794 0.5334 0 246 6.60580 0.1481 0 1256 33.72718 0.9305 1 496 2522 19.66693 0.7587 1 274 838 32.696897 0.8779 1 32 3479 0.9198045 0.42810 0 2606 3724 69.978518 0.81840 1 1440 21 1.4583333 0.3683 0 321 22.2916667 0.9036 1 97 1147 8.456844 0.8956 1 167 1147 14.5597210 0.82090 1 0 3724 0.0000 0.3640 0 3.55130 0.7859 2 3.14330 0.8145 3 0.81840 0.8108 1 3.35240 0.8725 3 10.86540 0.8550 9 4115 1534 1268 1676 3997 41.931449 0.8814 1 294 1809 16.252073 0.96740 1 341 814 41.891892 0.94320 1 204 454 44.93392 0.5438 0 545 1268 42.98107 0.83620 1 624 2425 25.731959 0.9002 1 994 4115 24.155529 0.9602 1 642 15.601458 0.4841 0 1126 27.36331 0.81750 1 568 2989.000 19.003011 0.7045 0 212 715.0000 29.6503497 0.85920 1 56 3825 1.4640523 0.53120 0 2715 4115.000 65.9781288 0.773200 1 1534 0 0.0000000 0.1079 0 529 34.4850065 0.9685 1 101 1268 7.9652997 0.87950 1 89 1268.000 7.018927 0.6184 0 17 4115 0.4131227 0.5707 0 4.54540 0.9754 5 3.39650 0.90810 2 0.773200 0.766700 1 3.14500 0.7858 2 11.860100 0.9520 10 Yes 0 0 $0 1 8000000 $8,000,000 1 Census Tract 106, Baldwin County, Alabama 17788 81600 16453 104700 20634.08 94656 -4181.08 -0.2026298 10044 0.1061105 NA NA Baldwin County, Alabama Mobile-Daphne-Fairhope, AL CSA CS380
01003011000 01003 011000 AL Alabama Baldwin County 3 South Region 6 East South Central Division 3758 2012 1576 1053 3758 28.02022 0.6597 0 66 1707 3.866432 0.16250 0 293 1297 22.59059 0.25080 0 83 279 29.74910 0.19030 0 376 1576 23.85787 0.15710 0 744 2723 27.322806 0.8465 1 996 4137 24.07542 0.8462 1 713 18.97286 0.8429 1 804 21.39436 0.3306 0 763 3295 23.15630 0.8670 1 155 1145 13.537118 0.4538 0 50 3475 1.4388489 0.51460 0 516 3758 13.730708 0.33300 0 2012 0 0.0000000 0.1224 0 606 30.1192843 0.9484 1 42 1576 2.664975 0.6476 0 96 1576 6.0913706 0.55620 0 0 3758 0.0000 0.3640 0 2.67200 0.5579 2 3.00890 0.7581 2 0.33300 0.3299 0 2.63860 0.5614 1 8.65250 0.6030 5 4921 1979 1732 1539 4908 31.356968 0.7523 1 150 2105 7.125891 0.72850 0 214 1471 14.547927 0.20260 0 59 261 22.60536 0.1167 0 273 1732 15.76212 0.07981 0 936 3332 28.091237 0.9206 1 861 4921 17.496444 0.8930 1 1039 21.113595 0.7653 1 1183 24.03983 0.64410 0 585 3738.000 15.650080 0.5371 0 81 1151.0000 7.0373588 0.19000 0 101 4546 2.2217334 0.61440 0 1244 4921.000 25.2794148 0.427800 0 1979 0 0.0000000 0.1079 0 527 26.6296109 0.9393 1 83 1732 4.7921478 0.77460 1 151 1732.000 8.718245 0.6904 0 20 4921 0.4064215 0.5688 0 3.37421 0.7528 3 2.75090 0.63780 1 0.427800 0.424200 0 3.08100 0.7597 2 9.633910 0.7366 6 Yes 0 0 $0 0 0 $0 0 Census Tract 110, Baldwin County, Alabama 19340 126400 23679 158700 22434.40 146624 1244.60 0.0554773 12076 0.0823603 129.69 188.85 Baldwin County, Alabama Mobile-Daphne-Fairhope, AL CSA CS380
01003011406 01003 011406 AL Alabama Baldwin County 3 South Region 6 East South Central Division 3317 6418 1307 583 3317 17.57612 0.4181 0 70 1789 3.912800 0.16690 0 221 685 32.26277 0.57540 0 284 622 45.65916 0.52130 0 505 1307 38.63810 0.60430 0 168 2255 7.450111 0.2800 0 919 3677 24.99320 0.8623 1 452 13.62677 0.5791 0 673 20.28942 0.2668 0 366 2769 13.21777 0.4276 0 96 887 10.822999 0.3359 0 180 3066 5.8708415 0.77920 1 473 3317 14.259873 0.34330 0 6418 3976 61.9507635 0.9655 1 384 5.9831723 0.7063 0 17 1307 1.300689 0.4632 0 10 1307 0.7651109 0.08684 0 0 3317 0.0000 0.3640 0 2.33160 0.4577 1 2.38860 0.4323 1 0.34330 0.3401 0 2.58584 0.5335 1 7.64934 0.4576 3 3226 7850 1797 228 3215 7.091757 0.1241 0 72 2055 3.503650 0.33910 0 302 1139 26.514486 0.69300 0 230 658 34.95441 0.3131 0 532 1797 29.60490 0.52020 0 128 2726 4.695525 0.2384 0 530 3226 16.429014 0.8749 1 790 24.488531 0.8715 1 342 10.60136 0.05624 0 280 2884.000 9.708738 0.1832 0 58 792.0000 7.3232323 0.20270 0 15 3107 0.4827808 0.34070 0 15 3226.000 0.4649721 0.002512 0 7850 5394 68.7133758 0.9706 1 274 3.4904459 0.6697 0 23 1797 1.2799110 0.41980 0 26 1797.000 1.446856 0.1647 0 0 3226 0.0000000 0.1831 0 2.09670 0.3785 1 1.65434 0.08785 1 0.002512 0.002491 0 2.40790 0.4381 1 6.161452 0.2215 3 Yes 0 0 $0 0 0 $0 0 Census Tract 114.06, Baldwin County, Alabama 29838 252000 32201 224200 34612.08 292320 -2411.08 -0.0696601 -68120 -0.2330323 NA NA Baldwin County, Alabama Mobile-Daphne-Fairhope, AL CSA CS380
01003011407 01003 011407 AL Alabama Baldwin County 3 South Region 6 East South Central Division 5187 6687 2066 1404 5172 27.14617 0.6423 0 172 1935 8.888889 0.63280 0 482 1433 33.63573 0.61530 0 367 633 57.97788 0.79510 1 849 2066 41.09390 0.67110 0 278 3618 7.683803 0.2906 0 1027 4945 20.76845 0.7735 1 1398 26.95200 0.9629 1 1263 24.34933 0.5302 0 596 3792 15.71730 0.5759 0 158 1633 9.675444 0.2833 0 29 4867 0.5958496 0.35240 0 170 5187 3.277424 0.07984 0 6687 2772 41.4535666 0.9251 1 197 2.9460147 0.6326 0 90 2066 4.356244 0.7729 1 0 2066 0.0000000 0.02586 0 0 5187 0.0000 0.3640 0 3.01030 0.6516 1 2.70470 0.6077 1 0.07984 0.0791 0 2.72046 0.6014 2 8.51530 0.5852 4 5608 7576 2543 1058 5602 18.886112 0.4835 0 32 2631 1.216268 0.05882 0 581 1979 29.358262 0.77080 1 309 564 54.78723 0.7671 1 890 2543 34.99803 0.67250 0 230 4433 5.188360 0.2698 0 776 5602 13.852196 0.8156 1 1527 27.228959 0.9205 1 567 10.11056 0.05099 0 615 5035.000 12.214498 0.3295 0 16 1746.0000 0.9163803 0.01566 0 0 5573 0.0000000 0.09479 0 441 5608.000 7.8637660 0.140300 0 7576 3055 40.3247096 0.9148 1 72 0.9503696 0.5383 0 0 2543 0.0000000 0.09796 0 125 2543.000 4.915454 0.4934 0 6 5608 0.1069900 0.4054 0 2.30022 0.4418 1 1.41144 0.04295 1 0.140300 0.139100 0 2.44986 0.4589 1 6.301820 0.2416 3 Yes 0 0 $0 0 0 $0 0 Census Tract 114.07, Baldwin County, Alabama 22317 292600 28418 241100 25887.72 339416 2530.28 0.0977406 -98316 -0.2896622 NA NA Baldwin County, Alabama Mobile-Daphne-Fairhope, AL CSA CS380
01003011502 01003 011502 AL Alabama Baldwin County 3 South Region 6 East South Central Division 9234 4606 3702 3160 9213 34.29936 0.7632 1 282 4002 7.046477 0.47570 0 526 2158 24.37442 0.31260 0 582 1544 37.69430 0.33410 0 1108 3702 29.92977 0.33740 0 997 6176 16.143135 0.6201 0 2074 10111 20.51231 0.7670 1 1450 15.70284 0.7043 0 2491 26.97639 0.6984 0 1542 7577 20.35106 0.7842 1 684 2718 25.165563 0.7767 1 532 8697 6.1170519 0.78590 1 3275 9234 35.466753 0.60970 0 4606 214 4.6461138 0.5268 0 828 17.9765523 0.8689 1 89 3702 2.404106 0.6192 0 293 3702 7.9146407 0.64700 0 0 9234 0.0000 0.3640 0 2.96340 0.6387 2 3.74950 0.9623 3 0.60970 0.6040 0 3.02590 0.7475 1 10.34850 0.8024 6 14165 6867 6002 2853 14165 20.141193 0.5175 0 313 7047 4.441606 0.46620 0 1181 4164 28.362152 0.74500 0 887 1838 48.25898 0.6211 0 2068 6002 34.45518 0.65900 0 1667 10750 15.506977 0.7286 0 2527 14165 17.839746 0.8980 1 3082 21.757854 0.7907 1 2506 17.69149 0.24240 0 3004 11659.000 25.765503 0.9038 1 407 3482.0000 11.6886847 0.39940 0 364 13519 2.6925068 0.65290 0 2755 14165.000 19.4493470 0.346300 0 6867 441 6.4220183 0.5555 0 526 7.6598223 0.7585 1 93 6002 1.5494835 0.46540 0 184 6002.000 3.065645 0.3373 0 0 14165 0.0000000 0.1831 0 3.26930 0.7261 1 2.98920 0.76250 2 0.346300 0.343400 0 2.29980 0.3856 1 8.904600 0.6398 4 Yes 0 0 $0 2 8860000 $8,860,000 1 Census Tract 115.02, Baldwin County, Alabama 20411 162700 22820 180400 23676.76 188732 -856.76 -0.0361857 -8332 -0.0441473 NA NA Baldwin County, Alabama Mobile-Daphne-Fairhope, AL CSA CS380

Create LIHTC data set

Join SVI data for LIHTC with Median Income, Median Home Value, and Housing Price Index data:

Code
svi_divisional_lihtc_df0 <- left_join(svi_divisional_lihtc, census_pull_df, join_by("GEOID_2010_trt" == "GEOID"))

svi_divisional_lihtc_df1 <- left_join(svi_divisional_lihtc_df0, hpi_df_10_20, join_by("GEOID_2010_trt" == "GEOID10")) %>%
                          unite("county_fips", FIPS_st, FIPS_county, sep = "") 

svi_divisional_lihtc_df <- left_join(svi_divisional_lihtc_df1, msa_csa_crosswalk, join_by("county_fips" == "county_fips"))

svi_divisional_lihtc_df %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt county_fips FIPS_tract state state_name county region_number region division_number division E_TOTPOP_10 E_HU_10 E_HH_10 E_POV150_10 ET_POVSTATUS_10 EP_POV150_10 EPL_POV150_10 F_POV150_10 E_UNEMP_10 ET_EMPSTATUS_10 EP_UNEMP_10 EPL_UNEMP_10 F_UNEMP_10 E_HBURD_OWN_10 ET_HOUSINGCOST_OWN_10 EP_HBURD_OWN_10 EPL_HBURD_OWN_10 F_HBURD_OWN_10 E_HBURD_RENT_10 ET_HOUSINGCOST_RENT_10 EP_HBURD_RENT_10 EPL_HBURD_RENT_10 F_HBURD_RENT_10 E_HBURD_10 ET_HOUSINGCOST_10 EP_HBURD_10 EPL_HBURD_10 F_HBURD_10 E_NOHSDP_10 ET_EDSTATUS_10 EP_NOHSDP_10 EPL_NOHSDP_10 F_NOHSDP_10 E_UNINSUR_12 ET_INSURSTATUS_12 EP_UNINSUR_12 EPL_UNINSUR_12 F_UNINSUR_12 E_AGE65_10 EP_AGE65_10 EPL_AGE65_10 F_AGE65_10 E_AGE17_10 EP_AGE17_10 EPL_AGE17_10 F_AGE17_10 E_DISABL_12 ET_DISABLSTATUS_12 EP_DISABL_12 EPL_DISABL_12 F_DISABL_12 E_SNGPNT_10 ET_FAMILIES_10 EP_SNGPNT_10 EPL_SNGPNT_10 F_SNGPNT_10 E_LIMENG_10 ET_POPAGE5UP_10 EP_LIMENG_10 EPL_LIMENG_10 F_LIMENG_10 E_MINRTY_10 ET_POPETHRACE_10 EP_MINRTY_10 EPL_MINRTY_10 F_MINRTY_10 E_STRHU_10 E_MUNIT_10 EP_MUNIT_10 EPL_MUNIT_10 F_MUNIT_10 E_MOBILE_10 EP_MOBILE_10 EPL_MOBILE_10 F_MOBILE_10 E_CROWD_10 ET_OCCUPANTS_10 EP_CROWD_10 EPL_CROWD_10 F_CROWD_10 E_NOVEH_10 ET_KNOWNVEH_10 EP_NOVEH_10 EPL_NOVEH_10 F_NOVEH_10 E_GROUPQ_10 ET_HHTYPE_10 EP_GROUPQ_10 EPL_GROUPQ_10 F_GROUPQ_10 SPL_THEME1_10 RPL_THEME1_10 F_THEME1_10 SPL_THEME2_10 RPL_THEME2_10 F_THEME2_10 SPL_THEME3_10 RPL_THEME3_10 F_THEME3_10 SPL_THEME4_10 RPL_THEME4_10 F_THEME4_10 SPL_THEMES_10 RPL_THEMES_10 F_TOTAL_10 E_TOTPOP_20 E_HU_20 E_HH_20 E_POV150_20 ET_POVSTATUS_20 EP_POV150_20 EPL_POV150_20 F_POV150_20 E_UNEMP_20 ET_EMPSTATUS_20 EP_UNEMP_20 EPL_UNEMP_20 F_UNEMP_20 E_HBURD_OWN_20 ET_HOUSINGCOST_OWN_20 EP_HBURD_OWN_20 EPL_HBURD_OWN_20 F_HBURD_OWN_20 E_HBURD_RENT_20 ET_HOUSINGCOST_RENT_20 EP_HBURD_RENT_20 EPL_HBURD_RENT_20 F_HBURD_RENT_20 E_HBURD_20 ET_HOUSINGCOST_20 EP_HBURD_20 EPL_HBURD_20 F_HBURD_20 E_NOHSDP_20 ET_EDSTATUS_20 EP_NOHSDP_20 EPL_NOHSDP_20 F_NOHSDP_20 E_UNINSUR_20 ET_INSURSTATUS_20 EP_UNINSUR_20 EPL_UNINSUR_20 F_UNINSUR_20 E_AGE65_20 EP_AGE65_20 EPL_AGE65_20 F_AGE65_20 E_AGE17_20 EP_AGE17_20 EPL_AGE17_20 F_AGE17_20 E_DISABL_20 ET_DISABLSTATUS_20 EP_DISABL_20 EPL_DISABL_20 F_DISABL_20 E_SNGPNT_20 ET_FAMILIES_20 EP_SNGPNT_20 EPL_SNGPNT_20 F_SNGPNT_20 E_LIMENG_20 ET_POPAGE5UP_20 EP_LIMENG_20 EPL_LIMENG_20 F_LIMENG_20 E_MINRTY_20 ET_POPETHRACE_20 EP_MINRTY_20 EPL_MINRTY_20 F_MINRTY_20 E_STRHU_20 E_MUNIT_20 EP_MUNIT_20 EPL_MUNIT_20 F_MUNIT_20 E_MOBILE_20 EP_MOBILE_20 EPL_MOBILE_20 F_MOBILE_20 E_CROWD_20 ET_OCCUPANTS_20 EP_CROWD_20 EPL_CROWD_20 F_CROWD_20 E_NOVEH_20 ET_KNOWNVEH_20 EP_NOVEH_20 EPL_NOVEH_20 F_NOVEH_20 E_GROUPQ_20 ET_HHTYPE_20 EP_GROUPQ_20 EPL_GROUPQ_20 F_GROUPQ_20 SPL_THEME1_20 RPL_THEME1_20 F_THEME1_20 SPL_THEME2_20 RPL_THEME2_20 F_THEME2_20 SPL_THEME3_20 RPL_THEME3_20 F_THEME3_20 SPL_THEME4_20 RPL_THEME4_20 F_THEME4_20 SPL_THEMES_20 RPL_THEMES_20 F_TOTAL_20 pre10_lihtc_project_cnt pre10_lihtc_project_dollars post10_lihtc_project_cnt post10_lihtc_project_dollars lihtc_flag lihtc_eligibility NAME Median_Income_10 Median_Home_Value_10 Median_Income_19 Median_Home_Value_19 Median_Income_10adj Median_Home_Value_10adj Median_Income_Change Median_Income_Change_pct Median_Home_Value_Change Median_Home_Value_Change_pct housing_price_index10 housing_price_index20 county_title cbsa cbsa_code
34001001400 34001 001400 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3736 1893 1503 2135 3736 57.14668 0.9592 1 411 1635 25.137615 0.9866 1 267 401 66.58354 0.9617 1 715 1102 64.88203 0.8844 1 982 1503 65.33599 0.9764 1 511 1696 30.129717 0.90050 1 527 4199 12.5506073 0.672800 0 269 7.200214 0.115100 0 1598 42.77302 0.9935 1 345 2252 15.319716 0.63090 0 787 941 83.63443 0.9990 1 63 3192 1.973684 0.54480 0 3463 3736 92.69272 0.8905 1 1893 427 22.556788 0.7770 1 0 0.000000 0.3251 0 22 1503 1.463739 0.5339 0 705 1503 46.90619 0.85330 1 0 3736 0.000000 0.3512 0 4.495500 0.9585 4 3.283300 0.8640 2 0.8905 0.8818 1 2.84050 0.66710 2 11.509800 0.9048 9 3812 1724 1549 2291 3754 61.028236 0.9760 1 380 1547 24.563672 0.9934 1 117 240 48.75000 0.9237 1 753 1309 57.52483 0.7816 1 870 1549 56.16527 0.9326 1 472 1913 24.673288 0.8987 1 294 3802 7.7327722 0.7558 1 363 9.522560 0.123100 0 1463 38.37880 0.9885 1 508 2339.000 21.718683 0.85640 1 564 948.0000 59.49367 0.9910 1 201 3159 6.3627730 0.7613 1 3389 3812.000 88.90346 0.8683 1 1724 571 33.1206497 0.8294 1 0 0.000000 0.3216 0 83 1549 5.358296 0.7754 1 661 1549.0000 42.672692 0.8448 1 10 3812 0.2623295 0.4739 0 4.5565 0.9673 5 3.720300 0.9522 4 0.8683 0.8605 1 3.2451 0.81590 3 12.390200 0.9595 13 0 0 0 0 0 Yes Census Tract 14, Atlantic County, New Jersey 16780 255800 17487 139100 19464.80 296728 -1977.80 -0.1016091 -157628 -0.5312205 NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001001500 34001 001500 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 1074 901 752 656 1074 61.08007 0.9700 1 43 270 15.925926 0.9242 1 30 70 42.85714 0.7276 0 366 682 53.66569 0.6910 0 396 752 52.65957 0.8458 1 266 921 28.881650 0.88860 1 121 1064 11.3721805 0.613100 0 385 35.847300 0.990200 1 129 12.01117 0.0617 0 321 993 32.326284 0.98460 1 62 195 31.79487 0.8408 1 125 1050 11.904762 0.85620 1 965 1074 89.85102 0.8717 1 901 636 70.588235 0.9304 1 0 0.000000 0.3251 0 10 752 1.329787 0.5133 0 626 752 83.24468 0.98880 1 0 1074 0.000000 0.3512 0 4.241700 0.9134 4 3.733500 0.9515 4 0.8717 0.8632 1 3.10880 0.77090 2 11.955700 0.9362 11 1601 976 810 1001 1601 62.523423 0.9797 1 204 563 36.234458 0.9989 1 74 110 67.27273 0.9848 1 224 700 32.00000 0.2097 0 298 810 36.79012 0.6089 0 379 1145 33.100437 0.9610 1 272 1601 16.9893816 0.9572 1 451 28.169894 0.936300 1 251 15.67770 0.1835 0 411 1350.000 30.444444 0.97330 1 196 446.0000 43.94619 0.9511 1 220 1532 14.3603133 0.8929 1 1435 1601.000 89.63148 0.8738 1 976 451 46.2090164 0.8742 1 0 0.000000 0.3216 0 24 810 2.962963 0.6412 0 546 810.0000 67.407407 0.9401 1 15 1601 0.9369144 0.6832 0 4.5057 0.9617 4 3.937100 0.9752 4 0.8738 0.8659 1 3.4603 0.87740 2 12.776900 0.9705 11 0 0 1 1497998 1 Yes Census Tract 15, Atlantic County, New Jersey 11549 172400 12339 NA 13396.84 199984 -1057.84 -0.0789619 NA NA NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34001002400 34001 002400 NJ New Jersey Atlantic County 1 Northeast Region 2 Middle Atlantic Division 3129 1759 1375 1916 3129 61.23362 0.9705 1 205 1075 19.069767 0.9574 1 28 60 46.66667 0.7987 1 670 1315 50.95057 0.6297 0 698 1375 50.76364 0.8102 1 632 2059 30.694512 0.90660 1 461 2365 19.4926004 0.873700 1 539 17.225951 0.744100 0 850 27.16523 0.7907 1 575 1736 33.122120 0.98650 1 237 594 39.89899 0.9035 1 312 2663 11.716110 0.85490 1 2357 3129 75.32758 0.8038 1 1759 1091 62.023877 0.9176 1 29 1.648664 0.7742 1 57 1375 4.145454 0.7529 1 696 1375 50.61818 0.87140 1 209 3129 6.679450 0.9003 1 4.518400 0.9608 5 4.279700 0.9831 4 0.8038 0.7960 1 4.21640 0.98320 5 13.818300 0.9835 15 2614 1726 1217 1579 2612 60.451761 0.9744 1 290 1171 24.765158 0.9939 1 69 127 54.33071 0.9521 1 538 1090 49.35780 0.5970 0 607 1217 49.87675 0.8624 1 697 1998 34.884885 0.9695 1 551 2614 21.0788064 0.9797 1 516 19.739862 0.679400 0 503 19.24254 0.3999 0 576 2111.000 27.285647 0.95060 1 257 567.0000 45.32628 0.9571 1 556 2368 23.4797297 0.9570 1 2029 2614.000 77.62050 0.8058 1 1726 1166 67.5550406 0.9204 1 0 0.000000 0.3216 0 115 1217 9.449466 0.8840 1 673 1217.0000 55.299918 0.8978 1 223 2614 8.5309870 0.9307 1 4.7799 0.9845 5 3.944000 0.9756 3 0.8058 0.7985 1 3.9545 0.96510 4 13.484200 0.9845 13 0 0 0 0 0 Yes Census Tract 24, Atlantic County, New Jersey 14657 243300 17646 302900 17002.12 282228 643.88 0.0378706 20672 0.0732457 NA NA Atlantic County, New Jersey Atlantic City, NJ MSA C1210
34003015400 34003 015400 NJ New Jersey Bergen County 1 Northeast Region 2 Middle Atlantic Division 5086 2258 2100 1485 5063 29.33044 0.7447 0 195 2873 6.787330 0.4938 0 223 478 46.65272 0.7984 1 876 1622 54.00740 0.6974 0 1099 2100 52.33333 0.8405 1 640 3682 17.381858 0.70160 0 1579 6178 25.5584331 0.949900 1 603 11.856075 0.377400 0 961 18.89501 0.2410 0 534 5000 10.680000 0.31600 0 254 1232 20.61688 0.6975 0 681 4763 14.297712 0.88510 1 3916 5086 76.99567 0.8096 1 2258 1028 45.527015 0.8820 1 0 0.000000 0.3251 0 28 2100 1.333333 0.5139 0 643 2100 30.61905 0.76370 1 57 5086 1.120724 0.7485 0 3.730500 0.8072 2 2.517000 0.5136 1 0.8096 0.8017 1 3.23320 0.81730 2 10.290300 0.7914 6 7543 3570 3054 1638 7543 21.715498 0.6364 0 320 4251 7.527641 0.7462 0 238 752 31.64894 0.6832 0 1211 2302 52.60643 0.6776 0 1449 3054 47.44597 0.8252 1 877 5631 15.574498 0.7611 1 1093 7543 14.4902559 0.9339 1 981 13.005436 0.282700 0 1174 15.56410 0.1785 0 756 6369.000 11.869995 0.37380 0 303 2013.0000 15.05216 0.5737 0 970 7103 13.6562016 0.8846 1 5610 7543.000 74.37359 0.7916 1 3570 1871 52.4089636 0.8898 1 0 0.000000 0.3216 0 258 3054 8.447937 0.8637 1 301 3054.0000 9.855927 0.5207 0 15 7543 0.1988599 0.4315 0 3.9028 0.8603 3 2.293300 0.3701 1 0.7916 0.7845 1 3.0273 0.73680 2 10.015000 0.7805 7 0 0 0 0 0 Yes Census Tract 154, Bergen County, New Jersey 24590 389800 35719 326900 28524.40 452168 7194.60 0.2522262 -125268 -0.2770386 NA NA Bergen County, New Jersey New York-Newark-Bridgeport, NY-NJ-CT-PA CSA CS408
34003018100 34003 018100 NJ New Jersey Bergen County 1 Northeast Region 2 Middle Atlantic Division 6907 2665 2569 1865 6863 27.17470 0.7140 0 242 3781 6.400423 0.4509 0 434 834 52.03837 0.8694 1 1123 1735 64.72622 0.8830 1 1557 2569 60.60724 0.9450 1 1521 4649 32.716713 0.92270 1 2703 7124 37.9421673 0.992200 1 1024 14.825539 0.598800 0 1336 19.34270 0.2674 0 452 5848 7.729138 0.11920 0 363 1614 22.49071 0.7280 0 1324 6571 20.149140 0.93510 1 4209 6907 60.93818 0.7551 1 2665 517 19.399625 0.7487 0 0 0.000000 0.3251 0 136 2569 5.293889 0.7960 1 1043 2569 40.59945 0.82350 1 0 6907 0.000000 0.3512 0 4.024800 0.8697 3 2.648500 0.5885 1 0.7551 0.7477 1 3.04450 0.74620 2 10.472900 0.8112 7 7668 2912 2816 1803 7664 23.525574 0.6750 0 370 4727 7.827375 0.7646 1 441 819 53.84615 0.9501 1 1122 1997 56.18428 0.7544 1 1563 2816 55.50426 0.9274 1 1879 5775 32.536797 0.9576 1 1695 7668 22.1048513 0.9829 1 1041 13.575900 0.316600 0 1193 15.55816 0.1784 0 711 6474.819 10.981001 0.31250 0 197 1914.1749 10.29164 0.3928 0 2045 7161 28.5574640 0.9756 1 5637 7667.630 73.51685 0.7875 1 2912 806 27.6785714 0.7973 1 0 0.000000 0.3216 0 150 2816 5.326704 0.7742 1 833 2816.0423 29.580522 0.7679 1 10 7668 0.1304121 0.3642 0 4.3075 0.9336 4 2.175900 0.2971 1 0.7875 0.7803 1 3.0252 0.73590 3 10.296100 0.8061 9 0 0 0 0 0 Yes Census Tract 181, Bergen County, New Jersey 20495 390100 29008 354100 23774.20 452516 5233.80 0.2201462 -98416 -0.2174862 NA NA Bergen County, New Jersey New York-Newark-Bridgeport, NY-NJ-CT-PA CSA CS408
34005702101 34005 702101 NJ New Jersey Burlington County 1 Northeast Region 2 Middle Atlantic Division 1637 702 483 445 1637 27.18387 0.7142 0 63 456 13.815789 0.8857 1 0 0 NaN NA NA 222 483 45.96273 0.5037 0 222 483 45.96273 0.7085 0 31 903 3.433001 0.08742 0 14 1965 0.7124682 0.008765 0 0 0.000000 0.002836 0 696 42.51680 0.9928 1 62 898 6.904232 0.08018 0 103 452 22.78761 0.7331 0 0 1379 0.000000 0.07335 0 248 1637 15.14966 0.4224 0 702 25 3.561254 0.4247 0 0 0.000000 0.3251 0 0 483 0.000000 0.1459 0 0 483 0.00000 0.01044 0 0 1637 0.000000 0.3512 0 2.404585 0.4890 1 1.882266 0.1557 1 0.4224 0.4183 0 1.25734 0.03853 0 5.966591 0.2021 2 3997 1271 1235 304 3996 7.607608 0.1919 0 46 901 5.105438 0.5252 0 0 0 NaN NA NA 731 1235 59.19028 0.8107 1 731 1235 59.19028 0.9566 1 49 1973 2.483528 0.0993 0 27 3057 0.8832188 0.0568 0 0 0.000000 0.001592 0 1651 41.30598 0.9924 1 58 1412.011 4.107616 0.01556 0 91 1092.7925 8.32729 0.3046 0 32 3347 0.9560801 0.3989 0 1411 3996.883 35.30251 0.5750 0 1271 10 0.7867821 0.2414 0 0 0.000000 0.3216 0 27 1235 2.186235 0.5699 0 11 1234.9741 0.890707 0.0533 0 0 3997 0.0000000 0.1517 0 1.8298 0.3066 1 1.713052 0.1034 1 0.5750 0.5698 0 1.3379 0.06021 0 5.455752 0.1329 2 0 0 0 0 0 Yes Census Tract 7021.01, Burlington County, New Jersey 33625 NA 44370 NA 39005.00 NA 5365.00 0.1375465 NA NA NA NA Burlington County, New Jersey Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA CS428
34005702204 34005 702204 NJ New Jersey Burlington County 1 Northeast Region 2 Middle Atlantic Division 3000 737 678 1208 2479 48.72933 0.9201 1 195 973 20.041110 0.9644 1 141 334 42.21557 0.7153 0 272 344 79.06977 0.9729 1 413 678 60.91445 0.9473 1 479 1828 26.203501 0.85830 1 243 2062 11.7846751 0.635000 0 375 12.500000 0.423100 0 875 29.16667 0.8714 1 247 1502 16.444740 0.69460 0 245 562 43.59431 0.9252 1 188 2656 7.078313 0.78350 1 1581 3000 52.70000 0.7268 0 737 0 0.000000 0.1009 0 0 0.000000 0.3251 0 118 678 17.404130 0.9662 1 79 678 11.65192 0.55970 0 521 3000 17.366667 0.9582 1 4.325100 0.9272 4 3.697800 0.9448 3 0.7268 0.7197 0 2.91010 0.69490 2 11.659800 0.9155 9 2496 766 711 436 2236 19.499105 0.5828 0 168 1119 15.013405 0.9569 1 109 476 22.89916 0.4367 0 172 234 73.50427 0.9602 1 281 710 39.57746 0.6774 0 205 1672 12.260766 0.6634 0 106 2181 4.8601559 0.5382 0 483 19.350962 0.662200 0 561 22.47596 0.6407 0 438 1641.664 26.680248 0.94370 1 95 606.3759 15.66685 0.5916 0 20 2331 0.8580009 0.3785 0 1043 2495.717 41.79160 0.6233 0 766 4 0.5221932 0.2121 0 0 0.000000 0.3216 0 51 711 7.172996 0.8340 1 39 710.5812 5.488465 0.3485 0 313 2496 12.5400641 0.9504 1 3.4187 0.7554 1 3.216700 0.8464 1 0.6233 0.6176 0 2.6666 0.57970 2 9.925300 0.7714 4 0 0 0 0 0 Yes Census Tract 7022.04, Burlington County, New Jersey 17110 231600 24236 195800 19847.60 268656 4388.40 0.2211048 -72856 -0.2711869 114.52 126.87 Burlington County, New Jersey Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA CS428
34007600200 34007 600200 NJ New Jersey Camden County 1 Northeast Region 2 Middle Atlantic Division 2152 988 790 823 2152 38.24349 0.8438 1 219 1183 18.512257 0.9528 1 115 414 27.77778 0.3413 0 299 376 79.52128 0.9744 1 414 790 52.40506 0.8417 1 485 1266 38.309637 0.95530 1 317 2208 14.3568841 0.740200 0 171 7.946097 0.147200 0 627 29.13569 0.8700 1 273 1434 19.037657 0.80620 1 176 471 37.36730 0.8842 1 326 1961 16.624171 0.90730 1 2074 2152 96.37546 0.9239 1 988 54 5.465587 0.4952 0 0 0.000000 0.3251 0 20 790 2.531646 0.6528 0 354 790 44.81013 0.84340 1 0 2152 0.000000 0.3512 0 4.333800 0.9289 4 3.614900 0.9333 4 0.9239 0.9149 1 2.66770 0.58390 1 11.540300 0.9067 10 2111 878 725 851 2111 40.312648 0.8788 1 52 913 5.695509 0.5929 0 69 375 18.40000 0.2795 0 273 350 78.00000 0.9779 1 342 725 47.17241 0.8205 1 407 1376 29.578488 0.9404 1 209 2111 9.9005211 0.8481 1 177 8.384652 0.089330 0 516 24.44339 0.7586 1 453 1595.000 28.401254 0.96070 1 200 448.0000 44.64286 0.9538 1 68 2083 3.2645223 0.6378 0 2111 2111.000 100.00000 0.9976 1 878 14 1.5945330 0.3022 0 10 1.138952 0.7512 1 0 725 0.000000 0.1194 0 239 725.0000 32.965517 0.7908 1 0 2111 0.0000000 0.1517 0 4.0807 0.8946 4 3.400230 0.8937 3 0.9976 0.9885 1 2.1153 0.31270 2 10.593830 0.8340 10 0 0 0 0 0 Yes Census Tract 6002, Camden County, New Jersey 19841 61400 18057 64600 23015.56 71224 -4958.56 -0.2154438 -6624 -0.0930024 NA NA Camden County, New Jersey Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA CS428
34007600400 34007 600400 NJ New Jersey Camden County 1 Northeast Region 2 Middle Atlantic Division 3245 1556 1038 2230 3118 71.52021 0.9895 1 355 1169 30.367836 0.9951 1 130 372 34.94624 0.5405 0 498 666 74.77477 0.9578 1 628 1038 60.50096 0.9442 1 649 1641 39.549056 0.96100 1 905 3153 28.7028227 0.968500 1 188 5.793528 0.066780 0 1123 34.60709 0.9638 1 447 2167 20.627596 0.85890 1 415 736 56.38587 0.9800 1 289 2933 9.853392 0.83120 1 3058 3245 94.23729 0.9033 1 1556 65 4.177378 0.4500 0 0 0.000000 0.3251 0 58 1038 5.587669 0.8052 1 509 1038 49.03661 0.86430 1 203 3245 6.255778 0.8951 1 4.858300 0.9853 5 3.700680 0.9459 4 0.9033 0.8945 1 3.33970 0.85670 3 12.801980 0.9715 13 3373 1557 1335 2125 3373 63.000296 0.9805 1 344 1020 33.725490 0.9987 1 100 409 24.44988 0.4886 0 678 926 73.21814 0.9591 1 778 1335 58.27715 0.9498 1 841 2163 38.881183 0.9823 1 332 3373 9.8428698 0.8461 1 629 18.648088 0.622700 0 1069 31.69286 0.9560 1 747 2304.000 32.421875 0.98120 1 440 788.0000 55.83756 0.9864 1 332 3128 10.6138107 0.8489 1 3282 3373.000 97.30210 0.9417 1 1557 100 6.4226076 0.5014 0 24 1.541426 0.7760 1 60 1335 4.494382 0.7365 0 793 1335.0000 59.400749 0.9136 1 100 3373 2.9647198 0.8250 1 4.7574 0.9834 5 4.395200 0.9861 4 0.9417 0.9332 1 3.7525 0.93580 3 13.846800 0.9859 13 0 0 0 0 0 Yes Census Tract 6004, Camden County, New Jersey 9391 70000 12266 71500 10893.56 81200 1372.44 0.1259864 -9700 -0.1194581 NA NA Camden County, New Jersey Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA CS428
34007600700 34007 600700 NJ New Jersey Camden County 1 Northeast Region 2 Middle Atlantic Division 1723 572 409 457 1342 34.05365 0.8048 1 211 657 32.115677 0.9965 1 125 237 52.74262 0.8787 1 71 172 41.27907 0.3897 0 196 409 47.92176 0.7525 1 495 1142 43.345009 0.97370 1 249 1008 24.7023810 0.942400 1 124 7.196750 0.115000 0 437 25.36274 0.6912 0 144 734 19.618529 0.82660 1 93 271 34.31734 0.8621 1 320 1565 20.447284 0.93700 1 1626 1723 94.37028 0.9044 1 572 28 4.895105 0.4761 0 0 0.000000 0.3251 0 30 409 7.334963 0.8483 1 98 409 23.96088 0.71310 0 381 1723 22.112594 0.9664 1 4.469900 0.9540 5 3.431900 0.8994 3 0.9044 0.8955 1 3.32900 0.85130 2 12.135200 0.9465 11 1618 613 517 988 1618 61.063041 0.9762 1 70 655 10.687023 0.8840 1 85 233 36.48069 0.7849 1 128 284 45.07042 0.4921 0 213 517 41.19923 0.7111 0 477 957 49.843260 0.9969 1 172 1618 10.6304079 0.8688 1 207 12.793572 0.271700 0 604 37.33004 0.9856 1 270 1013.206 26.648079 0.94310 1 149 374.2530 39.81264 0.9275 1 256 1374 18.6317322 0.9302 1 1515 1617.787 93.64644 0.9007 1 613 69 11.2561175 0.6156 0 0 0.000000 0.3216 0 54 517 10.444874 0.9008 1 83 516.9681 16.055148 0.6382 0 18 1618 1.1124845 0.7048 0 4.4370 0.9503 4 4.058100 0.9811 4 0.9007 0.8926 1 3.1810 0.79120 1 12.576800 0.9657 10 0 0 1 0 1 Yes Census Tract 6007, Camden County, New Jersey 16866 92700 15982 75500 19564.56 107532 -3582.56 -0.1831148 -32032 -0.2978834 NA NA Camden County, New Jersey Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA CS428
Code
svi_national_lihtc_df0 <- left_join(svi_national_lihtc, census_pull_df, join_by("GEOID_2010_trt" == "GEOID"))

svi_national_lihtc_df1 <- left_join(svi_national_lihtc_df0, hpi_df_10_20, join_by("GEOID_2010_trt" == "GEOID10")) %>%
                          unite("county_fips", FIPS_st, FIPS_county, sep = "") 

svi_national_lihtc_df <- left_join(svi_national_lihtc_df1, msa_csa_crosswalk, join_by("county_fips" == "county_fips"))

svi_national_lihtc_df %>% head(10) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt county_fips FIPS_tract state state_name county region_number region division_number division E_TOTPOP_10 E_HU_10 E_HH_10 E_POV150_10 ET_POVSTATUS_10 EP_POV150_10 EPL_POV150_10 F_POV150_10 E_UNEMP_10 ET_EMPSTATUS_10 EP_UNEMP_10 EPL_UNEMP_10 F_UNEMP_10 E_HBURD_OWN_10 ET_HOUSINGCOST_OWN_10 EP_HBURD_OWN_10 EPL_HBURD_OWN_10 F_HBURD_OWN_10 E_HBURD_RENT_10 ET_HOUSINGCOST_RENT_10 EP_HBURD_RENT_10 EPL_HBURD_RENT_10 F_HBURD_RENT_10 E_HBURD_10 ET_HOUSINGCOST_10 EP_HBURD_10 EPL_HBURD_10 F_HBURD_10 E_NOHSDP_10 ET_EDSTATUS_10 EP_NOHSDP_10 EPL_NOHSDP_10 F_NOHSDP_10 E_UNINSUR_12 ET_INSURSTATUS_12 EP_UNINSUR_12 EPL_UNINSUR_12 F_UNINSUR_12 E_AGE65_10 EP_AGE65_10 EPL_AGE65_10 F_AGE65_10 E_AGE17_10 EP_AGE17_10 EPL_AGE17_10 F_AGE17_10 E_DISABL_12 ET_DISABLSTATUS_12 EP_DISABL_12 EPL_DISABL_12 F_DISABL_12 E_SNGPNT_10 ET_FAMILIES_10 EP_SNGPNT_10 EPL_SNGPNT_10 F_SNGPNT_10 E_LIMENG_10 ET_POPAGE5UP_10 EP_LIMENG_10 EPL_LIMENG_10 F_LIMENG_10 E_MINRTY_10 ET_POPETHRACE_10 EP_MINRTY_10 EPL_MINRTY_10 F_MINRTY_10 E_STRHU_10 E_MUNIT_10 EP_MUNIT_10 EPL_MUNIT_10 F_MUNIT_10 E_MOBILE_10 EP_MOBILE_10 EPL_MOBILE_10 F_MOBILE_10 E_CROWD_10 ET_OCCUPANTS_10 EP_CROWD_10 EPL_CROWD_10 F_CROWD_10 E_NOVEH_10 ET_KNOWNVEH_10 EP_NOVEH_10 EPL_NOVEH_10 F_NOVEH_10 E_GROUPQ_10 ET_HHTYPE_10 EP_GROUPQ_10 EPL_GROUPQ_10 F_GROUPQ_10 SPL_THEME1_10 RPL_THEME1_10 F_THEME1_10 SPL_THEME2_10 RPL_THEME2_10 F_THEME2_10 SPL_THEME3_10 RPL_THEME3_10 F_THEME3_10 SPL_THEME4_10 RPL_THEME4_10 F_THEME4_10 SPL_THEMES_10 RPL_THEMES_10 F_TOTAL_10 E_TOTPOP_20 E_HU_20 E_HH_20 E_POV150_20 ET_POVSTATUS_20 EP_POV150_20 EPL_POV150_20 F_POV150_20 E_UNEMP_20 ET_EMPSTATUS_20 EP_UNEMP_20 EPL_UNEMP_20 F_UNEMP_20 E_HBURD_OWN_20 ET_HOUSINGCOST_OWN_20 EP_HBURD_OWN_20 EPL_HBURD_OWN_20 F_HBURD_OWN_20 E_HBURD_RENT_20 ET_HOUSINGCOST_RENT_20 EP_HBURD_RENT_20 EPL_HBURD_RENT_20 F_HBURD_RENT_20 E_HBURD_20 ET_HOUSINGCOST_20 EP_HBURD_20 EPL_HBURD_20 F_HBURD_20 E_NOHSDP_20 ET_EDSTATUS_20 EP_NOHSDP_20 EPL_NOHSDP_20 F_NOHSDP_20 E_UNINSUR_20 ET_INSURSTATUS_20 EP_UNINSUR_20 EPL_UNINSUR_20 F_UNINSUR_20 E_AGE65_20 EP_AGE65_20 EPL_AGE65_20 F_AGE65_20 E_AGE17_20 EP_AGE17_20 EPL_AGE17_20 F_AGE17_20 E_DISABL_20 ET_DISABLSTATUS_20 EP_DISABL_20 EPL_DISABL_20 F_DISABL_20 E_SNGPNT_20 ET_FAMILIES_20 EP_SNGPNT_20 EPL_SNGPNT_20 F_SNGPNT_20 E_LIMENG_20 ET_POPAGE5UP_20 EP_LIMENG_20 EPL_LIMENG_20 F_LIMENG_20 E_MINRTY_20 ET_POPETHRACE_20 EP_MINRTY_20 EPL_MINRTY_20 F_MINRTY_20 E_STRHU_20 E_MUNIT_20 EP_MUNIT_20 EPL_MUNIT_20 F_MUNIT_20 E_MOBILE_20 EP_MOBILE_20 EPL_MOBILE_20 F_MOBILE_20 E_CROWD_20 ET_OCCUPANTS_20 EP_CROWD_20 EPL_CROWD_20 F_CROWD_20 E_NOVEH_20 ET_KNOWNVEH_20 EP_NOVEH_20 EPL_NOVEH_20 F_NOVEH_20 E_GROUPQ_20 ET_HHTYPE_20 EP_GROUPQ_20 EPL_GROUPQ_20 F_GROUPQ_20 SPL_THEME1_20 RPL_THEME1_20 F_THEME1_20 SPL_THEME2_20 RPL_THEME2_20 F_THEME2_20 SPL_THEME3_20 RPL_THEME3_20 F_THEME3_20 SPL_THEME4_20 RPL_THEME4_20 F_THEME4_20 SPL_THEMES_20 RPL_THEMES_20 F_TOTAL_20 pre10_lihtc_project_cnt pre10_lihtc_project_dollars post10_lihtc_project_cnt post10_lihtc_project_dollars lihtc_flag lihtc_eligibility NAME Median_Income_10 Median_Home_Value_10 Median_Income_19 Median_Home_Value_19 Median_Income_10adj Median_Home_Value_10adj Median_Income_Change Median_Income_Change_pct Median_Home_Value_Change Median_Home_Value_Change_pct housing_price_index10 housing_price_index20 county_title cbsa cbsa_code
01005950700 01005 950700 AL Alabama Barbour County 3 South Region 6 East South Central Division 1753 687 563 615 1628 37.77641 0.8088 1 17 667 2.548726 0.06941 0 41 376 10.90426 0.01945 0 62 187 33.15508 0.24640 0 103 563 18.29485 0.04875 0 264 1208 21.85430 0.7570 1 201 1527 13.163065 0.4991 0 368 20.992584 0.89510 1 462 26.354820 0.66130 0 211 1085 19.44700 0.7505 1 107 399 26.81704 0.8048 1 0 1628 0.0000000 0.09298 0 861 1753 49.11580 0.7101 0 687 17 2.4745269 0.4324 0 38 5.5312955 0.6970 0 3 563 0.5328597 0.3037 0 19 563 3.374778 0.3529 0 233 1753 13.29150 0.9517 1 2.18306 0.4137 2 3.20468 0.8377 3 0.7101 0.7035 0 2.7377 0.6100 1 8.83554 0.6264 6 1527 691 595 565 1365 41.39194 0.8765 1 37 572 6.468532 0.6776 0 70 376 18.617021 0.38590 0 92 219 42.009132 0.47360 0 162 595 27.22689 0.44540 0 280 1114 25.13465 0.8942 1 105 1378 7.619739 0.5505 0 383 25.081860 0.88450 1 337 22.069417 0.51380 0 237 1041.0000 22.76657 0.8360 1 144 413.0000 34.86683 0.9114 1 11 1466 0.7503411 0.40700 0 711 1527.0000 46.56189 0.6441 0 691 13 1.8813314 0.3740 0 37 5.3545586 0.7152 0 0 595 0.0000000 0.09796 0 115 595.0000 19.327731 0.8859 1 149 1527 9.7576948 0.9470 1 3.44420 0.7707 2 3.55270 0.9403 3 0.6441 0.6387 0 3.02006 0.7337 2 10.66106 0.8537 7 0 0 0 0 0 Yes Census Tract 9507, Barbour County, Alabama 15257 133700 17244 137500 17698.12 155092 -454.12 -0.0256592 -17592 -0.1134294 131.05 135.61 Barbour County, Alabama Eufaula, AL-GA MicroSA C2164
01011952100 01011 952100 AL Alabama Bullock County 3 South Region 6 East South Central Division 1652 796 554 564 1652 34.14044 0.7613 1 46 816 5.637255 0.33630 0 96 458 20.96070 0.19930 0 62 96 64.58333 0.89170 1 158 554 28.51986 0.29220 0 271 1076 25.18587 0.8163 1 155 1663 9.320505 0.3183 0 199 12.046005 0.47180 0 420 25.423729 0.60240 0 327 1279 25.56685 0.9151 1 137 375 36.53333 0.9108 1 0 1590 0.0000000 0.09298 0 1428 1652 86.44068 0.8939 1 796 0 0.0000000 0.1224 0 384 48.2412060 0.9897 1 19 554 3.4296029 0.7145 0 45 554 8.122744 0.6556 0 0 1652 0.00000 0.3640 0 2.52440 0.5138 2 2.99308 0.7515 2 0.8939 0.8856 1 2.8462 0.6637 1 9.25758 0.6790 6 1382 748 549 742 1382 53.69030 0.9560 1 40 511 7.827789 0.7730 1 110 402 27.363184 0.71780 0 45 147 30.612245 0.23070 0 155 549 28.23315 0.47730 0 181 905 20.00000 0.8253 1 232 1382 16.787265 0.8813 1 164 11.866860 0.27170 0 250 18.089725 0.26290 0 258 1132.0000 22.79152 0.8368 1 99 279.0000 35.48387 0.9162 1 33 1275 2.5882353 0.64520 0 1347 1382.0000 97.46744 0.9681 1 748 0 0.0000000 0.1079 0 375 50.1336898 0.9922 1 0 549 0.0000000 0.09796 0 37 549.0000 6.739526 0.6039 0 0 1382 0.0000000 0.1831 0 3.91290 0.8785 4 2.93280 0.7342 2 0.9681 0.9599 1 1.98506 0.2471 1 9.79886 0.7570 8 0 0 0 0 0 Yes Census Tract 9521, Bullock County, Alabama 19754 58200 18598 66900 22914.64 67512 -4316.64 -0.1883791 -612 -0.0090651 NA NA NA NA NA
01015000300 01015 000300 AL Alabama Calhoun County 3 South Region 6 East South Central Division 3074 1635 1330 1904 3067 62.08021 0.9710 1 293 1362 21.512482 0.96630 1 180 513 35.08772 0.65450 0 383 817 46.87882 0.55040 0 563 1330 42.33083 0.70280 0 720 2127 33.85049 0.9148 1 628 2835 22.151675 0.8076 1 380 12.361744 0.49340 0 713 23.194535 0.45030 0 647 2111 30.64898 0.9708 1 298 773 38.55110 0.9247 1 0 2878 0.0000000 0.09298 0 2623 3074 85.32856 0.8883 1 1635 148 9.0519878 0.6465 0 6 0.3669725 0.4502 0 68 1330 5.1127820 0.8082 1 303 1330 22.781955 0.9029 1 0 3074 0.00000 0.3640 0 4.36250 0.9430 4 2.93218 0.7233 2 0.8883 0.8800 1 3.1718 0.8070 2 11.35478 0.9009 9 2390 1702 1282 1287 2390 53.84937 0.9566 1 102 1066 9.568480 0.8541 1 158 609 25.944171 0.67520 0 286 673 42.496285 0.48560 0 444 1282 34.63339 0.66340 0 467 1685 27.71513 0.9180 1 369 2379 15.510719 0.8562 1 342 14.309623 0.40850 0 548 22.928870 0.57100 0 647 1831.0000 35.33588 0.9862 1 202 576.0000 35.06944 0.9130 1 16 2134 0.7497657 0.40690 0 1896 2390.0000 79.33054 0.8451 1 1702 96 5.6404230 0.5329 0 0 0.0000000 0.2186 0 0 1282 0.0000000 0.09796 0 186 1282.0000 14.508580 0.8308 1 43 2390 1.7991632 0.7727 1 4.24830 0.9395 4 3.28560 0.8773 2 0.8451 0.8379 1 2.45296 0.4602 2 10.83196 0.8718 9 0 0 0 0 0 Yes Census Tract 3, Calhoun County, Alabama 12211 41700 18299 51300 14164.76 48372 4134.24 0.2918680 2928 0.0605309 NA NA Calhoun County, Alabama Anniston-Oxford, AL MSA C1150
01015000500 01015 000500 AL Alabama Calhoun County 3 South Region 6 East South Central Division 1731 1175 743 1042 1619 64.36072 0.9767 1 124 472 26.271186 0.98460 1 136 461 29.50108 0.48970 0 163 282 57.80142 0.79190 1 299 743 40.24226 0.64910 0 340 1270 26.77165 0.8389 1 460 1794 25.641026 0.8722 1 271 15.655690 0.70190 0 368 21.259388 0.32190 0 507 1449 34.98965 0.9885 1 150 386 38.86010 0.9269 1 0 1677 0.0000000 0.09298 0 1559 1731 90.06355 0.9123 1 1175 50 4.2553191 0.5128 0 4 0.3404255 0.4480 0 0 743 0.0000000 0.1238 0 122 743 16.419919 0.8473 1 0 1731 0.00000 0.3640 0 4.32150 0.9362 4 3.03218 0.7679 2 0.9123 0.9038 1 2.2959 0.3818 1 10.56188 0.8244 8 940 907 488 586 940 62.34043 0.9815 1 59 297 19.865320 0.9833 1 100 330 30.303030 0.79220 1 58 158 36.708861 0.34970 0 158 488 32.37705 0.60200 0 199 795 25.03145 0.8930 1 118 940 12.553192 0.7770 1 246 26.170213 0.90530 1 118 12.553192 0.08233 0 383 822.5089 46.56484 0.9984 1 30 197.8892 15.16000 0.5363 0 0 889 0.0000000 0.09479 0 898 940.3866 95.49264 0.9489 1 907 0 0.0000000 0.1079 0 2 0.2205072 0.4456 0 2 488 0.4098361 0.23670 0 146 487.6463 29.939736 0.9404 1 0 940 0.0000000 0.1831 0 4.23680 0.9379 4 2.61712 0.5593 2 0.9489 0.9409 1 1.91370 0.2196 1 9.71652 0.7468 8 0 0 0 0 0 Yes Census Tract 5, Calhoun County, Alabama 11742 38800 13571 38800 13620.72 45008 -49.72 -0.0036503 -6208 -0.1379310 NA NA Calhoun County, Alabama Anniston-Oxford, AL MSA C1150
01015000600 01015 000600 AL Alabama Calhoun County 3 South Region 6 East South Central Division 2571 992 796 1394 2133 65.35396 0.9789 1 263 905 29.060773 0.98990 1 121 306 39.54248 0.75940 1 209 490 42.65306 0.44810 0 330 796 41.45729 0.68030 0 641 1556 41.19537 0.9554 1 416 1760 23.636364 0.8383 1 220 8.556982 0.24910 0 584 22.714897 0.41610 0 539 1353 39.83740 0.9955 1 243 466 52.14592 0.9783 1 30 2366 1.2679628 0.48990 0 1944 2571 75.61260 0.8440 1 992 164 16.5322581 0.7673 1 8 0.8064516 0.5110 0 46 796 5.7788945 0.8329 1 184 796 23.115578 0.9049 1 614 2571 23.88176 0.9734 1 4.44280 0.9548 4 3.12890 0.8088 2 0.8440 0.8362 1 3.9895 0.9792 4 12.40520 0.9696 11 1950 964 719 837 1621 51.63479 0.9467 1 157 652 24.079755 0.9922 1 22 364 6.043956 0.01547 0 129 355 36.338028 0.34200 0 151 719 21.00139 0.23030 0 363 1387 26.17159 0.9048 1 351 1613 21.760694 0.9435 1 249 12.769231 0.32090 0 356 18.256410 0.27140 0 332 1259.7041 26.35540 0.9135 1 136 435.6156 31.22018 0.8775 1 0 1891 0.0000000 0.09479 0 1463 1949.9821 75.02633 0.8219 1 964 14 1.4522822 0.3459 0 8 0.8298755 0.5269 0 19 719 2.6425591 0.61120 0 197 719.0542 27.397100 0.9316 1 329 1950 16.8717949 0.9655 1 4.01750 0.9001 4 2.47809 0.4764 2 0.8219 0.8149 1 3.38110 0.8712 2 10.69859 0.8583 9 0 0 0 0 0 Yes Census Tract 6, Calhoun County, Alabama 10958 48000 14036 43300 12711.28 55680 1324.72 0.1042161 -12380 -0.2223420 NA NA Calhoun County, Alabama Anniston-Oxford, AL MSA C1150
01015002101 01015 002101 AL Alabama Calhoun County 3 South Region 6 East South Central Division 3872 1454 1207 1729 2356 73.38710 0.9916 1 489 2020 24.207921 0.97860 1 20 168 11.90476 0.02541 0 718 1039 69.10491 0.93320 1 738 1207 61.14333 0.96900 1 113 725 15.58621 0.6035 0 664 3943 16.839970 0.6495 0 167 4.313016 0.05978 0 238 6.146694 0.02255 0 264 2359 11.19118 0.3027 0 94 263 35.74144 0.9050 1 46 3769 1.2204829 0.48250 0 1601 3872 41.34814 0.6572 0 1454 761 52.3383769 0.9504 1 65 4.4704264 0.6738 0 5 1207 0.4142502 0.2791 0 113 1207 9.362055 0.7004 0 1516 3872 39.15289 0.9860 1 4.19220 0.9133 3 1.77253 0.1304 1 0.6572 0.6511 0 3.5897 0.9337 2 10.21163 0.7885 6 3238 1459 1014 1082 1836 58.93246 0.9735 1 251 1403 17.890235 0.9767 1 31 155 20.000000 0.44920 0 515 859 59.953434 0.85540 1 546 1014 53.84615 0.95350 1 134 916 14.62882 0.7033 0 251 3238 7.751699 0.5588 0 167 5.157505 0.03597 0 169 5.219271 0.02111 0 323 1667.0000 19.37612 0.7205 0 94 277.0000 33.93502 0.9040 1 0 3164 0.0000000 0.09479 0 1045 3238.0000 32.27301 0.5125 0 1459 607 41.6038382 0.9185 1 65 4.4551062 0.6949 0 24 1014 2.3668639 0.57900 0 85 1014.0000 8.382643 0.6775 0 1402 3238 43.2983323 0.9876 1 4.16580 0.9263 3 1.77637 0.1225 1 0.5125 0.5082 0 3.85750 0.9661 2 10.31217 0.8160 6 0 0 0 0 0 Yes Census Tract 21.01, Calhoun County, Alabama 4968 92000 9312 153500 5762.88 106720 3549.12 0.6158587 46780 0.4383433 NA NA Calhoun County, Alabama Anniston-Oxford, AL MSA C1150
01015002300 01015 002300 AL Alabama Calhoun County 3 South Region 6 East South Central Division 3882 1861 1608 1366 3882 35.18805 0.7753 1 186 1539 12.085770 0.80740 1 284 1109 25.60866 0.35530 0 202 499 40.48096 0.39670 0 486 1608 30.22388 0.34700 0 727 2610 27.85441 0.8534 1 547 3706 14.759849 0.5669 0 716 18.444101 0.82530 1 904 23.286966 0.45720 0 719 2919 24.63172 0.8986 1 207 1191 17.38035 0.5923 0 0 3720 0.0000000 0.09298 0 490 3882 12.62236 0.3118 0 1861 38 2.0419130 0.4070 0 199 10.6931757 0.7836 1 52 1608 3.2338308 0.6986 0 166 1608 10.323383 0.7304 0 0 3882 0.00000 0.3640 0 3.35000 0.7384 3 2.86638 0.6919 2 0.3118 0.3089 0 2.9836 0.7289 1 9.51178 0.7100 6 3265 1774 1329 1103 3265 33.78254 0.7880 1 122 1422 8.579465 0.8131 1 101 844 11.966825 0.10960 0 126 485 25.979381 0.15930 0 227 1329 17.08051 0.11070 0 267 2122 12.58247 0.6388 0 328 3265 10.045942 0.6808 0 440 13.476263 0.36070 0 843 25.819296 0.74470 0 530 2422.0000 21.88274 0.8097 1 254 861.0000 29.50058 0.8574 1 0 3026 0.0000000 0.09479 0 811 3265.0000 24.83920 0.4221 0 1774 7 0.3945885 0.2444 0 338 19.0529876 0.8924 1 19 1329 1.4296464 0.44520 0 120 1329.0000 9.029345 0.7016 0 0 3265 0.0000000 0.1831 0 3.03140 0.6608 2 2.86729 0.7016 2 0.4221 0.4185 0 2.46670 0.4669 1 8.78749 0.6230 5 0 0 0 0 0 Yes Census Tract 23, Calhoun County, Alabama 15086 77500 21540 78500 17499.76 89900 4040.24 0.2308740 -11400 -0.1268076 120.54 131.82 Calhoun County, Alabama Anniston-Oxford, AL MSA C1150
01023956700 01023 956700 AL Alabama Choctaw County 3 South Region 6 East South Central Division 3011 1772 1179 1715 3011 56.95782 0.9531 1 266 890 29.887640 0.99100 1 267 1035 25.79710 0.36240 0 79 144 54.86111 0.73440 0 346 1179 29.34690 0.31850 0 738 2053 35.94739 0.9287 1 543 2904 18.698347 0.7133 0 569 18.897376 0.84040 1 648 21.521089 0.33840 0 813 2273 35.76771 0.9901 1 252 771 32.68482 0.8778 1 0 2880 0.0000000 0.09298 0 2455 3011 81.53437 0.8712 1 1772 38 2.1444695 0.4136 0 485 27.3702032 0.9349 1 72 1179 6.1068702 0.8435 1 109 1179 9.245123 0.6964 0 0 3011 0.00000 0.3640 0 3.90460 0.8597 3 3.13968 0.8131 3 0.8712 0.8631 1 3.2524 0.8387 2 11.16788 0.8840 9 3335 1912 1362 1135 3313 34.25898 0.7948 1 188 1147 16.390584 0.9686 1 212 1058 20.037807 0.45090 0 27 304 8.881579 0.02679 0 239 1362 17.54772 0.12350 0 466 2537 18.36815 0.7948 1 495 3335 14.842579 0.8413 1 791 23.718141 0.85250 1 613 18.380810 0.27840 0 884 2714.0000 32.57185 0.9752 1 230 918.0000 25.05447 0.7925 1 25 3103 0.8056719 0.41920 0 2637 3335.0000 79.07046 0.8436 1 1912 0 0.0000000 0.1079 0 758 39.6443515 0.9799 1 16 1362 1.1747430 0.40060 0 75 1362.0000 5.506608 0.5316 0 8 3335 0.2398801 0.4965 0 3.52300 0.7901 4 3.31780 0.8870 3 0.8436 0.8365 1 2.51650 0.4924 1 10.20090 0.8033 9 0 0 0 0 0 Yes Census Tract 9567, Choctaw County, Alabama 12737 60900 16852 63400 14774.92 70644 2077.08 0.1405815 -7244 -0.1025423 NA NA NA NA NA
01023957000 01023 957000 AL Alabama Choctaw County 3 South Region 6 East South Central Division 2567 1187 916 767 2567 29.87924 0.6933 0 145 1060 13.679245 0.86050 1 101 719 14.04729 0.04540 0 43 197 21.82741 0.09791 0 144 916 15.72052 0.02333 0 355 1704 20.83333 0.7366 0 289 2296 12.587108 0.4736 0 324 12.621737 0.51120 0 688 26.801714 0.68810 0 572 1746 32.76060 0.9809 1 121 636 19.02516 0.6414 0 5 2283 0.2190101 0.22520 0 1314 2567 51.18816 0.7225 0 1187 0 0.0000000 0.1224 0 335 28.2224094 0.9394 1 13 916 1.4192140 0.4834 0 70 916 7.641921 0.6353 0 0 2567 0.00000 0.3640 0 2.78733 0.5903 1 3.04680 0.7745 1 0.7225 0.7158 0 2.5445 0.5114 1 9.10113 0.6601 3 2077 1158 866 759 2072 36.63127 0.8256 1 61 780 7.820513 0.7726 1 106 735 14.421769 0.19760 0 11 131 8.396947 0.02525 0 117 866 13.51039 0.04053 0 351 1464 23.97541 0.8815 1 205 2077 9.870005 0.6729 0 402 19.354839 0.68820 0 496 23.880597 0.63430 0 466 1576.0000 29.56853 0.9544 1 154 612.0000 25.16340 0.7942 1 0 2002 0.0000000 0.09479 0 1018 2077.0000 49.01300 0.6638 0 1158 0 0.0000000 0.1079 0 439 37.9101900 0.9766 1 0 866 0.0000000 0.09796 0 42 866.0000 4.849884 0.4884 0 5 2077 0.2407318 0.4971 0 3.19313 0.7061 3 3.16589 0.8369 2 0.6638 0.6582 0 2.16796 0.3247 1 9.19078 0.6792 6 0 0 0 0 0 Yes Census Tract 9570, Choctaw County, Alabama 16224 51600 21740 74000 18819.84 59856 2920.16 0.1551639 14144 0.2363005 NA NA NA NA NA
01031010500 01031 010500 AL Alabama Coffee County 3 South Region 6 East South Central Division 4529 1950 1664 1649 4022 40.99950 0.8432 1 114 1424 8.005618 0.56260 0 309 1057 29.23368 0.48130 0 251 607 41.35091 0.41690 0 560 1664 33.65385 0.45740 0 1269 3370 37.65579 0.9387 1 516 4279 12.058892 0.4492 0 832 18.370501 0.82310 1 894 19.739457 0.23950 0 1023 3404 30.05288 0.9666 1 303 1112 27.24820 0.8108 1 43 4270 1.0070258 0.44510 0 1761 4529 38.88276 0.6383 0 1950 6 0.3076923 0.2576 0 276 14.1538462 0.8279 1 8 1664 0.4807692 0.2925 0 125 1664 7.512019 0.6289 0 507 4529 11.19452 0.9441 1 3.25110 0.7138 2 3.28510 0.8639 3 0.6383 0.6324 0 2.9510 0.7136 2 10.12550 0.7794 7 4815 2118 1731 1329 4470 29.73154 0.7256 0 147 1903 7.724645 0.7670 1 209 1256 16.640127 0.29310 0 208 475 43.789474 0.51620 0 417 1731 24.09012 0.33700 0 953 3728 25.56330 0.8985 1 668 4485 14.894091 0.8425 1 1053 21.869159 0.79500 1 766 15.908619 0.16760 0 1010 3719.0000 27.15784 0.9262 1 243 1133.0000 21.44748 0.7184 0 1 4577 0.0218484 0.19150 0 1643 4815.0000 34.12253 0.5321 0 2118 0 0.0000000 0.1079 0 475 22.4268178 0.9157 1 37 1731 2.1374928 0.55080 0 144 1731.0000 8.318891 0.6750 0 330 4815 6.8535826 0.9282 1 3.57060 0.8018 3 2.79870 0.6649 2 0.5321 0.5276 0 3.17760 0.7990 2 10.07900 0.7892 7 0 0 0 0 0 Yes Census Tract 105, Coffee County, Alabama 14641 88000 21367 78100 16983.56 102080 4383.44 0.2580990 -23980 -0.2349138 128.88 137.26 Coffee County, Alabama Dothan-Enterprise-Ozark, AL CSA CS222

Tract Characteristics

Now that we have our data sets created, let’s compare the characteristics of our enrolled tracts versus those that did not enroll:

NMTC National

We can see that there are several more non-participant tracts than participant tracts:

Code
# Enrolled in NMTC program
svi_national_nmtc_df %>% filter(nmtc_flag == 1) %>% nrow()
[1] 2054
Code
# Eligible, but did not enroll in NMTC program
svi_national_nmtc_df %>% filter(nmtc_flag == 0) %>% nrow()
[1] 27014

We can also see that incomes and housing burdened percentages are similar between participant and non-participant tracts. However, poverty appears to be somewhat higher in participant tracts than non-participant tracts.

Code
# Enrolled in NMTC program
svi_national_nmtc_df %>% 
  filter(nmtc_flag == 1) %>% 
  summarise(Median_Income_10_mean = mean(Median_Income_10, na.rm = TRUE),
            Median_Income_19_mean = mean(Median_Income_19, na.rm = TRUE),
            Poverty_Percentage10_mean = mean(EP_POV150_10, na.rm = TRUE),
            Poverty_Percentage20_mean = mean(EP_POV150_20, na.rm = TRUE),
            Housing_Cost_Burden10_mean = mean(EP_HBURD_10, na.rm = TRUE),
            Housing_Cost_Burden20_mean = mean(EP_HBURD_20, na.rm = TRUE),
            ) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
Median_Income_10_mean Median_Income_19_mean Poverty_Percentage10_mean Poverty_Percentage20_mean Housing_Cost_Burden10_mean Housing_Cost_Burden20_mean
18133.46 22506.39 43.4903 39.48449 43.12589 38.06896
Code
# Eligible, but did not enroll in NMTC program
svi_national_nmtc_df %>% 
  filter(nmtc_flag == 0) %>% 
  summarise(Median_Income_10_mean = mean(Median_Income_10, na.rm = TRUE),
            Median_Income_19_mean = mean(Median_Income_19, na.rm = TRUE),
            Poverty_Percentage10_mean = mean(EP_POV150_10, na.rm = TRUE),
            Poverty_Percentage20_mean = mean(EP_POV150_20, na.rm = TRUE),
            Housing_Cost_Burden10_mean = mean(EP_HBURD_10, na.rm = TRUE),
            Housing_Cost_Burden20_mean = mean(EP_HBURD_20, na.rm = TRUE),
            ) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
Median_Income_10_mean Median_Income_19_mean Poverty_Percentage10_mean Poverty_Percentage20_mean Housing_Cost_Burden10_mean Housing_Cost_Burden20_mean
20640.94 24515.68 36.00355 33.68825 40.80851 36.05171

NMTC Divisional

Similar to the national data, we can see that there are several more non-participant tracts than participant tracts:

Code
# Enrolled in NMTC program
svi_divisional_nmtc_df %>% filter(nmtc_flag == 1) %>% nrow()
[1] 174
Code
# Eligible, but did not enroll in NMTC program
svi_divisional_nmtc_df %>% filter(nmtc_flag == 0) %>% nrow()
[1] 3530

Also similar to national data, incomes and housing burdened percentages are similar between participant and non-participant tracts. However, the difference in poverty is even more pronounced on a divisional level with participant tracts having a mean >10% higher.

Code
# Enrolled in NMTC program
svi_divisional_nmtc_df %>% 
  filter(nmtc_flag == 1) %>% 
  summarise(Median_Income_10_mean = mean(Median_Income_10, na.rm = TRUE),
            Median_Income_19_mean = mean(Median_Income_19, na.rm = TRUE),
            Poverty_Percentage10_mean = mean(EP_POV150_10, na.rm = TRUE),
            Poverty_Percentage20_mean = mean(EP_POV150_20, na.rm = TRUE),
            Housing_Cost_Burden10_mean = mean(EP_HBURD_10, na.rm = TRUE),
            Housing_Cost_Burden20_mean = mean(EP_HBURD_20, na.rm = TRUE),
            ) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
Median_Income_10_mean Median_Income_19_mean Poverty_Percentage10_mean Poverty_Percentage20_mean Housing_Cost_Burden10_mean Housing_Cost_Burden20_mean
18069.68 23212.78 46.49468 42.03539 48.32522 44.23162
Code
# Eligible, but did not enroll in NMTC program
svi_divisional_nmtc_df %>% 
  filter(nmtc_flag == 0) %>% 
  summarise(Median_Income_10_mean = mean(Median_Income_10, na.rm = TRUE),
            Median_Income_19_mean = mean(Median_Income_19, na.rm = TRUE),
            Poverty_Percentage10_mean = mean(EP_POV150_10, na.rm = TRUE),
            Poverty_Percentage20_mean = mean(EP_POV150_20, na.rm = TRUE),
            Housing_Cost_Burden10_mean = mean(EP_HBURD_10, na.rm = TRUE),
            Housing_Cost_Burden20_mean = mean(EP_HBURD_20, na.rm = TRUE),
            ) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
Median_Income_10_mean Median_Income_19_mean Poverty_Percentage10_mean Poverty_Percentage20_mean Housing_Cost_Burden10_mean Housing_Cost_Burden20_mean
21525.76 25641.17 34.53223 33.08926 45.27037 41.71701

We can check the range of poverty to our data:

Code
pov_nmtc_participant <- svi_divisional_nmtc_df %>% 
  filter(nmtc_flag == 1) %>% select(EP_POV150_10)

quantile(pov_nmtc_participant$EP_POV150_10)
      0%      25%      50%      75%     100% 
14.68085 35.95900 44.90766 56.14942 89.90826 
Code
pov_nmtc_nonparticipant <- svi_divisional_nmtc_df %>% 
  filter(nmtc_flag == 0) %>% select(EP_POV150_10)

quantile(pov_nmtc_nonparticipant$EP_POV150_10)
       0%       25%       50%       75%      100% 
  0.00000  22.95262  32.27176  44.24991 100.00000 

If we explore the tracts with 0 poverty, we can see that they have other areas of vulnerability that still makes them eligible for the program such as high rates of group quarters dwellers, housing burdened, and/or disabled:

Code
svi_divisional_nmtc_df %>% 
  filter(nmtc_flag == 0) %>% filter(EP_POV150_10 == 0)
# A tibble: 3 × 244
  GEOID_2010_trt county_fips FIPS_tract state state_name   county  region_number
  <chr>          <chr>       <chr>      <chr> <chr>        <chr>           <dbl>
1 34025809903    34025       809903     NJ    New Jersey   Monmou…             1
2 36109001200    36109       001200     NY    New York     Tompki…             1
3 42119980800    42119       980800     PA    Pennsylvania Union …             1
# ℹ 237 more variables: region <chr>, division_number <dbl>, division <chr>,
#   E_TOTPOP_10 <dbl>, E_HU_10 <dbl>, E_HH_10 <dbl>, E_POV150_10 <dbl>,
#   ET_POVSTATUS_10 <dbl>, EP_POV150_10 <dbl>, EPL_POV150_10 <dbl>,
#   F_POV150_10 <dbl>, E_UNEMP_10 <dbl>, ET_EMPSTATUS_10 <dbl>,
#   EP_UNEMP_10 <dbl>, EPL_UNEMP_10 <dbl>, F_UNEMP_10 <dbl>,
#   E_HBURD_OWN_10 <dbl>, ET_HOUSINGCOST_OWN_10 <dbl>, EP_HBURD_OWN_10 <dbl>,
#   EPL_HBURD_OWN_10 <dbl>, F_HBURD_OWN_10 <dbl>, E_HBURD_RENT_10 <dbl>, …

LIHTC National

We can see that there are several more non-participant tracts than participant tracts:

Code
# Enrolled in LIHTC program
svi_national_lihtc_df %>% filter(lihtc_flag == 1) %>% nrow()
[1] 518
Code
# Eligible, but did not enroll in LIHTC program
svi_national_lihtc_df %>% filter(lihtc_flag == 0) %>% nrow()
[1] 3205

We can also see that incomes, poverty percentages, and housing burdens are similar in participant and non-participant tracts (as would be expected since they all must meet eligibility criteria):

Code
# Enrolled in LIHTC program
svi_national_lihtc_df %>% 
  filter(lihtc_flag == 1) %>% 
  summarise(Median_Income_10_mean = mean(Median_Income_10, na.rm = TRUE),
            Median_Income_19_mean = mean(Median_Income_19, na.rm = TRUE),
            Poverty_Percentage10_mean = mean(EP_POV150_10, na.rm = TRUE),
            Poverty_Percentage20_mean = mean(EP_POV150_20, na.rm = TRUE),
            Housing_Cost_Burden10_mean = mean(EP_HBURD_10, na.rm = TRUE),
            Housing_Cost_Burden20_mean = mean(EP_HBURD_20, na.rm = TRUE),
            ) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
Median_Income_10_mean Median_Income_19_mean Poverty_Percentage10_mean Poverty_Percentage20_mean Housing_Cost_Burden10_mean Housing_Cost_Burden20_mean
16862.33 21685.07 50.44181 44.82231 48.1992 43.91082
Code
# Eligible, but did not enroll in LIHTC program
svi_national_lihtc_df %>% 
  filter(lihtc_flag == 0) %>% 
  summarise(Median_Income_10_mean = mean(Median_Income_10, na.rm = TRUE),
            Median_Income_19_mean = mean(Median_Income_19, na.rm = TRUE),
            Poverty_Percentage10_mean = mean(EP_POV150_10, na.rm = TRUE),
            Poverty_Percentage20_mean = mean(EP_POV150_20, na.rm = TRUE),
            Housing_Cost_Burden10_mean = mean(EP_HBURD_10, na.rm = TRUE),
            Housing_Cost_Burden20_mean = mean(EP_HBURD_20, na.rm = TRUE),
            ) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
Median_Income_10_mean Median_Income_19_mean Poverty_Percentage10_mean Poverty_Percentage20_mean Housing_Cost_Burden10_mean Housing_Cost_Burden20_mean
16411.91 20449.71 48.998 44.51778 47.64982 42.35557

LIHTC Divisional

Similar to the national data, we can see that there are several more non-participant tracts than participant tracts:

Code
# Enrolled in LIHTC program
svi_divisional_lihtc_df %>% filter(lihtc_flag == 1) %>% nrow()
[1] 87
Code
# Eligible, but did not enroll in LIHTC program
svi_divisional_lihtc_df %>% filter(lihtc_flag == 0) %>% nrow()
[1] 571

We can also see that incomes and housing burden characteristics are similar between participants and non-participants on a divisional level. However, the differences in poverty percentages are a bit more pronounced (~5% difference):

Code
# Enrolled in LIHTC program
svi_divisional_lihtc_df %>% 
  filter(lihtc_flag == 1) %>% 
  summarise(Median_Income_10_mean = mean(Median_Income_10, na.rm = TRUE),
            Median_Income_19_mean = mean(Median_Income_19, na.rm = TRUE),
            Poverty_Percentage10_mean = mean(EP_POV150_10, na.rm = TRUE),
            Poverty_Percentage20_mean = mean(EP_POV150_20, na.rm = TRUE),
            Housing_Cost_Burden10_mean = mean(EP_HBURD_10, na.rm = TRUE),
            Housing_Cost_Burden20_mean = mean(EP_HBURD_20, na.rm = TRUE),
            ) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
Median_Income_10_mean Median_Income_19_mean Poverty_Percentage10_mean Poverty_Percentage20_mean Housing_Cost_Burden10_mean Housing_Cost_Burden20_mean
16912.48 20355.29 49.62606 46.64981 49.05046 48.32413
Code
# Eligible, but did not enroll in LIHTC program
svi_divisional_lihtc_df %>% 
  filter(lihtc_flag == 0) %>% 
  summarise(Median_Income_10_mean = mean(Median_Income_10, na.rm = TRUE),
            Median_Income_19_mean = mean(Median_Income_19, na.rm = TRUE),
            Poverty_Percentage10_mean = mean(EP_POV150_10, na.rm = TRUE),
            Poverty_Percentage20_mean = mean(EP_POV150_20, na.rm = TRUE),
            Housing_Cost_Burden10_mean = mean(EP_HBURD_10, na.rm = TRUE),
            Housing_Cost_Burden20_mean = mean(EP_HBURD_20, na.rm = TRUE),
            ) %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
Median_Income_10_mean Median_Income_19_mean Poverty_Percentage10_mean Poverty_Percentage20_mean Housing_Cost_Burden10_mean Housing_Cost_Burden20_mean
17889.13 21686.31 44.87371 42.46852 51.43901 48.27482

Check for Normality

Now that we have reviewed the characteristics of our tracts of interest — let’s explore the distribution of our SVI, Median Home Values, and Median Income dependent variables nationally and divisionally to check for indicators of normality in accordance with the 7 Sins of Regression.

We will also create logged versions of our Median Home Value, House Price Index, and Median Income variables to assist with skew (where possible) and transform our evaluation of these measures to be able to determine the percentage of change instead of just a raw number. This is particularly important since our home values and median incomes can vary so widely. For instance, while a $20,000 increase may mean very different things depending on the starting value (consider a $100,000 home vs a $1,000,000 home), a 2% increase can be compared equitably.

To explore our variables, we will evaluate the normality of our data distributions. While there are various ways to accomplish this, we will use the following guidelines:

Alt-text: Normality Checklist
  • Visual inspection of histogram
  • Visual inspection of histogram compared to normal distribution curve
  • Visual inspection of density plot
  • Statistical calculation of absolute skewness value ≤2
  • Statistical calculation of absolute excess kurtosis ≤4
  • Statistical calculation of standard deviation less than half of the mean

While our variables may not pass all of these evaluations (and regression does not require an assumption of normality for dependent or independent variables), it’s useful to have an understanding of our distribution.

You may recall from previous statistical and analytical courses that skewness measures the lateral spread of the tails of variable distribution while kurtosis measures the expected height/peaks or flatness of variable distribution. We will be checking for both skewness and kurtosis in our data set.

Note

While you will need to log your economic outcomes variables, you are not required to complete the normality checks for your lab. However, feel free to follow along if you’d like to examine your Census Division in further detail.

Log Variables

Code
svi_national_nmtc_df$Median_Income_10adj_log <- log(svi_national_nmtc_df$Median_Income_10adj)
svi_national_nmtc_df$Median_Income_19_log <- log(svi_national_nmtc_df$Median_Income_19)

svi_national_nmtc_df$Median_Home_Value_10adj_log = log(svi_national_nmtc_df$Median_Home_Value_10adj)
svi_national_nmtc_df$Median_Home_Value_19_log = log(svi_national_nmtc_df$Median_Home_Value_19)

svi_national_nmtc_df$housing_price_index10_log = log(svi_national_nmtc_df$housing_price_index10)
svi_national_nmtc_df$housing_price_index20_log = log(svi_national_nmtc_df$housing_price_index20)

svi_divisional_nmtc_df$Median_Income_10adj_log <- log(svi_divisional_nmtc_df$Median_Income_10adj)
svi_divisional_nmtc_df$Median_Income_19_log <- log(svi_divisional_nmtc_df$Median_Income_19)

svi_divisional_nmtc_df$Median_Home_Value_10adj_log = log(svi_divisional_nmtc_df$Median_Home_Value_10adj)
svi_divisional_nmtc_df$Median_Home_Value_19_log = log(svi_divisional_nmtc_df$Median_Home_Value_19)

svi_divisional_nmtc_df$housing_price_index10_log = log(svi_divisional_nmtc_df$housing_price_index10)
svi_divisional_nmtc_df$housing_price_index20_log = log(svi_divisional_nmtc_df$housing_price_index20)

svi_national_lihtc_df$Median_Income_10adj_log <- log(svi_national_lihtc_df$Median_Income_10adj)
svi_national_lihtc_df$Median_Income_19_log <- log(svi_national_lihtc_df$Median_Income_19)

svi_national_lihtc_df$Median_Home_Value_10adj_log = log(svi_national_lihtc_df$Median_Home_Value_10adj)
svi_national_lihtc_df$Median_Home_Value_19_log = log(svi_national_lihtc_df$Median_Home_Value_19)

svi_national_lihtc_df$housing_price_index10_log = log(svi_national_lihtc_df$housing_price_index10)
svi_national_lihtc_df$housing_price_index20_log = log(svi_national_lihtc_df$housing_price_index20)

svi_divisional_lihtc_df$Median_Income_10adj_log <- log(svi_divisional_lihtc_df$Median_Income_10adj)
svi_divisional_lihtc_df$Median_Income_19_log <- log(svi_divisional_lihtc_df$Median_Income_19)

svi_divisional_lihtc_df$Median_Home_Value_10adj_log = log(svi_divisional_lihtc_df$Median_Home_Value_10adj)
svi_divisional_lihtc_df$Median_Home_Value_19_log = log(svi_divisional_lihtc_df$Median_Home_Value_19)

svi_divisional_lihtc_df$housing_price_index10_log = log(svi_divisional_lihtc_df$housing_price_index10)
svi_divisional_lihtc_df$housing_price_index20_log = log(svi_divisional_lihtc_df$housing_price_index20)

NMTC Variable Distribution

National

SVI Theme 1: Socioeconomic Status

Code
hist(svi_national_nmtc_df$F_THEME1_10)

Code
plotNormalHistogram(svi_national_nmtc_df$F_THEME1_10)

Code
ggdensity(svi_national_nmtc_df, x = "F_THEME1_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_THEME1_10, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_THEME1_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_THEME1_10)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_THEME1_10))))
[1] "Absolute Skewness: 0.0391474620702475"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_THEME1_10))))
[1] "Absolute Excess Kurtosis: 1.11708752960362"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_THEME1_10) < mean(svi_national_nmtc_df$F_THEME1_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_nmtc_df$F_THEME1_20)

Code
plotNormalHistogram(svi_national_nmtc_df$F_THEME1_20)

Code
ggdensity(svi_national_nmtc_df, x = "F_THEME1_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_THEME1_20, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_THEME1_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_THEME1_20)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_THEME1_20))))
[1] "Absolute Skewness: 0.033989939262248"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_THEME1_20))))
[1] "Absolute Excess Kurtosis: 1.01742081040569"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_THEME1_20) < mean(svi_national_nmtc_df$F_THEME1_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"

SVI Theme 2: Household Characteristics

Code
hist(svi_national_nmtc_df$F_THEME2_10)

Code
plotNormalHistogram(svi_national_nmtc_df$F_THEME2_10)

Code
ggdensity(svi_national_nmtc_df, x = "F_THEME2_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_THEME2_10, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_THEME2_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_THEME2_10)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_THEME2_10))))
[1] "Absolute Skewness: 0.0415342029895027"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_THEME2_10))))
[1] "Absolute Excess Kurtosis: 0.5867078839141"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_THEME2_10) < mean(svi_national_nmtc_df$F_THEME2_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_nmtc_df$F_THEME2_20)

Code
plotNormalHistogram(svi_national_nmtc_df$F_THEME2_20)

Code
ggdensity(svi_national_nmtc_df, x = "F_THEME2_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_THEME2_20, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_THEME2_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_THEME2_20)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_THEME2_20))))
[1] "Absolute Skewness: 0.0685978514780755"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_THEME2_20))))
[1] "Absolute Excess Kurtosis: 0.61939955553921"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_THEME2_20) < mean(svi_national_nmtc_df$F_THEME2_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"

SVI Theme 3: Racial & Ethnic Minority Status

Code
hist(svi_national_nmtc_df$F_THEME3_10)

Code
plotNormalHistogram(svi_national_nmtc_df$F_THEME3_10)

Code
ggdensity(svi_national_nmtc_df, x = "F_THEME3_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_THEME3_10, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_THEME1_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_THEME3_10)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_THEME3_10))))
[1] "Absolute Skewness: 0.198996204178678"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_THEME3_10))))
[1] "Absolute Excess Kurtosis: 1.96040051072248"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_THEME3_10) < mean(svi_national_nmtc_df$F_THEME3_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
table(svi_national_nmtc_df$F_THEME3_10)

    0     1 
15973 13095 
Code
hist(svi_national_nmtc_df$F_THEME3_20)

Code
plotNormalHistogram(svi_national_nmtc_df$F_THEME3_20)

Code
ggdensity(svi_national_nmtc_df, x = "F_THEME3_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_THEME3_20, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_THEME3_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_THEME3_20)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_THEME3_20))))
[1] "Absolute Skewness: 0.223622375166713"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_THEME3_20))))
[1] "Absolute Excess Kurtosis: 1.9499930333248"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_THEME3_20) < mean(svi_national_nmtc_df$F_THEME3_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
table(svi_national_nmtc_df$F_THEME3_20)

    0     1 
16149 12919 

SVI Theme 4: Housing Type & Transportation

Code
hist(svi_national_nmtc_df$F_THEME4_10)

Code
plotNormalHistogram(svi_national_nmtc_df$F_THEME4_10)

Code
ggdensity(svi_national_nmtc_df, x = "F_THEME4_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_THEME4_10, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_THEME4_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_THEME4_10)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_THEME4_10))))
[1] "Absolute Skewness: 0.247106791798108"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_THEME4_10))))
[1] "Absolute Excess Kurtosis: 0.440082433078066"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_THEME4_10) < mean(svi_national_nmtc_df$F_THEME4_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_nmtc_df$F_THEME4_20)

Code
plotNormalHistogram(svi_national_nmtc_df$F_THEME4_20)

Code
ggdensity(svi_national_nmtc_df, x = "F_THEME4_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_THEME4_20, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_THEME4_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_THEME4_20)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_THEME4_20))))
[1] "Absolute Skewness: 0.272404536979311"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_THEME4_20))))
[1] "Absolute Excess Kurtosis: 0.434064524326406"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_THEME4_20) < mean(svi_national_nmtc_df$F_THEME4_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"

SVI Overall

Code
hist(svi_national_nmtc_df$F_TOTAL_10)

Code
plotNormalHistogram(svi_national_nmtc_df$F_TOTAL_10)

Code
ggdensity(svi_national_nmtc_df, x = "F_TOTAL_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_TOTAL_10, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_TOTAL_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_TOTAL_10)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_TOTAL_10))))
[1] "Absolute Skewness: 0.0436727474371538"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_TOTAL_10))))
[1] "Absolute Excess Kurtosis: 0.911084390556951"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_TOTAL_10) < mean(svi_national_nmtc_df$F_TOTAL_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_nmtc_df$F_TOTAL_20)

Code
plotNormalHistogram(svi_national_nmtc_df$F_TOTAL_20)

Code
ggdensity(svi_national_nmtc_df, x = "F_TOTAL_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_nmtc_df$F_TOTAL_20, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$F_TOTAL_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$F_TOTAL_20)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$F_TOTAL_20))))
[1] "Absolute Skewness: 0.0581038221323139"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$F_TOTAL_20))))
[1] "Absolute Excess Kurtosis: 0.768124765222423"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$F_TOTAL_20) < mean(svi_national_nmtc_df$F_TOTAL_20)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Median Income

Code
options(scipen = 999)
hist(svi_national_nmtc_df$Median_Income_10adj)

Code
plotNormalHistogram(svi_national_nmtc_df$Median_Income_10adj)

Code
ggdensity(svi_national_nmtc_df, x = "Median_Income_10adj", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$Median_Income_10adj, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$Median_Income_10adj, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$Median_Income_10adj)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$Median_Income_10adj, na.rm = TRUE))))
[1] "Absolute Skewness: 0.683797407614315"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$Median_Income_10adj, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 2.86001620141715"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$Median_Income_10adj, na.rm = TRUE) < mean(svi_national_nmtc_df$Median_Income_10adj, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_nmtc_df$Median_Income_10adj_log)

Code
plotNormalHistogram(svi_national_nmtc_df$Median_Income_10adj_log)

Code
ggdensity(svi_national_nmtc_df, x = "Median_Income_10adj_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$Median_Income_10adj_log, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$Median_Income_10adj_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$Median_Income_10adj_log)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$Median_Income_10adj_log, na.rm = TRUE))))
[1] "Absolute Skewness: 1.21512618094927"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$Median_Income_10adj_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.9183099470765"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$Median_Income_10adj_log, na.rm = TRUE) < mean(svi_national_nmtc_df$Median_Income_10adj_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
options(scipen = 999)
hist(svi_national_nmtc_df$Median_Income_19)

Code
plotNormalHistogram(svi_national_nmtc_df$Median_Income_19)

Code
ggdensity(svi_national_nmtc_df, x = "Median_Income_19", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 12 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 12 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$Median_Income_19, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$Median_Income_19, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$Median_Income_19)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$Median_Income_19, na.rm = TRUE))))
[1] "Absolute Skewness: 0.936695283743479"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$Median_Income_19, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.27236605748425"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$Median_Income_19, na.rm = TRUE) < mean(svi_national_nmtc_df$Median_Income_19, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_nmtc_df$Median_Income_19_log)

Code
plotNormalHistogram(svi_national_nmtc_df$Median_Income_19_log)

Code
ggdensity(svi_national_nmtc_df, x = "Median_Income_19_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 12 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 12 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$Median_Income_19_log, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$Median_Income_19_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$Median_Income_19_log)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$Median_Income_19_log, na.rm = TRUE))))
[1] "Absolute Skewness: 1.27151335786324"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$Median_Income_19_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 6.31504839590709"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$Median_Income_19_log, na.rm = TRUE) < mean(svi_national_nmtc_df$Median_Income_19_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Median Home Value

Code
hist(svi_national_nmtc_df$Median_Home_Value_10adj)

Code
plotNormalHistogram(svi_national_nmtc_df$Median_Home_Value_10adj)

Code
ggdensity(svi_national_nmtc_df, x = "Median_Home_Value_10adj", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 481 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 481 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$Median_Home_Value_10adj, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$Median_Home_Value_10adj, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$Median_Home_Value_10adj)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$Median_Home_Value_10adj, na.rm = TRUE))))
[1] "Absolute Skewness: 2.04452801480231"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$Median_Home_Value_10adj, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 5.17761808132001"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$Median_Home_Value_10adj, na.rm = TRUE) < mean(svi_national_nmtc_df$Median_Home_Value_10adj, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_nmtc_df$Median_Home_Value_10adj_log)

Code
plotNormalHistogram(svi_national_nmtc_df$Median_Home_Value_10adj_log)

Code
ggdensity(svi_national_nmtc_df, x = "Median_Home_Value_10adj_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 481 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 481 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$Median_Home_Value_10adj_log, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$Median_Home_Value_10adj_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$Median_Home_Value_10adj_log)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$Median_Home_Value_10adj_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.333285099178232"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$Median_Home_Value_10adj_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.162776282166985"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$Median_Home_Value_10adj_log, na.rm = TRUE) < mean(svi_national_nmtc_df$Median_Home_Value_10adj_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_nmtc_df$Median_Home_Value_19)

Code
plotNormalHistogram(svi_national_nmtc_df$Median_Home_Value_19)

Code
ggdensity(svi_national_nmtc_df, x = "Median_Home_Value_19", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 775 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 775 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$Median_Home_Value_19, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$Median_Home_Value_19, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$Median_Home_Value_19)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$Median_Home_Value_19, na.rm = TRUE))))
[1] "Absolute Skewness: 2.73968710293995"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$Median_Home_Value_19, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 11.2160641939769"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$Median_Home_Value_19, na.rm = TRUE) < mean(svi_national_nmtc_df$Median_Home_Value_19, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_nmtc_df$Median_Home_Value_19_log)

Code
plotNormalHistogram(svi_national_nmtc_df$Median_Home_Value_19_log)

Code
ggdensity(svi_national_nmtc_df, x = "Median_Home_Value_19_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 775 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 775 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$Median_Home_Value_19_log, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$Median_Home_Value_19_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$Median_Home_Value_19_log)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$Median_Home_Value_19_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.396412066876363"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$Median_Home_Value_19_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.146528535769173"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$Median_Home_Value_19_log, na.rm = TRUE) < mean(svi_national_nmtc_df$Median_Home_Value_19_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Housing Price Index

Code
hist(svi_national_nmtc_df$housing_price_index10)

Code
plotNormalHistogram(svi_national_nmtc_df$housing_price_index10)

Code
ggdensity(svi_national_nmtc_df, x = "housing_price_index10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 15207 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 15207 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$housing_price_index10, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$housing_price_index10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$housing_price_index10)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$housing_price_index10, na.rm = TRUE))))
[1] "Absolute Skewness: 2.66096732962555"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$housing_price_index10, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 13.4503522121252"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$housing_price_index10, na.rm = TRUE) < mean(svi_national_nmtc_df$housing_price_index10, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_nmtc_df$housing_price_index10_log)

Code
plotNormalHistogram(svi_national_nmtc_df$housing_price_index10_log)

Code
ggdensity(svi_national_nmtc_df, x = "housing_price_index10_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 15207 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 15207 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$housing_price_index10_log, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$housing_price_index10_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$housing_price_index10_log)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$housing_price_index10_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.579969300671996"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$housing_price_index10_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 1.19820999461709"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$housing_price_index10_log, na.rm = TRUE) < mean(svi_national_nmtc_df$housing_price_index10_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_nmtc_df$housing_price_index20)

Code
plotNormalHistogram(svi_national_nmtc_df$housing_price_index20)

Code
ggdensity(svi_national_nmtc_df, x = "housing_price_index20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 14337 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 14337 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$housing_price_index20, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$housing_price_index20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$housing_price_index20)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$housing_price_index20, na.rm = TRUE))))
[1] "Absolute Skewness: 2.92032471460441"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$housing_price_index20, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 14.6933704847573"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$housing_price_index20, na.rm = TRUE) < mean(svi_national_nmtc_df$housing_price_index20, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_nmtc_df$housing_price_index20_log)

Code
plotNormalHistogram(svi_national_nmtc_df$housing_price_index20_log)

Code
ggdensity(svi_national_nmtc_df, x = "housing_price_index20_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 14337 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 14337 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_nmtc_df$housing_price_index20_log, pch = 1, frame = FALSE)
qqline(svi_national_nmtc_df$housing_price_index20_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_nmtc_df$housing_price_index20_log)))
[1] "Length: 29068"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_nmtc_df$housing_price_index20_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.62477346399392"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_nmtc_df$housing_price_index20_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.660258064340267"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_nmtc_df$housing_price_index20_log, na.rm = TRUE) < mean(svi_national_nmtc_df$housing_price_index20_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Divisional

SVI Theme 1: Socioeconomic Status

Code
hist(svi_divisional_nmtc_df$F_THEME1_10)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_THEME1_10)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_THEME1_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_THEME1_10, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_THEME1_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_THEME1_10)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_THEME1_10))))
[1] "Absolute Skewness: 0.0950650152324593"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_THEME1_10))))
[1] "Absolute Excess Kurtosis: 1.10074723961562"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_THEME1_10) < mean(svi_divisional_nmtc_df$F_THEME1_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_nmtc_df$F_THEME1_20)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_THEME1_20)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_THEME1_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_THEME1_20, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_THEME1_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_THEME1_20)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_THEME1_20))))
[1] "Absolute Skewness: 0.0547960843173613"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_THEME1_20))))
[1] "Absolute Excess Kurtosis: 1.0691840771423"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_THEME1_20) < mean(svi_divisional_nmtc_df$F_THEME1_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"

SVI Theme 2: Household Characteristics

Code
hist(svi_divisional_nmtc_df$F_THEME2_10)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_THEME2_10)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_THEME2_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_THEME2_10, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_THEME2_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_THEME2_10)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_THEME2_10))))
[1] "Absolute Skewness: 0.0813835807739184"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_THEME2_10))))
[1] "Absolute Excess Kurtosis: 0.682492024892148"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_THEME2_10) < mean(svi_divisional_nmtc_df$F_THEME2_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_nmtc_df$F_THEME2_20)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_THEME2_20)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_THEME2_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_THEME2_20, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_THEME2_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_THEME2_20)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_THEME2_20))))
[1] "Absolute Skewness: 0.0701363717639949"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_THEME2_20))))
[1] "Absolute Excess Kurtosis: 0.751641182827766"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_THEME2_20) < mean(svi_divisional_nmtc_df$F_THEME2_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"

SVI Theme 3: Racial & Ethnic Minority Status

Code
hist(svi_divisional_nmtc_df$F_THEME3_10)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_THEME3_10)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_THEME3_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_THEME3_10, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_THEME1_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_THEME3_10)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_THEME3_10))))
[1] "Absolute Skewness: 0.0107992934987716"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_THEME3_10))))
[1] "Absolute Excess Kurtosis: 1.99988337525993"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_THEME3_10) < mean(svi_divisional_nmtc_df$F_THEME3_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
table(svi_divisional_nmtc_df$F_THEME3_10)

   0    1 
1862 1842 
Code
hist(svi_divisional_nmtc_df$F_THEME3_20)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_THEME3_20)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_THEME3_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_THEME3_20, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_THEME3_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_THEME3_20)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_THEME3_20))))
[1] "Absolute Skewness: 0.0226796438099189"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_THEME3_20))))
[1] "Absolute Excess Kurtosis: 1.99948563375666"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_THEME3_20) < mean(svi_divisional_nmtc_df$F_THEME3_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
table(svi_divisional_nmtc_df$F_THEME3_20)

   0    1 
1873 1831 

SVI Theme 4: Housing Type & Transportation

Code
hist(svi_divisional_nmtc_df$F_THEME4_10)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_THEME4_10)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_THEME4_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_THEME4_10, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_THEME4_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_THEME4_10)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_THEME4_10))))
[1] "Absolute Skewness: 0.178577401490003"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_THEME4_10))))
[1] "Absolute Excess Kurtosis: 0.849355110461581"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_THEME4_10) < mean(svi_divisional_nmtc_df$F_THEME4_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_nmtc_df$F_THEME4_20)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_THEME4_20)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_THEME4_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_THEME4_20, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_THEME4_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_THEME4_20)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_THEME4_20))))
[1] "Absolute Skewness: 0.184416788150057"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_THEME4_20))))
[1] "Absolute Excess Kurtosis: 0.836438618688658"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_THEME4_20) < mean(svi_divisional_nmtc_df$F_THEME4_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"

SVI Overall

Code
hist(svi_divisional_nmtc_df$F_TOTAL_10)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_TOTAL_10)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_TOTAL_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_TOTAL_10, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_TOTAL_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_TOTAL_10)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_TOTAL_10))))
[1] "Absolute Skewness: 0.00591390983029318"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_TOTAL_10))))
[1] "Absolute Excess Kurtosis: 0.977850910040317"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_TOTAL_10) < mean(svi_divisional_nmtc_df$F_TOTAL_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_nmtc_df$F_TOTAL_20)

Code
plotNormalHistogram(svi_divisional_nmtc_df$F_TOTAL_20)

Code
ggdensity(svi_divisional_nmtc_df, x = "F_TOTAL_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$F_TOTAL_20, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$F_TOTAL_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$F_TOTAL_20)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$F_TOTAL_20))))
[1] "Absolute Skewness: 0.0772636045400056"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$F_TOTAL_20))))
[1] "Absolute Excess Kurtosis: 0.885123333793441"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$F_TOTAL_20) < mean(svi_divisional_nmtc_df$F_TOTAL_20)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Median Income

Code
options(scipen = 999)
hist(svi_divisional_nmtc_df$Median_Income_10adj)

Code
plotNormalHistogram(svi_divisional_nmtc_df$Median_Income_10adj)

Code
ggdensity(svi_divisional_nmtc_df, x = "Median_Income_10adj", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$Median_Income_10adj, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$Median_Income_10adj, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$Median_Income_10adj)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$Median_Income_10adj, na.rm = TRUE))))
[1] "Absolute Skewness: 0.771788001084237"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$Median_Income_10adj, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 5.26989163990963"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$Median_Income_10adj, na.rm = TRUE) < mean(svi_divisional_nmtc_df$Median_Income_10adj, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_nmtc_df$Median_Income_10adj_log)

Code
plotNormalHistogram(svi_divisional_nmtc_df$Median_Income_10adj_log)

Code
ggdensity(svi_divisional_nmtc_df, x = "Median_Income_10adj_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_nmtc_df$Median_Income_10adj_log, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$Median_Income_10adj_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$Median_Income_10adj_log)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$Median_Income_10adj_log, na.rm = TRUE))))
[1] "Absolute Skewness: 1.3311911324138"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$Median_Income_10adj_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.82461424704777"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$Median_Income_10adj_log, na.rm = TRUE) < mean(svi_divisional_nmtc_df$Median_Income_10adj_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
options(scipen = 999)
hist(svi_divisional_nmtc_df$Median_Income_19)

Code
plotNormalHistogram(svi_divisional_nmtc_df$Median_Income_19)

Code
ggdensity(svi_divisional_nmtc_df, x = "Median_Income_19", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$Median_Income_19, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$Median_Income_19, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$Median_Income_19)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$Median_Income_19, na.rm = TRUE))))
[1] "Absolute Skewness: 0.727017767346645"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$Median_Income_19, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 2.74157045568891"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$Median_Income_19, na.rm = TRUE) < mean(svi_divisional_nmtc_df$Median_Income_19, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_nmtc_df$Median_Income_19_log)

Code
plotNormalHistogram(svi_divisional_nmtc_df$Median_Income_19_log)

Code
ggdensity(svi_divisional_nmtc_df, x = "Median_Income_19_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$Median_Income_19_log, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$Median_Income_19_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$Median_Income_19_log)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$Median_Income_19_log, na.rm = TRUE))))
[1] "Absolute Skewness: 1.30842713408716"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$Median_Income_19_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 5.6755627286166"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$Median_Income_19_log, na.rm = TRUE) < mean(svi_divisional_nmtc_df$Median_Income_19_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Median Home Value

Code
hist(svi_divisional_nmtc_df$Median_Home_Value_10adj)

Code
plotNormalHistogram(svi_divisional_nmtc_df$Median_Home_Value_10adj)

Code
ggdensity(svi_divisional_nmtc_df, x = "Median_Home_Value_10adj", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 112 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 112 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$Median_Home_Value_10adj, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$Median_Home_Value_10adj, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$Median_Home_Value_10adj)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$Median_Home_Value_10adj, na.rm = TRUE))))
[1] "Absolute Skewness: 0.966863805068902"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$Median_Home_Value_10adj, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.183465057542072"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$Median_Home_Value_10adj, na.rm = TRUE) < mean(svi_divisional_nmtc_df$Median_Home_Value_10adj, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_nmtc_df$Median_Home_Value_10adj_log)

Code
plotNormalHistogram(svi_divisional_nmtc_df$Median_Home_Value_10adj_log)

Code
ggdensity(svi_divisional_nmtc_df, x = "Median_Home_Value_10adj_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 112 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 112 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$Median_Home_Value_10adj_log, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$Median_Home_Value_10adj_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$Median_Home_Value_10adj_log)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$Median_Home_Value_10adj_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.0424969975553017"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$Median_Home_Value_10adj_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 1.15936931839314"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$Median_Home_Value_10adj_log, na.rm = TRUE) < mean(svi_divisional_nmtc_df$Median_Home_Value_10adj_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_nmtc_df$Median_Home_Value_19)

Code
plotNormalHistogram(svi_divisional_nmtc_df$Median_Home_Value_19)

Code
ggdensity(svi_divisional_nmtc_df, x = "Median_Home_Value_19", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 199 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 199 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$Median_Home_Value_19, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$Median_Home_Value_19, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$Median_Home_Value_19)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$Median_Home_Value_19, na.rm = TRUE))))
[1] "Absolute Skewness: 1.69096361962191"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$Median_Home_Value_19, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 3.5469745952759"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$Median_Home_Value_19, na.rm = TRUE) < mean(svi_divisional_nmtc_df$Median_Home_Value_19, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_nmtc_df$Median_Home_Value_19_log)

Code
plotNormalHistogram(svi_divisional_nmtc_df$Median_Home_Value_19_log)

Code
ggdensity(svi_divisional_nmtc_df, x = "Median_Home_Value_19_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 199 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 199 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$Median_Home_Value_19_log, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$Median_Home_Value_19_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$Median_Home_Value_19_log)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$Median_Home_Value_19_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.179322639321206"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$Median_Home_Value_19_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.918136064928503"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$Median_Home_Value_19_log, na.rm = TRUE) < mean(svi_divisional_nmtc_df$Median_Home_Value_19_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Housing Price Index

Code
hist(svi_divisional_nmtc_df$housing_price_index10)

Code
plotNormalHistogram(svi_divisional_nmtc_df$housing_price_index10)

Code
ggdensity(svi_divisional_nmtc_df, x = "housing_price_index10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 2627 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 2627 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$housing_price_index10, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$housing_price_index10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$housing_price_index10)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$housing_price_index10, na.rm = TRUE))))
[1] "Absolute Skewness: 1.52709581688138"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$housing_price_index10, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.76595604148127"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$housing_price_index10, na.rm = TRUE) < mean(svi_divisional_nmtc_df$housing_price_index10, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_nmtc_df$housing_price_index10_log)

Code
plotNormalHistogram(svi_divisional_nmtc_df$housing_price_index10_log)

Code
ggdensity(svi_divisional_nmtc_df, x = "housing_price_index10_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 2627 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 2627 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$housing_price_index10_log, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$housing_price_index10_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$housing_price_index10_log)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$housing_price_index10_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.322355088223751"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$housing_price_index10_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.174630929219294"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$housing_price_index10_log, na.rm = TRUE) < mean(svi_divisional_nmtc_df$housing_price_index10_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_nmtc_df$housing_price_index20)

Code
plotNormalHistogram(svi_divisional_nmtc_df$housing_price_index20)

Code
ggdensity(svi_divisional_nmtc_df, x = "housing_price_index20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 2602 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 2602 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$housing_price_index20, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$housing_price_index20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$housing_price_index20)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$housing_price_index20, na.rm = TRUE))))
[1] "Absolute Skewness: 1.93528811040446"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$housing_price_index20, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 8.63582161488645"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$housing_price_index20, na.rm = TRUE) < mean(svi_divisional_nmtc_df$housing_price_index20, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_nmtc_df$housing_price_index20_log)

Code
plotNormalHistogram(svi_divisional_nmtc_df$housing_price_index20_log)

Code
ggdensity(svi_divisional_nmtc_df, x = "housing_price_index20_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 2602 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 2602 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_nmtc_df$housing_price_index20_log, pch = 1, frame = FALSE)
qqline(svi_divisional_nmtc_df$housing_price_index20_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_nmtc_df$housing_price_index20_log)))
[1] "Length: 3704"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_nmtc_df$housing_price_index20_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.300932556471555"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_nmtc_df$housing_price_index20_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.160257348753374"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_nmtc_df$housing_price_index20_log, na.rm = TRUE) < mean(svi_divisional_nmtc_df$housing_price_index20_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

LIHTC Variable Distribution

National

SVI Theme 1: Socioeconomic Status

Code
hist(svi_national_lihtc_df$F_THEME1_10)

Code
plotNormalHistogram(svi_national_lihtc_df$F_THEME1_10)

Code
ggdensity(svi_national_lihtc_df, x = "F_THEME1_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_THEME1_10, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_THEME1_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_THEME1_10)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_THEME1_10))))
[1] "Absolute Skewness: 0.616354903135796"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_THEME1_10))))
[1] "Absolute Excess Kurtosis: 0.112922100526614"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_THEME1_10) < mean(svi_national_lihtc_df$F_THEME1_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$F_THEME1_20)

Code
plotNormalHistogram(svi_national_lihtc_df$F_THEME1_20)

Code
ggdensity(svi_national_lihtc_df, x = "F_THEME1_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_THEME1_20, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_THEME1_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_THEME1_20)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_THEME1_20))))
[1] "Absolute Skewness: 0.594976910867999"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_THEME1_20))))
[1] "Absolute Excess Kurtosis: 0.112070644344634"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_THEME1_20) < mean(svi_national_lihtc_df$F_THEME1_20)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

SVI Theme 2: Household Characteristics

Code
hist(svi_national_lihtc_df$F_THEME2_10)

Code
plotNormalHistogram(svi_national_lihtc_df$F_THEME2_10)

Code
ggdensity(svi_national_lihtc_df, x = "F_THEME2_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_THEME2_10, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_THEME2_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_THEME2_10)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_THEME2_10))))
[1] "Absolute Skewness: 0.395602246173855"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_THEME2_10))))
[1] "Absolute Excess Kurtosis: 0.441083623885851"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_THEME2_10) < mean(svi_national_lihtc_df$F_THEME2_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$F_THEME2_20)

Code
plotNormalHistogram(svi_national_lihtc_df$F_THEME2_20)

Code
ggdensity(svi_national_lihtc_df, x = "F_THEME2_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_THEME2_20, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_THEME2_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_THEME2_20)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_THEME2_20))))
[1] "Absolute Skewness: 0.260981410692002"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_THEME2_20))))
[1] "Absolute Excess Kurtosis: 0.63145712850234"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_THEME2_20) < mean(svi_national_lihtc_df$F_THEME2_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"

SVI Theme 3: Racial & Ethnic Minority Status

Code
hist(svi_national_lihtc_df$F_THEME3_10)

Code
plotNormalHistogram(svi_national_lihtc_df$F_THEME3_10)

Code
ggdensity(svi_national_lihtc_df, x = "F_THEME3_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_THEME3_10, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_THEME1_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_THEME3_10)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_THEME3_10))))
[1] "Absolute Skewness: 0.902276979952208"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_THEME3_10))))
[1] "Absolute Excess Kurtosis: 1.18589625144832"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_THEME3_10) < mean(svi_national_lihtc_df$F_THEME3_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
table(svi_national_lihtc_df$F_THEME3_10)

   0    1 
1096 2627 
Code
hist(svi_national_lihtc_df$F_THEME3_20)

Code
plotNormalHistogram(svi_national_lihtc_df$F_THEME3_20)

Code
ggdensity(svi_national_lihtc_df, x = "F_THEME3_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_THEME3_20, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_THEME3_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_THEME3_20)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_THEME3_20))))
[1] "Absolute Skewness: 0.743314688520507"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_THEME3_20))))
[1] "Absolute Excess Kurtosis: 1.44748327382966"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_THEME3_20) < mean(svi_national_lihtc_df$F_THEME3_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
table(svi_national_lihtc_df$F_THEME3_20)

   0    1 
1213 2510 

SVI Theme 4: Housing Type & Transportation

Code
hist(svi_national_lihtc_df$F_THEME4_10)

Code
plotNormalHistogram(svi_national_lihtc_df$F_THEME4_10)

Code
ggdensity(svi_national_lihtc_df, x = "F_THEME4_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_THEME4_10, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_THEME4_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_THEME4_10)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_THEME4_10))))
[1] "Absolute Skewness: 0.0640770548480284"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_THEME4_10))))
[1] "Absolute Excess Kurtosis: 0.435691797399938"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_THEME4_10) < mean(svi_national_lihtc_df$F_THEME4_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$F_THEME4_20)

Code
plotNormalHistogram(svi_national_lihtc_df$F_THEME4_20)

Code
ggdensity(svi_national_lihtc_df, x = "F_THEME4_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_THEME4_20, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_THEME4_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_THEME4_20)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_THEME4_20))))
[1] "Absolute Skewness: 0.136120824320853"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_THEME4_20))))
[1] "Absolute Excess Kurtosis: 0.555745505236912"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_THEME4_20) < mean(svi_national_lihtc_df$F_THEME4_20)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

SVI Overall

Code
hist(svi_national_lihtc_df$F_TOTAL_10)

Code
plotNormalHistogram(svi_national_lihtc_df$F_TOTAL_10)

Code
ggdensity(svi_national_lihtc_df, x = "F_TOTAL_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_TOTAL_10, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_TOTAL_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_TOTAL_10)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_TOTAL_10))))
[1] "Absolute Skewness: 0.553937068781805"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_TOTAL_10))))
[1] "Absolute Excess Kurtosis: 0.1589952366606"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_TOTAL_10) < mean(svi_national_lihtc_df$F_TOTAL_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$F_TOTAL_20)

Code
plotNormalHistogram(svi_national_lihtc_df$F_TOTAL_20)

Code
ggdensity(svi_national_lihtc_df, x = "F_TOTAL_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$F_TOTAL_20, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$F_TOTAL_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$F_TOTAL_20)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$F_TOTAL_20))))
[1] "Absolute Skewness: 0.443427815416208"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$F_TOTAL_20))))
[1] "Absolute Excess Kurtosis: 0.154851347224199"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$F_TOTAL_20, na.rm = TRUE) < mean(svi_national_lihtc_df$F_TOTAL_20, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Median Income

Code
options(scipen = 999)
hist(svi_national_lihtc_df$Median_Income_10adj)

Code
plotNormalHistogram(svi_national_lihtc_df$Median_Income_10adj)

Code
ggdensity(svi_national_lihtc_df, x = "Median_Income_10adj", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$Median_Income_10adj, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$Median_Income_10adj, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$Median_Income_10adj)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$Median_Income_10adj, na.rm = TRUE))))
[1] "Absolute Skewness: 1.927877656384"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$Median_Income_10adj, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 15.8684097773125"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$Median_Income_10adj, na.rm = TRUE) < mean(svi_national_lihtc_df$Median_Income_10adj, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$Median_Income_10adj_log)

Code
plotNormalHistogram(svi_national_lihtc_df$Median_Income_10adj_log)

Code
ggdensity(svi_national_lihtc_df, x = "Median_Income_10adj_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_national_lihtc_df$Median_Income_10adj_log, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$Median_Income_10adj_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$Median_Income_10adj_log)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$Median_Income_10adj_log, na.rm = TRUE))))
[1] "Absolute Skewness: 1.32520659727067"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$Median_Income_10adj_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.57344593936882"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$Median_Income_10adj_log, na.rm = TRUE) < mean(svi_national_lihtc_df$Median_Income_10adj_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
options(scipen = 999)
hist(svi_national_lihtc_df$Median_Income_19)

Code
plotNormalHistogram(svi_national_lihtc_df$Median_Income_19)

Code
ggdensity(svi_national_lihtc_df, x = "Median_Income_19", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 6 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 6 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$Median_Income_19, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$Median_Income_19, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$Median_Income_19)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$Median_Income_19, na.rm = TRUE))))
[1] "Absolute Skewness: 2.35734770415012"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$Median_Income_19, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 13.6771686068265"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$Median_Income_19, na.rm = TRUE) < mean(svi_national_lihtc_df$Median_Income_19, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$Median_Income_19_log)

Code
plotNormalHistogram(svi_national_lihtc_df$Median_Income_19_log)

Code
ggdensity(svi_national_lihtc_df, x = "Median_Income_19_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 6 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 6 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$Median_Income_19_log, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$Median_Income_19_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$Median_Income_19_log)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$Median_Income_19_log, na.rm = TRUE))))
[1] "Absolute Skewness: 1.05215502269178"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$Median_Income_19_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.48007258363398"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$Median_Income_19_log, na.rm = TRUE) < mean(svi_national_lihtc_df$Median_Income_19_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Median Home Value

Code
hist(svi_national_lihtc_df$Median_Home_Value_10adj)

Code
plotNormalHistogram(svi_national_lihtc_df$Median_Home_Value_10adj)

Code
ggdensity(svi_national_lihtc_df, x = "Median_Home_Value_10adj", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 148 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 148 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$Median_Home_Value_10adj, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$Median_Home_Value_10adj, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$Median_Home_Value_10adj)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$Median_Home_Value_10adj, na.rm = TRUE))))
[1] "Absolute Skewness: 1.69035458080667"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$Median_Home_Value_10adj, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 3.11530115510163"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$Median_Home_Value_10adj, na.rm = TRUE) < mean(svi_national_lihtc_df$Median_Home_Value_10adj, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_lihtc_df$Median_Home_Value_10adj_log)

Code
plotNormalHistogram(svi_national_lihtc_df$Median_Home_Value_10adj_log)

Code
ggdensity(svi_national_lihtc_df, x = "Median_Home_Value_10adj_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 148 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 148 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$Median_Home_Value_10adj_log, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$Median_Home_Value_10adj_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$Median_Home_Value_10adj_log)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$Median_Home_Value_10adj_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.247586220754559"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$Median_Home_Value_10adj_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.825939255327966"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$Median_Home_Value_10adj_log, na.rm = TRUE) < mean(svi_national_lihtc_df$Median_Home_Value_10adj_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$Median_Home_Value_19)

Code
plotNormalHistogram(svi_national_lihtc_df$Median_Home_Value_19)

Code
ggdensity(svi_national_lihtc_df, x = "Median_Home_Value_19", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 230 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 230 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$Median_Home_Value_19, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$Median_Home_Value_19, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$Median_Home_Value_19)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$Median_Home_Value_19, na.rm = TRUE))))
[1] "Absolute Skewness: 2.34541037376526"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$Median_Home_Value_19, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 8.37067295412282"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$Median_Home_Value_19, na.rm = TRUE) < mean(svi_national_lihtc_df$Median_Home_Value_19, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_lihtc_df$Median_Home_Value_19_log)

Code
plotNormalHistogram(svi_national_lihtc_df$Median_Home_Value_19_log)

Code
ggdensity(svi_national_lihtc_df, x = "Median_Home_Value_19_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 230 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 230 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$Median_Home_Value_19_log, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$Median_Home_Value_19_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$Median_Home_Value_19_log)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$Median_Home_Value_19_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.286856482638145"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$Median_Home_Value_19_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.636405799672505"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$Median_Home_Value_19_log, na.rm = TRUE) < mean(svi_national_lihtc_df$Median_Home_Value_19_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Housing Price Index

Code
hist(svi_national_lihtc_df$housing_price_index10)

Code
plotNormalHistogram(svi_national_lihtc_df$housing_price_index10)

Code
ggdensity(svi_national_lihtc_df, x = "housing_price_index10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 2876 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 2876 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$housing_price_index10, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$housing_price_index10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$housing_price_index10)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$housing_price_index10, na.rm = TRUE))))
[1] "Absolute Skewness: 1.59597749509696"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$housing_price_index10, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 3.12345644276895"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$housing_price_index10, na.rm = TRUE) < mean(svi_national_lihtc_df$housing_price_index10, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$housing_price_index10_log)

Code
plotNormalHistogram(svi_national_lihtc_df$housing_price_index10_log)

Code
ggdensity(svi_national_lihtc_df, x = "housing_price_index10_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 2876 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 2876 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$housing_price_index10_log, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$housing_price_index10_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$housing_price_index10_log)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$housing_price_index10_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.341591279584173"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$housing_price_index10_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.191304327779092"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$housing_price_index10_log, na.rm = TRUE) < mean(svi_national_lihtc_df$housing_price_index10_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_national_lihtc_df$housing_price_index20)

Code
plotNormalHistogram(svi_national_lihtc_df$housing_price_index20)

Code
ggdensity(svi_national_lihtc_df, x = "housing_price_index20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 2718 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 2718 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$housing_price_index20, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$housing_price_index20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$housing_price_index20)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$housing_price_index20, na.rm = TRUE))))
[1] "Absolute Skewness: 1.78599462208052"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$housing_price_index20, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.92519545732658"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$housing_price_index20, na.rm = TRUE) < mean(svi_national_lihtc_df$housing_price_index20, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_national_lihtc_df$housing_price_index20_log)

Code
plotNormalHistogram(svi_national_lihtc_df$housing_price_index20_log)

Code
ggdensity(svi_national_lihtc_df, x = "housing_price_index20_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 2718 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 2718 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_national_lihtc_df$housing_price_index20_log, pch = 1, frame = FALSE)
qqline(svi_national_lihtc_df$housing_price_index20_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_national_lihtc_df$housing_price_index20_log)))
[1] "Length: 3723"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_national_lihtc_df$housing_price_index20_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.238617438547599"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_national_lihtc_df$housing_price_index20_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.144393114411222"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_national_lihtc_df$housing_price_index20_log, na.rm = TRUE) < mean(svi_national_lihtc_df$housing_price_index20_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Divisional

SVI Theme 1: Socioeconomic Status

Code
hist(svi_divisional_lihtc_df$F_THEME1_10)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_THEME1_10)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_THEME1_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_THEME1_10, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_THEME1_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_THEME1_10)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_THEME1_10))))
[1] "Absolute Skewness: 0.464681434235617"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_THEME1_10))))
[1] "Absolute Excess Kurtosis: 0.342191343459457"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_THEME1_10) < mean(svi_divisional_lihtc_df$F_THEME1_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_lihtc_df$F_THEME1_20)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_THEME1_20)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_THEME1_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_THEME1_20, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_THEME1_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_THEME1_20)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_THEME1_20))))
[1] "Absolute Skewness: 0.545550612102249"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_THEME1_20))))
[1] "Absolute Excess Kurtosis: 0.281029849510078"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_THEME1_20) < mean(svi_divisional_lihtc_df$F_THEME1_20)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

SVI Theme 2: Household Characteristics

Code
hist(svi_divisional_lihtc_df$F_THEME2_10)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_THEME2_10)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_THEME2_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_THEME2_10, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_THEME2_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_THEME2_10)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_THEME2_10))))
[1] "Absolute Skewness: 0.390621345650171"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_THEME2_10))))
[1] "Absolute Excess Kurtosis: 0.400071665209667"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_THEME2_10) < mean(svi_divisional_lihtc_df$F_THEME2_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_lihtc_df$F_THEME2_20)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_THEME2_20)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_THEME2_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_THEME2_20, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_THEME2_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_THEME2_20)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_THEME2_20))))
[1] "Absolute Skewness: 0.313231265579455"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_THEME2_20))))
[1] "Absolute Excess Kurtosis: 0.595283883937745"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_THEME2_20) < mean(svi_divisional_lihtc_df$F_THEME2_20)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

SVI Theme 3: Racial & Ethnic Minority Status

Code
hist(svi_divisional_lihtc_df$F_THEME3_10)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_THEME3_10)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_THEME3_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_THEME3_10, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_THEME1_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_THEME3_10)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_THEME3_10))))
[1] "Absolute Skewness: 0.5688091096646"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_THEME3_10))))
[1] "Absolute Excess Kurtosis: 1.67645619676257"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_THEME3_10) < mean(svi_divisional_lihtc_df$F_THEME3_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
table(svi_divisional_lihtc_df$F_THEME3_10)

  0   1 
239 419 
Code
hist(svi_divisional_lihtc_df$F_THEME3_20)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_THEME3_20)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_THEME3_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_THEME3_20, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_THEME3_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_THEME3_20)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_THEME3_20))))
[1] "Absolute Skewness: 0.46167791726972"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_THEME3_20))))
[1] "Absolute Excess Kurtosis: 1.78685350070549"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_THEME3_20) < mean(svi_divisional_lihtc_df$F_THEME3_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
table(svi_divisional_lihtc_df$F_THEME3_20)

  0   1 
255 403 

SVI Theme 4: Housing Type & Transportation

Code
hist(svi_divisional_lihtc_df$F_THEME4_10)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_THEME4_10)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_THEME4_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_THEME4_10, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_THEME4_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_THEME4_10)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_THEME4_10))))
[1] "Absolute Skewness: 0.0528675963068699"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_THEME4_10))))
[1] "Absolute Excess Kurtosis: 0.641139325557921"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_THEME4_10) < mean(svi_divisional_lihtc_df$F_THEME4_10)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_lihtc_df$F_THEME4_20)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_THEME4_20)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_THEME4_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_THEME4_20, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_THEME4_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_THEME4_20)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_THEME4_20))))
[1] "Absolute Skewness: 0.154415581949325"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_THEME4_20))))
[1] "Absolute Excess Kurtosis: 0.575882787137674"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_THEME4_20) < mean(svi_divisional_lihtc_df$F_THEME4_20)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"

SVI Overall

Code
hist(svi_divisional_lihtc_df$F_TOTAL_10)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_TOTAL_10)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_TOTAL_10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_TOTAL_10, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_TOTAL_10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_TOTAL_10)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_TOTAL_10))))
[1] "Absolute Skewness: 0.503794532885274"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_TOTAL_10))))
[1] "Absolute Excess Kurtosis: 0.128544362240345"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_TOTAL_10) < mean(svi_divisional_lihtc_df$F_TOTAL_10)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_lihtc_df$F_TOTAL_20)

Code
plotNormalHistogram(svi_divisional_lihtc_df$F_TOTAL_20)

Code
ggdensity(svi_divisional_lihtc_df, x = "F_TOTAL_20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$F_TOTAL_20, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$F_TOTAL_20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$F_TOTAL_20)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$F_TOTAL_20))))
[1] "Absolute Skewness: 0.417380450371442"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$F_TOTAL_20))))
[1] "Absolute Excess Kurtosis: 0.305625641219157"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$F_TOTAL_20) < mean(svi_divisional_lihtc_df$F_TOTAL_20)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Median Income

Code
options(scipen = 999)
hist(svi_divisional_lihtc_df$Median_Income_10adj)

Code
plotNormalHistogram(svi_divisional_lihtc_df$Median_Income_10adj)

Code
ggdensity(svi_divisional_lihtc_df, x = "Median_Income_10adj", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$Median_Income_10adj, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$Median_Income_10adj, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$Median_Income_10adj)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$Median_Income_10adj, na.rm = TRUE))))
[1] "Absolute Skewness: 2.59458746072646"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$Median_Income_10adj, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 23.4554277758189"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$Median_Income_10adj, na.rm = TRUE) < mean(svi_divisional_lihtc_df$Median_Income_10adj, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_lihtc_df$Median_Income_10adj_log)

Code
plotNormalHistogram(svi_divisional_lihtc_df$Median_Income_10adj_log)

Code
ggdensity(svi_divisional_lihtc_df, x = "Median_Income_10adj_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")

Code
qqnorm(svi_divisional_lihtc_df$Median_Income_10adj_log, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$Median_Income_10adj_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$Median_Income_10adj_log)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$Median_Income_10adj_log, na.rm = TRUE))))
[1] "Absolute Skewness: 1.27132616855256"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$Median_Income_10adj_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.37089990524896"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$Median_Income_10adj_log, na.rm = TRUE) < mean(svi_divisional_lihtc_df$Median_Income_10adj_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
options(scipen = 999)
hist(svi_divisional_lihtc_df$Median_Income_19)

Code
plotNormalHistogram(svi_divisional_lihtc_df$Median_Income_19)

Code
ggdensity(svi_divisional_lihtc_df, x = "Median_Income_19", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$Median_Income_19, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$Median_Income_19, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$Median_Income_19)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$Median_Income_19, na.rm = TRUE))))
[1] "Absolute Skewness: 2.31568439994785"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$Median_Income_19, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 16.252149789397"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$Median_Income_19, na.rm = TRUE) < mean(svi_divisional_lihtc_df$Median_Income_19, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_lihtc_df$Median_Income_19_log)

Code
plotNormalHistogram(svi_divisional_lihtc_df$Median_Income_19_log)

Code
ggdensity(svi_divisional_lihtc_df, x = "Median_Income_19_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 1 row containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$Median_Income_19_log, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$Median_Income_19_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$Median_Income_19_log)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$Median_Income_19_log, na.rm = TRUE))))
[1] "Absolute Skewness: 1.16994389961393"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$Median_Income_19_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 4.8077691335981"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$Median_Income_19_log, na.rm = TRUE) < mean(svi_divisional_lihtc_df$Median_Income_19_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Median Home Value

Code
hist(svi_divisional_lihtc_df$Median_Home_Value_10adj)

Code
plotNormalHistogram(svi_divisional_lihtc_df$Median_Home_Value_10adj)

Code
ggdensity(svi_divisional_lihtc_df, x = "Median_Home_Value_10adj", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 50 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 50 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$Median_Home_Value_10adj, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$Median_Home_Value_10adj, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$Median_Home_Value_10adj)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$Median_Home_Value_10adj, na.rm = TRUE))))
[1] "Absolute Skewness: 0.893491528517774"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$Median_Home_Value_10adj, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.0996552991162174"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$Median_Home_Value_10adj, na.rm = TRUE) < mean(svi_divisional_lihtc_df$Median_Home_Value_10adj, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_lihtc_df$Median_Home_Value_10adj_log)

Code
plotNormalHistogram(svi_divisional_lihtc_df$Median_Home_Value_10adj_log)

Code
ggdensity(svi_divisional_lihtc_df, x = "Median_Home_Value_10adj_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 50 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 50 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$Median_Home_Value_10adj_log, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$Median_Home_Value_10adj_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$Median_Home_Value_10adj_log)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$Median_Home_Value_10adj_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.228260574560246"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$Median_Home_Value_10adj_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 1.19610799318265"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$Median_Home_Value_10adj_log, na.rm = TRUE) < mean(svi_divisional_lihtc_df$Median_Home_Value_10adj_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_lihtc_df$Median_Home_Value_19)

Code
plotNormalHistogram(svi_divisional_lihtc_df$Median_Home_Value_19)

Code
ggdensity(svi_divisional_lihtc_df, x = "Median_Home_Value_19", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 75 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 75 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$Median_Home_Value_19, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$Median_Home_Value_19, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$Median_Home_Value_19)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$Median_Home_Value_19, na.rm = TRUE))))
[1] "Absolute Skewness: 1.34108638895171"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$Median_Home_Value_19, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 1.80163937222985"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$Median_Home_Value_19, na.rm = TRUE) < mean(svi_divisional_lihtc_df$Median_Home_Value_19, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_lihtc_df$Median_Home_Value_19_log)

Code
plotNormalHistogram(svi_divisional_lihtc_df$Median_Home_Value_19_log)

Code
ggdensity(svi_divisional_lihtc_df, x = "Median_Home_Value_19_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 75 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 75 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$Median_Home_Value_19_log, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$Median_Home_Value_19_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$Median_Home_Value_19_log)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$Median_Home_Value_19_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.000866668136410215"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$Median_Home_Value_19_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 1.13222529851935"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$Median_Home_Value_19_log, na.rm = TRUE) < mean(svi_divisional_lihtc_df$Median_Home_Value_19_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Housing Price Index

Code
hist(svi_divisional_lihtc_df$housing_price_index10)

Code
plotNormalHistogram(svi_divisional_lihtc_df$housing_price_index10)

Code
ggdensity(svi_divisional_lihtc_df, x = "housing_price_index10", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 579 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 579 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$housing_price_index10, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$housing_price_index10, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$housing_price_index10)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$housing_price_index10, na.rm = TRUE))))
[1] "Absolute Skewness: 1.69259505587305"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$housing_price_index10, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 3.49396426720368"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$housing_price_index10, na.rm = TRUE) < mean(svi_divisional_lihtc_df$housing_price_index10, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_lihtc_df$housing_price_index10_log)

Code
plotNormalHistogram(svi_divisional_lihtc_df$housing_price_index10_log)

Code
ggdensity(svi_divisional_lihtc_df, x = "housing_price_index10_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 579 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 579 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$housing_price_index10_log, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$housing_price_index10_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$housing_price_index10_log)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$housing_price_index10_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.562222244015004"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$housing_price_index10_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.0301918947730955"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$housing_price_index10_log, na.rm = TRUE) < mean(svi_divisional_lihtc_df$housing_price_index10_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"
Code
hist(svi_divisional_lihtc_df$housing_price_index20)

Code
plotNormalHistogram(svi_divisional_lihtc_df$housing_price_index20)

Code
ggdensity(svi_divisional_lihtc_df, x = "housing_price_index20", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 571 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 571 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$housing_price_index20, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$housing_price_index20, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$housing_price_index20)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$housing_price_index20, na.rm = TRUE))))
[1] "Absolute Skewness: 2.07804027088013"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$housing_price_index20, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 5.54809587327635"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$housing_price_index20, na.rm = TRUE) < mean(svi_divisional_lihtc_df$housing_price_index20, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: FALSE"
Code
hist(svi_divisional_lihtc_df$housing_price_index20_log)

Code
plotNormalHistogram(svi_divisional_lihtc_df$housing_price_index20_log)

Code
ggdensity(svi_divisional_lihtc_df, x = "housing_price_index20_log", fill = "lightgray") +
  stat_overlay_normal_density(color = "red", linetype = "dashed")
Warning: Removed 571 rows containing non-finite outside the scale range
(`stat_density()`).
Warning: Removed 571 rows containing non-finite outside the scale range
(`stat_overlay_normal_density()`).

Code
qqnorm(svi_divisional_lihtc_df$housing_price_index20_log, pch = 1, frame = FALSE)
qqline(svi_divisional_lihtc_df$housing_price_index20_log, col = "steelblue", lwd = 2)

Code
# Statistics

print(paste0("Length: ", length(svi_divisional_lihtc_df$housing_price_index20_log)))
[1] "Length: 658"
Code
print(paste0("Absolute Skewness: ", abs(skewness(svi_divisional_lihtc_df$housing_price_index20_log, na.rm = TRUE))))
[1] "Absolute Skewness: 0.646423611782883"
Code
print(paste0("Absolute Excess Kurtosis: ", abs(3 - kurtosis(svi_divisional_lihtc_df$housing_price_index20_log, na.rm = TRUE))))
[1] "Absolute Excess Kurtosis: 0.196532258078191"
Code
print(paste0("Standard deviation is less than 1/2 mean: ", sd(svi_divisional_lihtc_df$housing_price_index20_log, na.rm = TRUE) < mean(svi_divisional_lihtc_df$housing_price_index20_log, na.rm = TRUE)/2))
[1] "Standard deviation is less than 1/2 mean: TRUE"

Diff-In-Diff

Now that we have wrangled our data and explored the distribution of our dependent variables of interest, we need to structure our data to for our diff-in-diff models:

NMTC National

Create National Models

First, we can create datasets with our SVI variables for socioeconomic status, household characteristics, racial and ethnic minorities, and housing and transportation issues:

SVI Model Data

Code
# Create 2010 df, create post variable and set to 0, create year variable and set to 2010
nmtc_did10_usa_svi <- svi_national_nmtc_df %>% 
  select(GEOID_2010_trt, cbsa, F_THEME1_10, F_THEME2_10, F_THEME3_10, F_THEME4_10, F_TOTAL_10, nmtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "nmtc_flag",
         "SVI_FLAG_COUNT_SES" = "F_THEME1_10",
         "SVI_FLAG_COUNT_HHCHAR" = "F_THEME2_10",
         "SVI_FLAG_COUNT_REM" = "F_THEME3_10",
         "SVI_FLAG_COUNT_HOUSETRANSPT" = "F_THEME4_10",
         "SVI_FLAG_COUNT_OVERALL" = "F_TOTAL_10") 

nrow(nmtc_did10_usa_svi)
[1] 29068
Code
nmtc_did10_usa_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
01001020200 Montgomery-Alexander City, AL CSA 1 3 1 1 6 0 0 2010
01001020700 Montgomery-Alexander City, AL CSA 0 2 0 1 3 0 0 2010
01001021100 Montgomery-Alexander City, AL CSA 2 1 1 1 5 0 0 2010
01003010200 Mobile-Daphne-Fairhope, AL CSA 1 1 0 1 3 1 0 2010
01003010500 Mobile-Daphne-Fairhope, AL CSA 1 0 0 2 3 0 0 2010
01003010600 Mobile-Daphne-Fairhope, AL CSA 2 3 1 3 9 1 0 2010
Code
# Create 2020 df, create post variable and set to 1, create year variable and set to 2020
nmtc_did20_usa_svi <- svi_national_nmtc_df %>% 
  select(GEOID_2010_trt, cbsa, F_THEME1_20, F_THEME2_20, F_THEME3_20, F_THEME4_20, F_TOTAL_20, nmtc_flag) %>% 
  mutate(post = 1,
         year = 2020) %>%
  rename("treat" = "nmtc_flag",
         "SVI_FLAG_COUNT_SES" = "F_THEME1_20",
         "SVI_FLAG_COUNT_HHCHAR" = "F_THEME2_20",
         "SVI_FLAG_COUNT_REM" = "F_THEME3_20",
         "SVI_FLAG_COUNT_HOUSETRANSPT" = "F_THEME4_20",
         "SVI_FLAG_COUNT_OVERALL" = "F_TOTAL_20"
         )


nrow(nmtc_did20_usa_svi)
[1] 29068
Code
nmtc_did20_usa_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
01001020200 Montgomery-Alexander City, AL CSA 0 0 1 1 2 0 1 2020
01001020700 Montgomery-Alexander City, AL CSA 4 2 0 3 9 0 1 2020
01001021100 Montgomery-Alexander City, AL CSA 3 2 0 2 7 0 1 2020
01003010200 Mobile-Daphne-Fairhope, AL CSA 0 2 0 1 3 1 1 2020
01003010500 Mobile-Daphne-Fairhope, AL CSA 0 0 0 1 1 0 1 2020
01003010600 Mobile-Daphne-Fairhope, AL CSA 5 2 1 2 10 1 1 2020

Join 2010 and 2020 data into one df

Code
nmtc_diff_in_diff_usa_svi <- bind_rows(nmtc_did10_usa_svi, nmtc_did20_usa_svi)

nmtc_diff_in_diff_usa_svi <- nmtc_diff_in_diff_usa_svi %>% arrange(post, treat, GEOID_2010_trt)

nrow(nmtc_diff_in_diff_usa_svi)
[1] 58136

View top of data frame

Code
nmtc_diff_in_diff_usa_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
01001020200 Montgomery-Alexander City, AL CSA 1 3 1 1 6 0 0 2010
01001020700 Montgomery-Alexander City, AL CSA 0 2 0 1 3 0 0 2010
01001021100 Montgomery-Alexander City, AL CSA 2 1 1 1 5 0 0 2010
01003010500 Mobile-Daphne-Fairhope, AL CSA 1 0 0 2 3 0 0 2010
01003011000 Mobile-Daphne-Fairhope, AL CSA 2 2 0 1 5 0 0 2010
01003011406 Mobile-Daphne-Fairhope, AL CSA 1 1 0 1 3 0 0 2010

View bottom of data frame

Code
nmtc_diff_in_diff_usa_svi %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
55129950100 NA 0 2 0 1 3 1 1 2020
55141011200 Wisconsin Rapids-Marshfield, WI MicroSA 2 2 0 0 4 1 1 2020
56001963700 Laramie, WY MicroSA 2 0 0 1 3 1 1 2020
56013940100 Riverton, WY MicroSA 3 3 1 2 9 1 1 2020
56013940300 Riverton, WY MicroSA 1 0 0 3 4 1 1 2020
56015957800 NA 2 1 0 2 5 1 1 2020

Economic Outcomes Models Data

Next, we can create a set of data with our variables to measure the economic outcomes of house price index, median home value, and median income:

Create dataset for median income

Code
# Create 2010 df, create post variable and set to 0, create year variable and set to 2010, remove any tracts that don't have data for 2010 and 2019
nmtc_did10_usa_inc <- svi_national_nmtc_df %>% 
  filter(!is.na(Median_Income_10adj_log)) %>% filter(!is.na(Median_Income_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Income_10adj_log, nmtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "nmtc_flag",
         "MEDIAN_INCOME" = "Median_Income_10adj_log") 


nrow(nmtc_did10_usa_inc)
[1] 29055
Code
nmtc_did10_usa_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
01001020200 Montgomery-Alexander City, AL CSA 10.023354 0 0 2010
01001020700 Montgomery-Alexander City, AL CSA 10.152386 0 0 2010
01001021100 Montgomery-Alexander City, AL CSA 9.946380 0 0 2010
01003010200 Mobile-Daphne-Fairhope, AL CSA 10.228462 1 0 2010
01003010500 Mobile-Daphne-Fairhope, AL CSA 10.128174 0 0 2010
01003010600 Mobile-Daphne-Fairhope, AL CSA 9.934699 1 0 2010
Code
# Create 2019 df, create post variable and set to 1, create year variable and set to 2019, remove any tracts that don't have data for 2010 and 2019
nmtc_did19_usa_inc <- svi_national_nmtc_df %>% 
  filter(!is.na(Median_Income_10adj_log)) %>% filter(!is.na(Median_Income_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Income_19_log, nmtc_flag) %>% 
  mutate(post = 1,
         year = 2019) %>%
  rename("treat" = "nmtc_flag",
         "MEDIAN_INCOME" = "Median_Income_19_log") 


nrow(nmtc_did19_usa_inc)
[1] 29055
Code
nmtc_did19_usa_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
01001020200 Montgomery-Alexander City, AL CSA 9.911158 0 1 2019
01001020700 Montgomery-Alexander City, AL CSA 9.949130 0 1 2019
01001021100 Montgomery-Alexander City, AL CSA 9.934017 0 1 2019
01003010200 Mobile-Daphne-Fairhope, AL CSA 10.169116 1 1 2019
01003010500 Mobile-Daphne-Fairhope, AL CSA 10.250652 0 1 2019
01003010600 Mobile-Daphne-Fairhope, AL CSA 9.708263 1 1 2019

Join 2010 and 2019 data into one df for income

Code
nmtc_diff_in_diff_usa_inc <- bind_rows(nmtc_did10_usa_inc, nmtc_did19_usa_inc)

nmtc_diff_in_diff_usa_inc <- nmtc_diff_in_diff_usa_inc %>% arrange(post, treat, GEOID_2010_trt)

nrow(nmtc_diff_in_diff_usa_inc)
[1] 58110

View top of data frame for income

Code
nmtc_diff_in_diff_usa_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
01001020200 Montgomery-Alexander City, AL CSA 10.02335 0 0 2010
01001020700 Montgomery-Alexander City, AL CSA 10.15239 0 0 2010
01001021100 Montgomery-Alexander City, AL CSA 9.94638 0 0 2010
01003010500 Mobile-Daphne-Fairhope, AL CSA 10.12817 0 0 2010
01003011000 Mobile-Daphne-Fairhope, AL CSA 10.01835 0 0 2010
01003011406 Mobile-Daphne-Fairhope, AL CSA 10.45196 0 0 2010

View bottom of data frame income

Code
nmtc_diff_in_diff_usa_inc %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
55129950100 NA 10.179300 1 1 2019
55141011200 Wisconsin Rapids-Marshfield, WI MicroSA 10.010771 1 1 2019
56001963700 Laramie, WY MicroSA 9.955226 1 1 2019
56013940100 Riverton, WY MicroSA 9.870964 1 1 2019
56013940300 Riverton, WY MicroSA 10.148901 1 1 2019
56015957800 NA 10.308286 1 1 2019

Create dataset for home value

Code
nmtc_did10_usa_mhv <- svi_national_nmtc_df %>% 
  filter(!is.na(Median_Home_Value_10adj_log)) %>% filter(!is.na(Median_Home_Value_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Home_Value_10adj_log, nmtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "nmtc_flag",
         "MEDIAN_HOME_VALUE" = "Median_Home_Value_10adj_log") 


nrow(nmtc_did10_usa_mhv)
[1] 28199
Code
nmtc_did10_usa_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
01001020200 Montgomery-Alexander City, AL CSA 11.98705 0 0 2010
01001020700 Montgomery-Alexander City, AL CSA 11.59734 0 0 2010
01001021100 Montgomery-Alexander City, AL CSA 11.36024 0 0 2010
01003010200 Mobile-Daphne-Fairhope, AL CSA 11.69284 1 0 2010
01003010500 Mobile-Daphne-Fairhope, AL CSA 11.85279 0 0 2010
01003010600 Mobile-Daphne-Fairhope, AL CSA 11.45800 1 0 2010
Code
nmtc_did19_usa_mhv <- svi_national_nmtc_df %>% 
  filter(!is.na(Median_Home_Value_10adj_log)) %>% filter(!is.na(Median_Home_Value_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Home_Value_19_log, nmtc_flag) %>% 
  mutate(post = 1,
         year = 2019) %>%
  rename("treat" = "nmtc_flag",
         "MEDIAN_HOME_VALUE" = "Median_Home_Value_19_log") 


nrow(nmtc_did19_usa_mhv)
[1] 28199
Code
nmtc_did19_usa_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
01001020200 Montgomery-Alexander City, AL CSA 11.41311 0 1 2019
01001020700 Montgomery-Alexander City, AL CSA 11.31934 0 1 2019
01001021100 Montgomery-Alexander City, AL CSA 11.39189 0 1 2019
01003010200 Mobile-Daphne-Fairhope, AL CSA 11.82701 1 1 2019
01003010500 Mobile-Daphne-Fairhope, AL CSA 11.90834 0 1 2019
01003010600 Mobile-Daphne-Fairhope, AL CSA 11.55885 1 1 2019

Join 2010 and 2019 data into one df for home value

Code
nmtc_diff_in_diff_usa_mhv <- bind_rows(nmtc_did10_usa_mhv, nmtc_did19_usa_mhv)

nmtc_diff_in_diff_usa_mhv <- nmtc_diff_in_diff_usa_mhv %>% arrange(post, treat, GEOID_2010_trt)

nrow(nmtc_diff_in_diff_usa_mhv)
[1] 56398

View top of data frame for home value

Code
nmtc_diff_in_diff_usa_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
01001020200 Montgomery-Alexander City, AL CSA 11.98705 0 0 2010
01001020700 Montgomery-Alexander City, AL CSA 11.59734 0 0 2010
01001021100 Montgomery-Alexander City, AL CSA 11.36024 0 0 2010
01003010500 Mobile-Daphne-Fairhope, AL CSA 11.85279 0 0 2010
01003011000 Mobile-Daphne-Fairhope, AL CSA 11.89563 0 0 2010
01003011406 Mobile-Daphne-Fairhope, AL CSA 12.58560 0 0 2010

View bottom of data frame for home value

Code
nmtc_diff_in_diff_usa_mhv %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
55129950100 NA 11.97540 1 1 2019
55141011200 Wisconsin Rapids-Marshfield, WI MicroSA 11.36674 1 1 2019
56001963700 Laramie, WY MicroSA 12.48673 1 1 2019
56013940100 Riverton, WY MicroSA 11.62893 1 1 2019
56013940300 Riverton, WY MicroSA 11.72238 1 1 2019
56015957800 NA 11.98480 1 1 2019

Create data set for house price index

Code
nmtc_did10_usa_hpi <- svi_national_nmtc_df %>% 
  filter(!is.na(housing_price_index10_log)) %>% filter(!is.na(housing_price_index20_log)) %>%
  select(GEOID_2010_trt, cbsa, housing_price_index10_log, nmtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "nmtc_flag",
         "HOUSE_PRICE_INDEX" = "housing_price_index10_log") 


nrow(nmtc_did10_usa_hpi)
[1] 13611
Code
nmtc_did10_usa_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
01001020200 Montgomery-Alexander City, AL CSA 4.818506 0 0 2010
01001020700 Montgomery-Alexander City, AL CSA 4.563723 0 0 2010
01001021100 Montgomery-Alexander City, AL CSA 4.898809 0 0 2010
01003010200 Mobile-Daphne-Fairhope, AL CSA 4.854995 1 0 2010
01003010500 Mobile-Daphne-Fairhope, AL CSA 5.255253 0 0 2010
01003011000 Mobile-Daphne-Fairhope, AL CSA 4.865147 0 0 2010
Code
nmtc_did20_usa_hpi <- svi_national_nmtc_df %>% 
  filter(!is.na(housing_price_index10_log)) %>% filter(!is.na(housing_price_index20_log)) %>%
  select(GEOID_2010_trt, cbsa, housing_price_index20_log, nmtc_flag) %>% 
  mutate(post = 1,
         year = 2020) %>%
  rename("treat" = "nmtc_flag",
         "HOUSE_PRICE_INDEX" = "housing_price_index20_log") 


nrow(nmtc_did20_usa_hpi)
[1] 13611
Code
nmtc_did20_usa_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
01001020200 Montgomery-Alexander City, AL CSA 4.815188 0 1 2020
01001020700 Montgomery-Alexander City, AL CSA 4.686474 0 1 2020
01001021100 Montgomery-Alexander City, AL CSA 4.979557 0 1 2020
01003010200 Mobile-Daphne-Fairhope, AL CSA 5.113613 1 1 2020
01003010500 Mobile-Daphne-Fairhope, AL CSA 5.363590 0 1 2020
01003011000 Mobile-Daphne-Fairhope, AL CSA 5.240953 0 1 2020

Join 2010 and 2019 data into one df for house price index

Code
nmtc_diff_in_diff_usa_hpi <- bind_rows(nmtc_did10_usa_hpi, nmtc_did20_usa_hpi)

nmtc_diff_in_diff_usa_hpi <- nmtc_diff_in_diff_usa_hpi %>% arrange(post, treat, GEOID_2010_trt)

nrow(nmtc_diff_in_diff_usa_hpi)
[1] 27222

View top of data frame for house price index

Code
nmtc_diff_in_diff_usa_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
01001020200 Montgomery-Alexander City, AL CSA 4.818506 0 0 2010
01001020700 Montgomery-Alexander City, AL CSA 4.563723 0 0 2010
01001021100 Montgomery-Alexander City, AL CSA 4.898809 0 0 2010
01003010500 Mobile-Daphne-Fairhope, AL CSA 5.255253 0 0 2010
01003011000 Mobile-Daphne-Fairhope, AL CSA 4.865147 0 0 2010
01003011601 Mobile-Daphne-Fairhope, AL CSA 5.129129 0 0 2010

View bottom of data frame for house price index

Code
nmtc_diff_in_diff_usa_hpi %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
55125940000 NA 5.908001 1 1 2020
55127000501 Whitewater, WI MicroSA 5.471682 1 1 2020
55129950100 NA 5.281070 1 1 2020
55141011200 Wisconsin Rapids-Marshfield, WI MicroSA 5.218516 1 1 2020
56001963700 Laramie, WY MicroSA 5.714557 1 1 2020
56015957800 NA 5.190955 1 1 2020

NMTC National Model

Now that we have our datasets created, we can craft our models. Remember that in R we can use the lm() function for linear models. We can then format the output of models using packages like modelsummary to create easy-to-read output tables (note: unlike stargazer and the base lm() output, your regression models will not print directly in your .RMD file, you will need to view the output in the ‘viewer’ window in RStudio):

Code
# SVI & Economic Models

m1_nmtc_usa <- lm( SVI_FLAG_COUNT_SES ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_usa_svi )

m2_nmtc_usa <- lm( SVI_FLAG_COUNT_HHCHAR ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_usa_svi )

m3_nmtc_usa <- lm( SVI_FLAG_COUNT_REM ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_usa_svi )

m4_nmtc_usa <- lm( SVI_FLAG_COUNT_HOUSETRANSPT ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_usa_svi )

m5_nmtc_usa <- lm( SVI_FLAG_COUNT_OVERALL  ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_usa_svi)

m6_nmtc_usa <- lm( MEDIAN_INCOME ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_usa_inc )

m7_nmtc_usa <- lm( MEDIAN_HOME_VALUE ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_usa_mhv )

m8_nmtc_usa <- lm( HOUSE_PRICE_INDEX ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_usa_hpi )

# Add all models to a list
models <- list(

  "SES" = m1_nmtc_usa,
  "HHChar"  = m2_nmtc_usa,
  "REM" = m3_nmtc_usa,
  "HOUSETRANSPT" = m4_nmtc_usa,
  "OVERALL" = m5_nmtc_usa,
  "Median Income (USD, logged)" = m6_nmtc_usa,
  "Median Home Value (USD, logged)" = m7_nmtc_usa,
  "House Price Index (logged)" = m8_nmtc_usa
)


# Display model results
modelsummary(models,  fmt = 2, stars = c('*' = .05, '**' = .01, '***' = .001), coef_omit = "cbsa", gof_omit = "IC|Log",
              notes = list('All models include metro-level fixed effects by core-based statistical area (cbsa).'),
              title = paste0("Differences-in-Differences Linear Regression Analysis of NMTC in ", "United States")) %>%
    group_tt(j = list("Social Vulnerability" = 2:6, "Economic Outcomes" = 7:9))
Social Vulnerability Economic Outcomes
Differences-in-Differences Linear Regression Analysis of NMTC in United States
SES HHChar REM HOUSETRANSPT OVERALL Median Income (USD, logged) Median Home Value (USD, logged) House Price Index (logged)
* p < 0.05, ** p < 0.01, *** p < 0.001
All models include metro-level fixed effects by core-based statistical area (cbsa).
(Intercept) 1.39 0.79 -0.13 2.62*** 4.67* 9.96*** 11.59*** 4.87***
(0.97) (0.71) (0.29) (0.69) (1.91) (0.21) (0.29) (0.23)
treat 0.73*** 0.28*** 0.14*** 0.38*** 1.53*** -0.14*** -0.06*** -0.03*
(0.03) (0.02) (0.01) (0.02) (0.07) (0.01) (0.01) (0.01)
post -0.04*** -0.06*** 0.00 -0.02 -0.13*** 0.02*** -0.09*** 0.40***
(0.01) (0.01) (0.00) (0.01) (0.02) (0.00) (0.00) (0.00)
treat × post -0.19*** -0.07 -0.02 0.02 -0.26** 0.04*** 0.01 -0.01
(0.05) (0.03) (0.01) (0.03) (0.09) (0.01) (0.01) (0.02)
Num.Obs. 52344 52344 52344 52344 52344 52326 50618 24934
R2 0.201 0.125 0.353 0.139 0.233 0.168 0.659 0.490
R2 Adj. 0.190 0.113 0.344 0.127 0.222 0.157 0.654 0.477
F 18.279 10.431 39.670 11.764 22.061 14.688 136.380 35.739
RMSE 1.37 0.99 0.40 0.97 2.68 0.30 0.41 0.32

Interpret National SVI & Economic Models

To begin interpreting our models, we first want to note that all of our models include metro-level fixed effect controls by cbsa (Core-Based Statistical Area) to allow the model to consider relative variation with metro areas and equitably make comparisons.

Next, we want to look at the treat x post variable to determine if our program had a statistically significant impact. If this variable is statistically significant, than we can deem that tracts that received program dollars performed significantly differently than would be expected according to general trends.

Across our SVI flag models, we can find that the categories that experienced statistically significant changes based on NMTC program enrollment on a national basis were Socioeconomic Status and Overall Social Vulnerability.

If we recall from our chart above, the Socioeconomic Status category consists of measures of poverty, unemployment, housing burdens, educational levels, and lack of health insurance. Our Overall Social Vulnerability considers areas of vulnerability across socioeconomic, household characteristics, racial and ethnic minority status, and housing and transportation access. Thus, these are all areas that the NMTC program hopes to target.

Looking at the SES model:

  • We find that our average SES Flag Count across census tracts eligible for the NMTC program was 1.39 (intercept) flags in 2010. In 2020 this decreased to 1.35 (intercept + post) flags.

  • For tracts that received tax credits from the NMTC program, the average SES flag count was 2.12 (intercept + treat) flags in 2010. In 2020, this decreased to 1.89 (intercept + treat + post + treat*post) flags.

  • Although 1.89 flags in 2020 for tracts in the NMTC program is greater than the average of 1.35 flags in non-treated tracts, the decrease in flag count was greater for tracts enrolled in the NMTC program as indicated by the treat*post coefficient.

Looking at the overall SVI model:

  • We find that our average total flag count across census tracts eligible for the NMTC program was 4.67 (intercept) flags in 2010. In 2020 this decreased to 4.54 (intercept + post) flags.

  • For tracts that received tax credits from the NMTC program, the average overall flag count was 6.2 (intercept + treat) flags in 2010. In 2020, this decreased to 5.81 (intercept + treat + post + treat*post) flags.

  • Although 5.81 flags in 2020 for tracts in the NMTC program is greater than 4.54 flags in non-treated tracts, the decrease in flag count was greater for tracts enrolled in the NMTC program as indicated by the treat*post coefficient.

Finally, we can examine our indicators of Economic Conditions and determine that changes in Median Income were statistically significantly greater in tracts that received NMTC dollars versus those that did not:

  • Specifically looking at the treat x post coefficient, recall that our economic values are logged so we can read this as an increase of 4% (.04*100) for each 1-unit increase. However, if we want to find the exact numeric calculations of this change, we can utilize the exp() function to complete our calculations:
Code
# Non-Treatment 2010 (Intercept), Avg Median Income $21,264.67 
exp(m6_nmtc_usa$coefficients[1]) 
(Intercept) 
   21264.67 
Code
# Non-Treatment 2020 (Intercept * post), Avg Median Income $21,798.59  
exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[3])
(Intercept) 
   21798.59 
Code
print( paste0("Pct change 2010-2020, non-treated: ", ((21798.59 - 21264.67)/21264.67)*100 ))
[1] "Pct change 2010-2020, non-treated: 2.5108313460778"
Code
# Treatment 2010 (Intercept * treat), Avg Median Income 18,424.47
exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[2])
(Intercept) 
   18424.47 
Code
# Treatment 2020 (Intercept * treat * post * treat x post), Avg Median Income $19,692.21
exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[2])*exp(m6_nmtc_usa$coefficients[3])*exp(m6_nmtc_usa$coefficients[length(m6_nmtc_usa$coefficients)])
(Intercept) 
   19692.21 
Code
print( paste0("Pct change 2010-2020, treated: ", ((19692.21 - 18424.47)/18424.47)*100))
[1] "Pct change 2010-2020, treated: 6.88074066716708"
Code
# Treatment 2010 (Intercept * treat), Avg Median Income 18,424.47
exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[2])
(Intercept) 
   18424.47 
Code
# Treatment 2020 Counter-Factual (Intercept * treat * post), Avg Median Income $18,887.08
exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[2])*exp(m6_nmtc_usa$coefficients[3])
(Intercept) 
   18887.08 
Code
print( paste0("Pct change 2010-2020, treated counterfactual: ", ((18887.08 - 18424.47)/18424.47)*100))
[1] "Pct change 2010-2020, treated counterfactual: 2.51084563083769"

Thus, looking at our calculations here, we can conclude that when we control for metro-level effects, our average Median Income for tracts that did not receive NMTC dollars was $21,264.67 in 2010. This increased to $21,798.59 in 2020, a 2.51% increase income.

When we control for metro-level effects, our NMTC treated tracts had an average Median Income of $18,424.47 in 2010. The average Median Income in these tracts increased to $19,692.21 in 2020. This equates to a percent change of 6.88%. An increase > 4% higher than we would expect if the tracts had followed general trends.

As a counterfactual, we can see that we would have expected the average Median Income to be $18,887.08 if it had increased by 2.5%.

Further, we can look at the percentage increases for our coefficients to confirm our calculations are correct:

Code
# 2.5% Increase in post
(exp(m6_nmtc_usa$coefficients[3]) - 1)*100
    post 
2.510835 
Code
# 4.26% Additional increase in treat x post
(exp(m6_nmtc_usa$coefficients[length(m6_nmtc_usa$coefficients)]) - 1)*100
treat:post 
  4.262861 
Code
# Combined increase
(exp(m6_nmtc_usa$coefficients[3]) - 1)*100 + (exp(m6_nmtc_usa$coefficients[length(m6_nmtc_usa$coefficients)]) - 1)*100
    post 
6.773697 

Visualize National Models

We can visualize these changes with slopegraphs. To begin, let’s look at the coefficients of our three significant models:

Code
# Recall:
# M1 is SES
# Intercept = intercept, the average count in 2010
# Treat = Impact of being in the NMTC program
# Post = Impact of year being 2020
# Treat:Post = Impact of treatment program and year being 2020
m1_nmtc_usa$coefficients[1:3]
(Intercept)       treat        post 
 1.38768634  0.72747008 -0.04412369 
Code
m1_nmtc_usa$coefficients[length(m1_nmtc_usa$coefficients)]
treat:post 
-0.1861891 
Code
# Recall:
# M5 is Overall SVI Flag Count
# Intercept = intercept, the average count in 2010
# Treat = Impact of being in the NMTC program
# Post = Impact of year being 2020
# Treat:Post = Impact of treatment program and year being 2020
m5_nmtc_usa$coefficients[1:3]
(Intercept)       treat        post 
   4.666958    1.526677   -0.128629 
Code
m5_nmtc_usa$coefficients[length(m5_nmtc_usa$coefficients)]
treat:post 
-0.2586418 
Code
# Recall:
# M6 is the logged Median Income, thus we need to pull the exponents
# Intercept = intercept, the average count in 2010
# Treat = Impact of being in the NMTC program
# Post = Impact of year being 2020
# Treat:Post = Impact of treatment program and year being 2020
exp(m6_nmtc_usa$coefficients[1:3])
 (Intercept)        treat         post 
21264.667365     0.866436     1.025108 
Code
exp(m6_nmtc_usa$coefficients[length(m6_nmtc_usa$coefficients)])
treat:post 
  1.042629 

Create visualization data frame and plot

SES

Code
status <- c("NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant", 
             "NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant")
year <- c(2010, 
          2010, 
          2010, 
          2020, 
          2020, 
          2020)
outcome <- c(m1_nmtc_usa$coefficients[1], 
           m1_nmtc_usa$coefficients[1] + m1_nmtc_usa$coefficients[2], 
           m1_nmtc_usa$coefficients[1] + m1_nmtc_usa$coefficients[2],
           m1_nmtc_usa$coefficients[1] + m1_nmtc_usa$coefficients[3], 
           m1_nmtc_usa$coefficients[1] + m1_nmtc_usa$coefficients[2] + m1_nmtc_usa$coefficients[3],
           m1_nmtc_usa$coefficients[1] + m1_nmtc_usa$coefficients[2] + m1_nmtc_usa$coefficients[3] + m1_nmtc_usa$coefficients[length(m1_nmtc_usa$coefficients)])

sviusa_viz_ses_nmtc <- data.frame(status, year, outcome)
sviusa_viz_ses_nmtc$outcome_label <- round(sviusa_viz_ses_nmtc$outcome, 2)
sviusa_viz_ses_nmtc
                           status year  outcome outcome_label
1            NMTC Non-Participant 2010 1.387686          1.39
2 NMTC Participant Counterfactual 2010 2.115156          2.12
3                NMTC Participant 2010 2.115156          2.12
4            NMTC Non-Participant 2020 1.343563          1.34
5 NMTC Participant Counterfactual 2020 2.071033          2.07
6                NMTC Participant 2020 1.884844          1.88
Code
slopegraph_plot(sviusa_viz_ses_nmtc, "NMTC Participant", "NMTC Non-Participant", "Impact of NMTC Program on SVI SES Flag Count", "United States | 2010 - 2020")

The slopegraph for SES SVI flags for the NMTC program indicates that nationally our NMTC Participant Tracts had a notable decrease in socioeconomic social vulnerability flags in 2020 from the expected count of 2.07 for the counterfactual to 1.88 for the actual outcome.

Overall SVI

Code
status <- c("NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant", 
             "NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant")
year <- c(2010, 
          2010, 
          2010, 
          2020, 
          2020, 
          2020)
outcome <- c(m5_nmtc_usa$coefficients[1], 
           m5_nmtc_usa$coefficients[1] + m5_nmtc_usa$coefficients[2], 
           m5_nmtc_usa$coefficients[1] + m5_nmtc_usa$coefficients[2],
           m5_nmtc_usa$coefficients[1] + m5_nmtc_usa$coefficients[3], 
           m5_nmtc_usa$coefficients[1] + m5_nmtc_usa$coefficients[2] + m5_nmtc_usa$coefficients[3],
           m5_nmtc_usa$coefficients[1] + m5_nmtc_usa$coefficients[2] + m5_nmtc_usa$coefficients[3] + m5_nmtc_usa$coefficients[length(m5_nmtc_usa$coefficients)])

sviusa_viz_overall_nmtc <- data.frame(status, year, outcome)
sviusa_viz_overall_nmtc$outcome_label <- round(sviusa_viz_overall_nmtc$outcome, 2)
sviusa_viz_overall_nmtc
                           status year  outcome outcome_label
1            NMTC Non-Participant 2010 4.666958          4.67
2 NMTC Participant Counterfactual 2010 6.193635          6.19
3                NMTC Participant 2010 6.193635          6.19
4            NMTC Non-Participant 2020 4.538329          4.54
5 NMTC Participant Counterfactual 2020 6.065006          6.07
6                NMTC Participant 2020 5.806365          5.81
Code
slopegraph_plot(sviusa_viz_overall_nmtc, "NMTC Participant", "NMTC Non-Participant", "Impact of NMTC Program on SVI Overall Flag Count", "United States | 2010 - 2020")

The slopegraph for overall SVI flags for the NMTC program indicates that nationally our NMTC Participant Tracts had a notable decrease in total social vulnerability flags in 2020 from the expected count of 6.07 for the counterfactual to 5.81 for the actual outcome.

Median Income

Code
status <- c("NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant", 
             "NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant")
year <- c(2010, 
          2010, 
          2010, 
          2020, 
          2020, 
          2020)
outcome <- c(exp(m6_nmtc_usa$coefficients[1]), 
           exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[2]), 
           exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[2]),
           exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[3]), 
           exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[2])*exp(m6_nmtc_usa$coefficients[3]),
           exp(m6_nmtc_usa$coefficients[1])*exp(m6_nmtc_usa$coefficients[2])*exp(m6_nmtc_usa$coefficients[3])*exp(m6_nmtc_usa$coefficients[length(m6_nmtc_usa$coefficients)])
)

sviusa_viz_medinc_nmtc <- data.frame(status, year, outcome)

### Note that instead of rounding like we did for SVI variables, we will be formatting our outcome as US dollars
sviusa_viz_medinc_nmtc$outcome_label <- scales::dollar_format()(sviusa_viz_medinc_nmtc$outcome)

sviusa_viz_medinc_nmtc
                           status year  outcome outcome_label
1            NMTC Non-Participant 2010 21264.67    $21,264.67
2 NMTC Participant Counterfactual 2010 18424.47    $18,424.47
3                NMTC Participant 2010 18424.47    $18,424.47
4            NMTC Non-Participant 2020 21798.59    $21,798.59
5 NMTC Participant Counterfactual 2020 18887.08    $18,887.08
6                NMTC Participant 2020 19692.21    $19,692.21
Code
slopegraph_plot(sviusa_viz_medinc_nmtc, "NMTC Participant", "NMTC Non-Participant", "Impact of NMTC Program on Average Median Income", "United States | 2010 - 2020")

The slopegraph for Average Median Income for the NMTC program indicates that nationally our NMTC Participant Tracts had a notable increase in 2020 from the expected income of $18,887.08 for the counterfactual to $19,692.21 for the actual outcome.

LIHTC National

Create National Models

Just as we did for the NMTC national data, we now need to create datasets with our SVI variables for socioeconomic status, household characteristics, racial and ethnic minorities, and housing and transportation issues for the LIHTC program:

SVI Model Data

Code
# Create 2010 df, create post variable and set to 0, create year variable and set to 2010
lihtc_did10_usa_svi <- svi_national_lihtc_df %>% 
  select(GEOID_2010_trt, cbsa, F_THEME1_10, F_THEME2_10, F_THEME3_10, F_THEME4_10, F_TOTAL_10, lihtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "lihtc_flag",
         "SVI_FLAG_COUNT_SES" = "F_THEME1_10",
         "SVI_FLAG_COUNT_HHCHAR" = "F_THEME2_10",
         "SVI_FLAG_COUNT_REM" = "F_THEME3_10",
         "SVI_FLAG_COUNT_HOUSETRANSPT" = "F_THEME4_10",
         "SVI_FLAG_COUNT_OVERALL" = "F_TOTAL_10") 

nrow(lihtc_did10_usa_svi)
[1] 3723
Code
lihtc_did10_usa_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
01005950700 Eufaula, AL-GA MicroSA 2 3 0 1 6 0 0 2010
01011952100 NA 2 2 1 1 6 0 0 2010
01015000300 Anniston-Oxford, AL MSA 4 2 1 2 9 0 0 2010
01015000500 Anniston-Oxford, AL MSA 4 2 1 1 8 0 0 2010
01015000600 Anniston-Oxford, AL MSA 4 2 1 4 11 0 0 2010
01015002101 Anniston-Oxford, AL MSA 3 1 0 2 6 0 0 2010
Code
# Create 2020 df, create post variable and set to 1, create year variable and set to 2020
lihtc_did20_usa_svi <- svi_national_lihtc_df %>% 
  select(GEOID_2010_trt, cbsa, F_THEME1_20, F_THEME2_20, F_THEME3_20, F_THEME4_20, F_TOTAL_20, lihtc_flag) %>% 
  mutate(post = 1,
         year = 2020) %>%
  rename("treat" = "lihtc_flag",
         "SVI_FLAG_COUNT_SES" = "F_THEME1_20",
         "SVI_FLAG_COUNT_HHCHAR" = "F_THEME2_20",
         "SVI_FLAG_COUNT_REM" = "F_THEME3_20",
         "SVI_FLAG_COUNT_HOUSETRANSPT" = "F_THEME4_20",
         "SVI_FLAG_COUNT_OVERALL" = "F_TOTAL_20"
  )


nrow(lihtc_did20_usa_svi)
[1] 3723
Code
lihtc_did20_usa_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
01005950700 Eufaula, AL-GA MicroSA 2 3 0 2 7 0 1 2020
01011952100 NA 4 2 1 1 8 0 1 2020
01015000300 Anniston-Oxford, AL MSA 4 2 1 2 9 0 1 2020
01015000500 Anniston-Oxford, AL MSA 4 2 1 1 8 0 1 2020
01015000600 Anniston-Oxford, AL MSA 4 2 1 2 9 0 1 2020
01015002101 Anniston-Oxford, AL MSA 3 1 0 2 6 0 1 2020

Join 2010 and 2020 data into one df

Code
lihtc_diff_in_diff_usa_svi <- bind_rows(lihtc_did10_usa_svi, lihtc_did20_usa_svi)

lihtc_diff_in_diff_usa_svi <- lihtc_diff_in_diff_usa_svi %>% arrange(post, treat, GEOID_2010_trt)

nrow(lihtc_diff_in_diff_usa_svi)
[1] 7446

View top of data frame

Code
lihtc_diff_in_diff_usa_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
01005950700 Eufaula, AL-GA MicroSA 2 3 0 1 6 0 0 2010
01011952100 NA 2 2 1 1 6 0 0 2010
01015000300 Anniston-Oxford, AL MSA 4 2 1 2 9 0 0 2010
01015000500 Anniston-Oxford, AL MSA 4 2 1 1 8 0 0 2010
01015000600 Anniston-Oxford, AL MSA 4 2 1 4 11 0 0 2010
01015002101 Anniston-Oxford, AL MSA 3 1 0 2 6 0 0 2010

View bottom of data frame

Code
lihtc_diff_in_diff_usa_svi %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
55079006500 Milwaukee-Racine-Waukesha, WI CSA 4 3 1 2 10 1 1 2020
55079008400 Milwaukee-Racine-Waukesha, WI CSA 4 3 1 1 9 1 1 2020
55079012200 Milwaukee-Racine-Waukesha, WI CSA 3 3 1 2 9 1 1 2020
55079013400 Milwaukee-Racine-Waukesha, WI CSA 2 2 1 2 7 1 1 2020
55079017000 Milwaukee-Racine-Waukesha, WI CSA 4 3 1 0 8 1 1 2020
56013940100 Riverton, WY MicroSA 3 3 1 2 9 1 1 2020

Economic Outcomes Models Data

Next, we can create a set of data with our variables to measure the economic outcomes of house price index, median home value, and median income:

Create dataset for median income

Code
# Create 2010 df, create post variable and set to 0, create year variable and set to 2010, remove any tracts that don't have data for 2010 and 2019
lihtc_did10_usa_inc <- svi_national_lihtc_df %>% 
  filter(!is.na(Median_Income_10adj_log)) %>% filter(!is.na(Median_Income_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Income_10adj_log, lihtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "lihtc_flag",
         "MEDIAN_INCOME" = "Median_Income_10adj_log") 


nrow(lihtc_did10_usa_inc)
[1] 3717
Code
lihtc_did10_usa_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
01005950700 Eufaula, AL-GA MicroSA 9.781214 0 0 2010
01011952100 NA 10.039531 0 0 2010
01015000300 Anniston-Oxford, AL MSA 9.558513 0 0 2010
01015000500 Anniston-Oxford, AL MSA 9.519347 0 0 2010
01015000600 Anniston-Oxford, AL MSA 9.450245 0 0 2010
01015002101 Anniston-Oxford, AL MSA 8.659193 0 0 2010
Code
# Create 2019 df, create post variable and set to 1, create year variable and set to 2019, remove any tracts that don't have data for 2010 and 2019
lihtc_did19_usa_inc <- svi_national_lihtc_df %>% 
  filter(!is.na(Median_Income_10adj_log)) %>% filter(!is.na(Median_Income_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Income_19_log, lihtc_flag) %>% 
  mutate(post = 1,
         year = 2019) %>%
  rename("treat" = "lihtc_flag",
         "MEDIAN_INCOME" = "Median_Income_19_log") 


nrow(lihtc_did19_usa_inc)
[1] 3717
Code
lihtc_did19_usa_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
01005950700 Eufaula, AL-GA MicroSA 9.755220 0 1 2019
01011952100 NA 9.830809 0 1 2019
01015000300 Anniston-Oxford, AL MSA 9.814602 0 1 2019
01015000500 Anniston-Oxford, AL MSA 9.515690 0 1 2019
01015000600 Anniston-Oxford, AL MSA 9.549381 0 1 2019
01015002101 Anniston-Oxford, AL MSA 9.139059 0 1 2019

Join 2010 and 2019 data into one df for income

Code
lihtc_diff_in_diff_usa_inc <- bind_rows(lihtc_did10_usa_inc, lihtc_did19_usa_inc)

lihtc_diff_in_diff_usa_inc <- lihtc_diff_in_diff_usa_inc %>% arrange(post, treat, GEOID_2010_trt)

nrow(lihtc_diff_in_diff_usa_inc)
[1] 7434

View top of data frame for income

Code
lihtc_diff_in_diff_usa_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
01005950700 Eufaula, AL-GA MicroSA 9.781214 0 0 2010
01011952100 NA 10.039531 0 0 2010
01015000300 Anniston-Oxford, AL MSA 9.558513 0 0 2010
01015000500 Anniston-Oxford, AL MSA 9.519347 0 0 2010
01015000600 Anniston-Oxford, AL MSA 9.450245 0 0 2010
01015002101 Anniston-Oxford, AL MSA 8.659193 0 0 2010

View bottom of data frame income

Code
lihtc_diff_in_diff_usa_inc %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
55079006500 Milwaukee-Racine-Waukesha, WI CSA 9.617604 1 1 2019
55079008400 Milwaukee-Racine-Waukesha, WI CSA 9.482960 1 1 2019
55079012200 Milwaukee-Racine-Waukesha, WI CSA 9.766006 1 1 2019
55079013400 Milwaukee-Racine-Waukesha, WI CSA 9.731334 1 1 2019
55079017000 Milwaukee-Racine-Waukesha, WI CSA 9.928668 1 1 2019
56013940100 Riverton, WY MicroSA 9.870964 1 1 2019

Create dataset for home value

Code
lihtc_did10_usa_mhv <- svi_national_lihtc_df %>% 
  filter(!is.na(Median_Home_Value_10adj_log)) %>% filter(!is.na(Median_Home_Value_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Home_Value_10adj_log, lihtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "lihtc_flag",
         "MEDIAN_HOME_VALUE" = "Median_Home_Value_10adj_log") 


nrow(lihtc_did10_usa_mhv)
[1] 3467
Code
lihtc_did10_usa_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
01005950700 Eufaula, AL-GA MicroSA 11.95177 0 0 2010
01011952100 NA 11.12006 0 0 2010
01015000300 Anniston-Oxford, AL MSA 10.78668 0 0 2010
01015000500 Anniston-Oxford, AL MSA 10.71460 0 0 2010
01015000600 Anniston-Oxford, AL MSA 10.92738 0 0 2010
01015002101 Anniston-Oxford, AL MSA 11.57796 0 0 2010
Code
lihtc_did19_usa_mhv <- svi_national_lihtc_df %>% 
  filter(!is.na(Median_Home_Value_10adj_log)) %>% filter(!is.na(Median_Home_Value_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Home_Value_19_log, lihtc_flag) %>% 
  mutate(post = 1,
         year = 2019) %>%
  rename("treat" = "lihtc_flag",
         "MEDIAN_HOME_VALUE" = "Median_Home_Value_19_log") 


nrow(lihtc_did19_usa_mhv)
[1] 3467
Code
lihtc_did19_usa_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
01005950700 Eufaula, AL-GA MicroSA 11.83138 0 1 2019
01011952100 NA 11.11095 0 1 2019
01015000300 Anniston-Oxford, AL MSA 10.84545 0 1 2019
01015000500 Anniston-Oxford, AL MSA 10.56618 0 1 2019
01015000600 Anniston-Oxford, AL MSA 10.67591 0 1 2019
01015002101 Anniston-Oxford, AL MSA 11.94146 0 1 2019

Join 2010 and 2019 data into one df for home value

Code
lihtc_diff_in_diff_usa_mhv <- bind_rows(lihtc_did10_usa_mhv, lihtc_did19_usa_mhv)

lihtc_diff_in_diff_usa_mhv <- lihtc_diff_in_diff_usa_mhv %>% arrange(post, treat, GEOID_2010_trt)

nrow(lihtc_diff_in_diff_usa_mhv)
[1] 6934

View top of data frame for home value

Code
lihtc_diff_in_diff_usa_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
01005950700 Eufaula, AL-GA MicroSA 11.95177 0 0 2010
01011952100 NA 11.12006 0 0 2010
01015000300 Anniston-Oxford, AL MSA 10.78668 0 0 2010
01015000500 Anniston-Oxford, AL MSA 10.71460 0 0 2010
01015000600 Anniston-Oxford, AL MSA 10.92738 0 0 2010
01015002101 Anniston-Oxford, AL MSA 11.57796 0 0 2010

View bottom of data frame for home value

Code
lihtc_diff_in_diff_usa_mhv %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
55079006500 Milwaukee-Racine-Waukesha, WI CSA 10.67360 1 1 2019
55079008400 Milwaukee-Racine-Waukesha, WI CSA 10.54534 1 1 2019
55079012200 Milwaukee-Racine-Waukesha, WI CSA 11.30958 1 1 2019
55079013400 Milwaukee-Racine-Waukesha, WI CSA 11.26575 1 1 2019
55079017000 Milwaukee-Racine-Waukesha, WI CSA 11.29228 1 1 2019
56013940100 Riverton, WY MicroSA 11.62893 1 1 2019

Create data set for house price index

Code
lihtc_did10_usa_hpi <- svi_national_lihtc_df %>% 
  filter(!is.na(housing_price_index10_log)) %>% filter(!is.na(housing_price_index20_log)) %>%
  select(GEOID_2010_trt, cbsa, housing_price_index10_log, lihtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "lihtc_flag",
         "HOUSE_PRICE_INDEX" = "housing_price_index10_log") 


nrow(lihtc_did10_usa_hpi)
[1] 831
Code
lihtc_did10_usa_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
01005950700 Eufaula, AL-GA MicroSA 4.875579 0 0 2010
01015002300 Anniston-Oxford, AL MSA 4.791982 0 0 2010
01031010500 Dothan-Enterprise-Ozark, AL CSA 4.858882 0 0 2010
01031011000 Dothan-Enterprise-Ozark, AL CSA 4.944567 0 0 2010
01069041500 Dothan-Enterprise-Ozark, AL CSA 4.820201 0 0 2010
01077010200 Florence-Muscle Shoals, AL MSA 4.855851 0 0 2010
Code
lihtc_did20_usa_hpi <- svi_national_lihtc_df %>% 
  filter(!is.na(housing_price_index10_log)) %>% filter(!is.na(housing_price_index20_log)) %>%
  select(GEOID_2010_trt, cbsa, housing_price_index20_log, lihtc_flag) %>% 
  mutate(post = 1,
         year = 2020) %>%
  rename("treat" = "lihtc_flag",
         "HOUSE_PRICE_INDEX" = "housing_price_index20_log") 


nrow(lihtc_did20_usa_hpi)
[1] 831
Code
lihtc_did20_usa_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
01005950700 Eufaula, AL-GA MicroSA 4.909783 0 1 2020
01015002300 Anniston-Oxford, AL MSA 4.881437 0 1 2020
01031010500 Dothan-Enterprise-Ozark, AL CSA 4.921877 0 1 2020
01031011000 Dothan-Enterprise-Ozark, AL CSA 5.022696 0 1 2020
01069041500 Dothan-Enterprise-Ozark, AL CSA 4.901490 0 1 2020
01077010200 Florence-Muscle Shoals, AL MSA 5.037147 0 1 2020

Join 2010 and 2019 data into one df for house price index

Code
lihtc_diff_in_diff_usa_hpi <- bind_rows(lihtc_did10_usa_hpi, lihtc_did20_usa_hpi)

lihtc_diff_in_diff_usa_hpi <- lihtc_diff_in_diff_usa_hpi %>% arrange(post, treat, GEOID_2010_trt)

nrow(lihtc_diff_in_diff_usa_hpi)
[1] 1662

View top of data frame for house price index

Code
lihtc_diff_in_diff_usa_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
01005950700 Eufaula, AL-GA MicroSA 4.875579 0 0 2010
01015002300 Anniston-Oxford, AL MSA 4.791982 0 0 2010
01031010500 Dothan-Enterprise-Ozark, AL CSA 4.858882 0 0 2010
01031011000 Dothan-Enterprise-Ozark, AL CSA 4.944567 0 0 2010
01069041500 Dothan-Enterprise-Ozark, AL CSA 4.820201 0 0 2010
01077010200 Florence-Muscle Shoals, AL MSA 4.855851 0 0 2010

View bottom of data frame for house price index

Code
lihtc_diff_in_diff_usa_hpi %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
53037975500 Ellensburg, WA MicroSA 5.743163 1 1 2020
53041970900 Centralia, WA MicroSA 5.605912 1 1 2020
54097966800 NA 4.975561 1 1 2020
55025001200 Madison-Baraboo, WI CSA 6.432554 1 1 2020
55035001200 Eau Claire-Menomonie, WI CSA 5.901485 1 1 2020
55079001800 Milwaukee-Racine-Waukesha, WI CSA 5.077546 1 1 2020

LIHTC National Model

Now that we have our datasets created, we can craft our models. Remember that in R we can use the lm() function for linear models. We can then format the output of models using packages like modelsummary to create easy-to-read output tables (note: unlike stargazer and the base lm() output, your regression models will not print directly in your .RMD file, you will need to view the output in the ‘viewer’ window in RStudio):

Code
# SVI & Economic Models

m1_lihtc_usa <- lm( SVI_FLAG_COUNT_SES ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_usa_svi )

m2_lihtc_usa <- lm( SVI_FLAG_COUNT_HHCHAR ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_usa_svi )

m3_lihtc_usa <- lm( SVI_FLAG_COUNT_REM ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_usa_svi )

m4_lihtc_usa <- lm( SVI_FLAG_COUNT_HOUSETRANSPT ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_usa_svi )

m5_lihtc_usa <- lm( SVI_FLAG_COUNT_OVERALL  ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_usa_svi)

m6_lihtc_usa <- lm( MEDIAN_INCOME ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_usa_inc )

m7_lihtc_usa <- lm( MEDIAN_HOME_VALUE ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_usa_mhv )

m8_lihtc_usa <- lm( HOUSE_PRICE_INDEX ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_usa_hpi )

# Add all models to a list
models <- list(
  
  "SES" = m1_lihtc_usa,
  "HHChar"  = m2_lihtc_usa,
  "REM" = m3_lihtc_usa,
  "HOUSETRANSPT" = m4_lihtc_usa,
  "OVERALL" = m5_lihtc_usa,
  "Median Income (USD, logged)" = m6_lihtc_usa,
  "Median Home Value (USD, logged)" = m7_lihtc_usa,
  "House Price Index (logged)" = m8_lihtc_usa
)


# Display model results
modelsummary(models,  fmt = 2, stars = c('*' = .05, '**' = .01, '***' = .001), coef_omit = "cbsa", gof_omit = "IC|Log",
             notes = list('All models include metro-level fixed effects by core-based statistical area (cbsa).'),
             title = paste0("Differences-in-Differences Linear Regression Analysis of LIHTC in ", "United States")) %>%
  group_tt(j = list("Social Vulnerability" = 2:6, "Economic Outcomes" = 7:9))
Social Vulnerability Economic Outcomes
Differences-in-Differences Linear Regression Analysis of LIHTC in United States
SES HHChar REM HOUSETRANSPT OVERALL Median Income (USD, logged) Median Home Value (USD, logged) House Price Index (logged)
* p < 0.05, ** p < 0.01, *** p < 0.001
All models include metro-level fixed effects by core-based statistical area (cbsa).
(Intercept) 3.06*** 3.44*** -0.02 3.83*** 10.31*** 9.83*** 11.69*** 4.94***
(0.81) (0.69) (0.26) (0.63) (1.53) (0.25) (0.35) (0.27)
treat 0.06 0.16*** 0.05** 0.20*** 0.47*** 0.02 0.02 -0.04
(0.06) (0.05) (0.02) (0.04) (0.11) (0.02) (0.03) (0.04)
post -0.21*** -0.16*** -0.03** -0.06** -0.45*** 0.06*** -0.12*** 0.52***
(0.03) (0.03) (0.01) (0.02) (0.06) (0.01) (0.01) (0.02)
treat × post -0.02 -0.04 -0.03 0.00 -0.10 0.02 0.06 0.04
(0.08) (0.07) (0.03) (0.06) (0.15) (0.02) (0.03) (0.05)
Num.Obs. 7126 7126 7126 7126 7126 7118 6618 1638
R2 0.209 0.235 0.368 0.197 0.272 0.275 0.692 0.494
R2 Adj. 0.167 0.195 0.335 0.155 0.234 0.237 0.674 0.431
F 5.037 5.848 11.107 4.677 7.129 7.219 39.908 7.894
RMSE 1.11 0.95 0.36 0.87 2.11 0.34 0.48 0.36

Interpret National SVI & Economic Models

Once again, we first want to note that all of our models include metro-level fixed effect controls by cbsa (Core-Based Statistical Area) to allow the model to consider relative variation with metro areas and equitably make comparisons.

Next, we want to look at the treat x post variable to determine if our program had a statistically significant impact. If this variable is statistically significant, than we can deem that tracts that received program dollars performed significantly differently than would be expected according to general trends.

In the case of the LIHTC program we can see that there are not statistically significant changes in social vulnerability or economic outcomes on a national basis.

Thus, although we cannot conclude that the program had a measurable impact on our SVI and economic outcomes, we can conclude that our tracts that received LIHTC dollars were statistically more vulnerable based on Household Characteristics, Racial and Ethnic diversity, Housing and Transportation, and Overall Social Vulnerability.

Since the LIHTC program focuses on increasing availability of housing for low income individuals in a variety of communities, it is possible that it is effective at accomplishing this goal. However, we would need to conduct further research and examine different variables to explore this further.

Visualize National Models

Since we do not have any statistically significant results, we do not have changes to visualize.

NMTC Divisional

Create Divisional Models

Now we can repeat our analysis and zone in on our division-specific data:

Again, we can create datasets with our SVI variables for socioeconomic status, household characteristics, racial and ethnic minorities, and housing and transportation issues:

SVI Model Data

Code
# Create 2010 df, create post variable and set to 0, create year variable and set to 2010
nmtc_did10_div_svi <- svi_divisional_nmtc_df %>% 
  select(GEOID_2010_trt, cbsa, F_THEME1_10, F_THEME2_10, F_THEME3_10, F_THEME4_10, F_TOTAL_10, nmtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "nmtc_flag",
         "SVI_FLAG_COUNT_SES" = "F_THEME1_10",
         "SVI_FLAG_COUNT_HHCHAR" = "F_THEME2_10",
         "SVI_FLAG_COUNT_REM" = "F_THEME3_10",
         "SVI_FLAG_COUNT_HOUSETRANSPT" = "F_THEME4_10",
         "SVI_FLAG_COUNT_OVERALL" = "F_TOTAL_10") 

nrow(nmtc_did10_div_svi)
[1] 3704
Code
nmtc_did10_div_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
34001000100 Atlantic City, NJ MSA 5 3 1 1 10 0 0 2010
34001000200 Atlantic City, NJ MSA 1 3 0 1 5 0 0 2010
34001000300 Atlantic City, NJ MSA 5 1 1 3 10 0 0 2010
34001000500 Atlantic City, NJ MSA 4 3 1 2 10 0 0 2010
34001001100 Atlantic City, NJ MSA 4 2 1 2 9 0 0 2010
34001001300 Atlantic City, NJ MSA 4 1 1 0 6 0 0 2010
Code
# Create 2020 df, create post variable and set to 1, create year variable and set to 2020
nmtc_did20_div_svi <- svi_divisional_nmtc_df %>% 
  select(GEOID_2010_trt, cbsa, F_THEME1_20, F_THEME2_20, F_THEME3_20, F_THEME4_20, F_TOTAL_20, nmtc_flag) %>% 
  mutate(post = 1,
         year = 2020) %>%
  rename("treat" = "nmtc_flag",
         "SVI_FLAG_COUNT_SES" = "F_THEME1_20",
         "SVI_FLAG_COUNT_HHCHAR" = "F_THEME2_20",
         "SVI_FLAG_COUNT_REM" = "F_THEME3_20",
         "SVI_FLAG_COUNT_HOUSETRANSPT" = "F_THEME4_20",
         "SVI_FLAG_COUNT_OVERALL" = "F_TOTAL_20"
  )


nrow(nmtc_did20_div_svi)
[1] 3704
Code
nmtc_did20_div_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
34001000100 Atlantic City, NJ MSA 5 2 1 2 10 0 1 2020
34001000200 Atlantic City, NJ MSA 4 3 1 2 10 0 1 2020
34001000300 Atlantic City, NJ MSA 5 3 1 2 11 0 1 2020
34001000500 Atlantic City, NJ MSA 4 2 1 2 9 0 1 2020
34001001100 Atlantic City, NJ MSA 4 2 1 2 9 0 1 2020
34001001300 Atlantic City, NJ MSA 3 2 1 3 9 0 1 2020

Join 2010 and 2020 data into one df

Code
nmtc_diff_in_diff_div_svi <- bind_rows(nmtc_did10_div_svi, nmtc_did20_div_svi)

nmtc_diff_in_diff_div_svi <- nmtc_diff_in_diff_div_svi %>% arrange(post, treat, GEOID_2010_trt)

nrow(nmtc_diff_in_diff_div_svi)
[1] 7408

View top of data frame

Code
nmtc_diff_in_diff_div_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
34001000100 Atlantic City, NJ MSA 5 3 1 1 10 0 0 2010
34001000200 Atlantic City, NJ MSA 1 3 0 1 5 0 0 2010
34001000300 Atlantic City, NJ MSA 5 1 1 3 10 0 0 2010
34001000500 Atlantic City, NJ MSA 4 3 1 2 10 0 0 2010
34001001100 Atlantic City, NJ MSA 4 2 1 2 9 0 0 2010
34001001300 Atlantic City, NJ MSA 4 1 1 0 6 0 0 2010

View bottom of data frame

Code
nmtc_diff_in_diff_div_svi %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
42101038200 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 2 4 0 2 8 1 1 2020
42101038900 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 3 2 1 2 8 1 1 2020
42125704100 Pittsburgh-New Castle, PA CSA 3 1 0 2 6 1 1 2020
42129800700 Pittsburgh-New Castle, PA CSA 2 2 0 2 6 1 1 2020
42133000100 York-Hanover-Gettysburg, PA CSA 5 2 0 2 9 1 1 2020
42133001600 York-Hanover-Gettysburg, PA CSA 5 3 0 3 11 1 1 2020

Economic Outcomes Models Data

Next, we can create a set of data with our variables to measure the economic outcomes of house price index, median home value, and median income:

Create dataset for median income

Code
# Create 2010 df, create post variable and set to 0, create year variable and set to 2010, remove any tracts that don't have data for 2010 and 2019
nmtc_did10_div_inc <- svi_divisional_nmtc_df %>% 
  filter(!is.na(Median_Income_10adj_log)) %>% filter(!is.na(Median_Income_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Income_10adj_log, nmtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "nmtc_flag",
         "MEDIAN_INCOME" = "Median_Income_10adj_log") 


nrow(nmtc_did10_div_inc)
[1] 3703
Code
nmtc_did10_div_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
34001000100 Atlantic City, NJ MSA 10.227582 0 0 2010
34001000200 Atlantic City, NJ MSA 10.342186 0 0 2010
34001000300 Atlantic City, NJ MSA 10.102838 0 0 2010
34001000500 Atlantic City, NJ MSA 9.906130 0 0 2010
34001001100 Atlantic City, NJ MSA 9.829264 0 0 2010
34001001300 Atlantic City, NJ MSA 10.535691 0 0 2010
Code
# Create 2019 df, create post variable and set to 1, create year variable and set to 2019, remove any tracts that don't have data for 2010 and 2019
nmtc_did19_div_inc <- svi_divisional_nmtc_df %>% 
  filter(!is.na(Median_Income_10adj_log)) %>% filter(!is.na(Median_Income_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Income_19_log, nmtc_flag) %>% 
  mutate(post = 1,
         year = 2019) %>%
  rename("treat" = "nmtc_flag",
         "MEDIAN_INCOME" = "Median_Income_19_log") 


nrow(nmtc_did19_div_inc)
[1] 3703
Code
nmtc_did19_div_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
34001000100 Atlantic City, NJ MSA 9.874316 0 1 2019
34001000200 Atlantic City, NJ MSA 10.155374 0 1 2019
34001000300 Atlantic City, NJ MSA 9.874059 0 1 2019
34001000500 Atlantic City, NJ MSA 9.985067 0 1 2019
34001001100 Atlantic City, NJ MSA 9.642253 0 1 2019
34001001300 Atlantic City, NJ MSA 10.076306 0 1 2019

Join 2010 and 2019 data into one df for income

Code
nmtc_diff_in_diff_div_inc <- bind_rows(nmtc_did10_div_inc, nmtc_did19_div_inc)

nmtc_diff_in_diff_div_inc <- nmtc_diff_in_diff_div_inc %>% arrange(post, treat, GEOID_2010_trt)

nrow(nmtc_diff_in_diff_div_inc)
[1] 7406

View top of data frame for income

Code
nmtc_diff_in_diff_div_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
34001000100 Atlantic City, NJ MSA 10.227582 0 0 2010
34001000200 Atlantic City, NJ MSA 10.342186 0 0 2010
34001000300 Atlantic City, NJ MSA 10.102838 0 0 2010
34001000500 Atlantic City, NJ MSA 9.906130 0 0 2010
34001001100 Atlantic City, NJ MSA 9.829264 0 0 2010
34001001300 Atlantic City, NJ MSA 10.535691 0 0 2010

View bottom of data frame income

Code
nmtc_diff_in_diff_div_inc %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
42101038200 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 9.772866 1 1 2019
42101038900 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 9.836065 1 1 2019
42125704100 Pittsburgh-New Castle, PA CSA 9.102866 1 1 2019
42129800700 Pittsburgh-New Castle, PA CSA 9.652523 1 1 2019
42133000100 York-Hanover-Gettysburg, PA CSA 9.886290 1 1 2019
42133001600 York-Hanover-Gettysburg, PA CSA 9.747185 1 1 2019

Create dataset for home value

Code
nmtc_did10_div_mhv <- svi_divisional_nmtc_df %>% 
  filter(!is.na(Median_Home_Value_10adj_log)) %>% filter(!is.na(Median_Home_Value_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Home_Value_10adj_log, nmtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "nmtc_flag",
         "MEDIAN_HOME_VALUE" = "Median_Home_Value_10adj_log") 


nrow(nmtc_did10_div_mhv)
[1] 3479
Code
nmtc_did10_div_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
34001000100 Atlantic City, NJ MSA 12.48464 0 0 2010
34001000200 Atlantic City, NJ MSA 12.82575 0 0 2010
34001000300 Atlantic City, NJ MSA 12.57963 0 0 2010
34001000500 Atlantic City, NJ MSA 12.33938 0 0 2010
34001001100 Atlantic City, NJ MSA 12.53054 0 0 2010
34001001300 Atlantic City, NJ MSA 12.51021 0 0 2010
Code
nmtc_did19_div_mhv <- svi_divisional_nmtc_df %>% 
  filter(!is.na(Median_Home_Value_10adj_log)) %>% filter(!is.na(Median_Home_Value_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Home_Value_19_log, nmtc_flag) %>% 
  mutate(post = 1,
         year = 2019) %>%
  rename("treat" = "nmtc_flag",
         "MEDIAN_HOME_VALUE" = "Median_Home_Value_19_log") 


nrow(nmtc_did19_div_mhv)
[1] 3479
Code
nmtc_did19_div_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
34001000100 Atlantic City, NJ MSA 11.95504 0 1 2019
34001000200 Atlantic City, NJ MSA 12.14367 0 1 2019
34001000300 Atlantic City, NJ MSA 11.90023 0 1 2019
34001000500 Atlantic City, NJ MSA 11.78904 0 1 2019
34001001100 Atlantic City, NJ MSA 11.99843 0 1 2019
34001001300 Atlantic City, NJ MSA 11.99720 0 1 2019

Join 2010 and 2019 data into one df for home value

Code
nmtc_diff_in_diff_div_mhv <- bind_rows(nmtc_did10_div_mhv, nmtc_did19_div_mhv)

nmtc_diff_in_diff_div_mhv <- nmtc_diff_in_diff_div_mhv %>% arrange(post, treat, GEOID_2010_trt)

nrow(nmtc_diff_in_diff_div_mhv)
[1] 6958

View top of data frame for home value

Code
nmtc_diff_in_diff_div_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
34001000100 Atlantic City, NJ MSA 12.48464 0 0 2010
34001000200 Atlantic City, NJ MSA 12.82575 0 0 2010
34001000300 Atlantic City, NJ MSA 12.57963 0 0 2010
34001000500 Atlantic City, NJ MSA 12.33938 0 0 2010
34001001100 Atlantic City, NJ MSA 12.53054 0 0 2010
34001001300 Atlantic City, NJ MSA 12.51021 0 0 2010

View bottom of data frame for home value

Code
nmtc_diff_in_diff_div_mhv %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
42101037700 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 11.76602 1 1 2019
42101038200 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 11.52288 1 1 2019
42101038900 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 12.24289 1 1 2019
42129800700 Pittsburgh-New Castle, PA CSA 10.79753 1 1 2019
42133000100 York-Hanover-Gettysburg, PA CSA 11.72400 1 1 2019
42133001600 York-Hanover-Gettysburg, PA CSA 10.89303 1 1 2019

Create data set for house price index

Code
nmtc_did10_div_hpi <- svi_divisional_nmtc_df %>% 
  filter(!is.na(housing_price_index10_log)) %>% filter(!is.na(housing_price_index20_log)) %>%
  select(GEOID_2010_trt, cbsa, housing_price_index10_log, nmtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "nmtc_flag",
         "HOUSE_PRICE_INDEX" = "housing_price_index10_log") 


nrow(nmtc_did10_div_hpi)
[1] 1026
Code
nmtc_did10_div_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
34001000100 Atlantic City, NJ MSA 4.939712 0 0 2010
34001000200 Atlantic City, NJ MSA 5.215262 0 0 2010
34001001300 Atlantic City, NJ MSA 4.197503 0 0 2010
34001002500 Atlantic City, NJ MSA 4.829513 0 0 2010
34001010104 Atlantic City, NJ MSA 5.626829 0 0 2010
34001010300 Atlantic City, NJ MSA 5.203787 0 0 2010
Code
nmtc_did20_div_hpi <- svi_divisional_nmtc_df %>% 
  filter(!is.na(housing_price_index10_log)) %>% filter(!is.na(housing_price_index20_log)) %>%
  select(GEOID_2010_trt, cbsa, housing_price_index20_log, nmtc_flag) %>% 
  mutate(post = 1,
         year = 2020) %>%
  rename("treat" = "nmtc_flag",
         "HOUSE_PRICE_INDEX" = "housing_price_index20_log") 


nrow(nmtc_did20_div_hpi)
[1] 1026
Code
nmtc_did20_div_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
34001000100 Atlantic City, NJ MSA 4.710521 0 1 2020
34001000200 Atlantic City, NJ MSA 5.110239 0 1 2020
34001001300 Atlantic City, NJ MSA 3.804660 0 1 2020
34001002500 Atlantic City, NJ MSA 4.586089 0 1 2020
34001010104 Atlantic City, NJ MSA 5.727662 0 1 2020
34001010300 Atlantic City, NJ MSA 5.174284 0 1 2020

Join 2010 and 2019 data into one df for house price index

Code
nmtc_diff_in_diff_div_hpi <- bind_rows(nmtc_did10_div_hpi, nmtc_did20_div_hpi)

nmtc_diff_in_diff_div_hpi <- nmtc_diff_in_diff_div_hpi %>% arrange(post, treat, GEOID_2010_trt)

nrow(nmtc_diff_in_diff_div_hpi)
[1] 2052

View top of data frame for house price index

Code
nmtc_diff_in_diff_div_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
34001000100 Atlantic City, NJ MSA 4.939712 0 0 2010
34001000200 Atlantic City, NJ MSA 5.215262 0 0 2010
34001001300 Atlantic City, NJ MSA 4.197503 0 0 2010
34001002500 Atlantic City, NJ MSA 4.829513 0 0 2010
34001010104 Atlantic City, NJ MSA 5.626829 0 0 2010
34001010300 Atlantic City, NJ MSA 5.203787 0 0 2010

View bottom of data frame for house price index

Code
nmtc_diff_in_diff_div_hpi %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
42101024200 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 5.917037 1 1 2020
42101029800 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 5.482803 1 1 2020
42101031102 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 5.848402 1 1 2020
42101033500 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 5.860644 1 1 2020
42101034900 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 5.804743 1 1 2020
42101038900 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 5.190565 1 1 2020

NMTC Divisional Model

Code
# SVI & Economic Models

m1_nmtc_div <- lm( SVI_FLAG_COUNT_SES ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_div_svi )

m2_nmtc_div <- lm( SVI_FLAG_COUNT_HHCHAR ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_div_svi )

m3_nmtc_div <- lm( SVI_FLAG_COUNT_REM ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_div_svi )

m4_nmtc_div <- lm( SVI_FLAG_COUNT_HOUSETRANSPT ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_div_svi )

m5_nmtc_div <- lm( SVI_FLAG_COUNT_OVERALL  ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_div_svi)

m6_nmtc_div <- lm( MEDIAN_INCOME ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_div_inc )

m7_nmtc_div <- lm( MEDIAN_HOME_VALUE ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_div_mhv )

m8_nmtc_div <- lm( HOUSE_PRICE_INDEX ~ treat + post + treat*post + cbsa, data=nmtc_diff_in_diff_div_hpi )

# Add all models to a list
models <- list(
  
  "SES" = m1_nmtc_div,
  "HHChar"  = m2_nmtc_div,
  "REM" = m3_nmtc_div,
  "HOUSETRANSPT" = m4_nmtc_div,
  "OVERALL" = m5_nmtc_div,
  "Median Income (USD, logged)" = m6_nmtc_div,
  "Median Home Value (USD, logged)" = m7_nmtc_div,
  "House Price Index (logged)" = m8_nmtc_div
)


# Display model results
modelsummary(models,  fmt = 2, stars = c('*' = .05, '**' = .01, '***' = .001), coef_omit = "cbsa", gof_omit = "IC|Log",
             notes = list('All models include metro-level fixed effects by core-based statistical area (cbsa).'),
             title = paste0("Differences-in-Differences Linear Regression Analysis of NMTC in ", census_division)) %>%
  group_tt(j = list("Social Vulnerability" = 2:6, "Economic Outcomes" = 7:9))
Social Vulnerability Economic Outcomes
Differences-in-Differences Linear Regression Analysis of NMTC in Middle Atlantic Division
SES HHChar REM HOUSETRANSPT OVERALL Median Income (USD, logged) Median Home Value (USD, logged) House Price Index (logged)
* p < 0.05, ** p < 0.01, *** p < 0.001
All models include metro-level fixed effects by core-based statistical area (cbsa).
(Intercept) 1.59*** 1.62*** 0.08* 1.16*** 4.44*** 10.12*** 11.79*** 4.90***
(0.11) (0.08) (0.03) (0.07) (0.21) (0.02) (0.03) (0.04)
treat 0.94*** 0.45*** 0.21*** 0.59*** 2.18*** -0.19*** -0.14*** 0.03
(0.11) (0.08) (0.03) (0.08) (0.22) (0.03) (0.04) (0.07)
post -0.04 -0.04 0.00 0.02 -0.06 0.03*** -0.07*** 0.24***
(0.03) (0.03) (0.01) (0.02) (0.07) (0.01) (0.01) (0.01)
treat × post -0.42** -0.06 -0.05 -0.03 -0.56 0.06 0.11* 0.05
(0.16) (0.12) (0.05) (0.11) (0.31) (0.04) (0.05) (0.09)
Num.Obs. 7238 7238 7238 7238 7238 7236 6788 2020
R2 0.184 0.060 0.342 0.313 0.269 0.088 0.729 0.317
R2 Adj. 0.178 0.053 0.337 0.308 0.263 0.081 0.727 0.302
F 32.365 9.164 74.720 65.385 52.773 13.829 362.449 20.396
RMSE 1.40 1.07 0.41 0.98 2.80 0.33 0.46 0.32

Interpret Divisional SVI & Economic Models

Just like with our national models, note that all of our divisional models include metro-level fixed effect controls by cbsa (Core-Based Statistical Area) to allow the model to consider relative variation with metro areas and equitably make comparisons.

Next, we want to look at the treat x post variable to determine if our program had a statistically significant impact. If this variable is statistically significant, than we can deem that tracts that received program dollars performed significantly differently than would be expected according to general trends.

Across our SVI flag models for the Middle Atlantic Division, the category that experienced statistically significant changes based on NMTC program enrollment on a divisional basis is Socioeconomic Status.

The Socioeconomic Status category consists of measures of poverty, unemployment, housing burdens, educational levels, and lack of health insurance. Thus, the NMTC’s goal of effecting changes in SES vulnerability appears to be working in the Middle Atlantic Division.

Looking at the SES model:

  • We find that our average SES Flag Count across census tracts eligible for the NMTC program was 1.59 (intercept) flags in 2010. In 2020 this decreased to 1.55 (intercept + post) flags.

  • For tracts that received tax credits from the NMTC program, the average SES flag count was 2.53 (intercept + treat) flags in 2010. In 2020, this decreased to 2.07 (intercept + treat + post + treat*post) flags.

  • Although 2.07 flags in 2020 for tracts in the NMTC program is greater than the average of 1.55 flags in non-treated tracts, the decrease in flag count was greater for tracts enrolled in the NMTC program as indicated by the treat*post coefficient. The counterfactual for NMTC-treated tracts was 2.49 flags (intercept + treat + post).

Finally, we can examine our indicators of Economic Conditions and determine that changes in Median Home Value were statistically significantly greater in tracts that received NMTC dollars versus those that did not:

  • Specifically looking at the treat x post coefficient, recall that our economic values are logged so we can read this as an increase of 11% (.11*100) for each 1-unit increase. However, if we want to find the exact numeric calculations of this change, we can utilize the exp() function to complete our calculations:
Code
# Non-Treatment 2010 (Intercept), Avg Median Home Value $131,767.2 
exp(m7_nmtc_div$coefficients[1]) 
(Intercept) 
   131767.2 
Code
# Non-Treatment 2020 (Intercept * post), Avg Median Home Value $123,150.8  
exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[3])
(Intercept) 
   123150.8 
Code
print( paste0("Pct change 2010-2020, non-treated: ", ((123150.8 - 131767.2)/131767.2)*100 ))
[1] "Pct change 2010-2020, non-treated: -6.53910836687735"
Code
# Treatment 2010 (Intercept * treat), Avg Median Home Value $114,941.7 
exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[2])
(Intercept) 
   114941.7 
Code
# Treatment 2020 (Intercept * treat * post * treat x post), Avg Median Home Value $120,052.5 
exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[2])*exp(m7_nmtc_div$coefficients[3])*exp(m7_nmtc_div$coefficients[length(m7_nmtc_div$coefficients)])
(Intercept) 
   120052.5 
Code
print( paste0("Pct change 2010-2020, treated: ", ((120052.5 - 114941.7)/114941.7)*100))
[1] "Pct change 2010-2020, treated: 4.44642805874631"
Code
# Treatment 2010 (Intercept * treat), Avg Median Home Value $114,941.7 
exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[2])
(Intercept) 
   114941.7 
Code
# Treatment 2020 Counter-Factual (Intercept * treat * post), Avg Median Home Value $107,425.6 
exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[2])*exp(m7_nmtc_div$coefficients[3])
(Intercept) 
   107425.6 
Code
print( paste0("Pct change 2010-2020, treated counterfactual: ", ((107425.6 - 114941.7)/114941.7)*100))
[1] "Pct change 2010-2020, treated counterfactual: -6.53905414658039"

Thus, looking at our calculations here, we can conclude that when we control for metro-level effects, our average Median Home Value for tracts that did not receive NMTC dollars was $131,767.20 in 2010 when adjusted for inflation. This decreased to $123,150.8 in 2020, a -6.54% decrease in home values according to US Census data.

When we control for metro-level effects, our NMTC treated tracts had an average Median Home Value of $114,941.70 in 2010. The average Median Income in these tracts increased to $120,052.50 in 2020. This is an ~11% increase over what we would have expected according to general trends.

As a counterfactual, we can see that we would have expected the average Median Home Value of $107,425.60 in 2020 if it had decreased by -6.5%.

Further, we can look at the percentage increases for our coefficients to confirm our calculations are correct:

Code
# -6.5% decrease in post
(exp(m7_nmtc_div$coefficients[3]) - 1)*100
     post 
-6.539073 
Code
# 11.75% Additional increase in treat x post
(exp(m7_nmtc_div$coefficients[length(m7_nmtc_div$coefficients)]) - 1)*100
treat:post 
  11.75411 
Code
# Combined increase
(exp(m7_nmtc_div$coefficients[3]) - 1)*100 + (exp(m7_nmtc_div$coefficients[length(m7_nmtc_div$coefficients)]) - 1)*100
    post 
5.215034 

Visualize Divisional Models

We can visualize these changes with slopegraphs. To begin, let’s look at the coefficients of our three significant models:

Code
# Recall:
# M1 is SES
# Intercept = intercept, the average count in 2010
# Treat = Impact of being in the NMTC program
# Post = Impact of year being 2020
# Treat:Post = Impact of treatment program and year being 2020
m1_nmtc_div$coefficients[1:3]
(Intercept)       treat        post 
 1.58555582  0.93817136 -0.04350348 
Code
m1_nmtc_div$coefficients[length(m1_nmtc_div$coefficients)]
treat:post 
-0.4243328 
Code
# Recall:
# M7 is the logged Median Home Value, thus we need to pull the exponents
# Intercept = intercept, the average count in 2010
# Treat = Impact of being in the NMTC program
# Post = Impact of year being 2020
# Treat:Post = Impact of treatment program and year being 2020
exp(m7_nmtc_div$coefficients[1:3])
   (Intercept)          treat           post 
131767.1512927      0.8723093      0.9346093 
Code
exp(m7_nmtc_div$coefficients[length(m7_nmtc_div$coefficients)])
treat:post 
  1.117541 

Create visualization data frame and plot

SES

Code
status <- c("NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant", 
             "NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant")
year <- c(2010, 
          2010, 
          2010, 
          2020, 
          2020, 
          2020)
outcome <- c(m1_nmtc_div$coefficients[1], 
           m1_nmtc_div$coefficients[1] + m1_nmtc_div$coefficients[2], 
           m1_nmtc_div$coefficients[1] + m1_nmtc_div$coefficients[2],
           m1_nmtc_div$coefficients[1] + m1_nmtc_div$coefficients[3], 
           m1_nmtc_div$coefficients[1] + m1_nmtc_div$coefficients[2] + m1_nmtc_div$coefficients[3],
           m1_nmtc_div$coefficients[1] + m1_nmtc_div$coefficients[2] + m1_nmtc_div$coefficients[3] + m1_nmtc_div$coefficients[length(m1_nmtc_div$coefficients)])

svidiv_viz_ses_nmtc <- data.frame(status, year, outcome)
svidiv_viz_ses_nmtc$outcome_label <- round(svidiv_viz_ses_nmtc$outcome, 2)
svidiv_viz_ses_nmtc
                           status year  outcome outcome_label
1            NMTC Non-Participant 2010 1.585556          1.59
2 NMTC Participant Counterfactual 2010 2.523727          2.52
3                NMTC Participant 2010 2.523727          2.52
4            NMTC Non-Participant 2020 1.542052          1.54
5 NMTC Participant Counterfactual 2020 2.480224          2.48
6                NMTC Participant 2020 2.055891          2.06
Code
slopegraph_plot(svidiv_viz_ses_nmtc, "NMTC Participant", "NMTC Non-Participant","Impact of NMTC Program on SVI SES Flag Count", paste0(census_division, " | 2010 - 2020"))

The slopegraph for SES SVI flags for the NMTC program indicates that in the Middle Atlantic Division our NMTC Participant Tracts had a notable decrease in socioeconomic social vulnerability flags in 2020 from the expected count of 2.48 for the counterfactual to 2.06 for the actual outcome.

Median Home Value

Code
status <- c("NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant", 
             "NMTC Non-Participant", 
             "NMTC Participant Counterfactual", 
             "NMTC Participant")
year <- c(2010, 
          2010, 
          2010, 
          2020, 
          2020, 
          2020)
outcome <- c(exp(m7_nmtc_div$coefficients[1]), 
           exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[2]), 
           exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[2]),
           exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[3]), 
           exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[2])*exp(m7_nmtc_div$coefficients[3]),
           exp(m7_nmtc_div$coefficients[1])*exp(m7_nmtc_div$coefficients[2])*exp(m7_nmtc_div$coefficients[3])*exp(m7_nmtc_div$coefficients[length(m7_nmtc_div$coefficients)])
)

svidiv_viz_medhmv_nmtc <- data.frame(status, year, outcome)

### Note that instead of rounding like we did for SVI variables, we will be formatting our outcome as US dollars
svidiv_viz_medhmv_nmtc$outcome_label <- scales::dollar_format()(svidiv_viz_medhmv_nmtc$outcome)

svidiv_viz_medhmv_nmtc
                           status year  outcome outcome_label
1            NMTC Non-Participant 2010 131767.2      $131,767
2 NMTC Participant Counterfactual 2010 114941.7      $114,942
3                NMTC Participant 2010 114941.7      $114,942
4            NMTC Non-Participant 2020 123150.8      $123,151
5 NMTC Participant Counterfactual 2020 107425.6      $107,426
6                NMTC Participant 2020 120052.5      $120,053
Code
slopegraph_plot(svidiv_viz_medhmv_nmtc, "NMTC Participant", "NMTC Non-Participant", "Impact of NMTC Program on Average Median Home Value", paste0(census_division, " | 2010 - 2020"))

The slopegraph for Average Home Value for the NMTC program indicates that in the Middle Atlantic Division our NMTC Participant Tracts had a notable increase in 2020 from the expected home value of $107,426 for the counterfactual to $120,053 for the actual outcome. This increase is also in contrast to the general trend of decreasing average median home values within NMTC-eligible tracts in the division from 2010 to 2020.

LIHTC Divisional

Create Divisional Models

Create datasets with our SVI variables for socioeconomic status, household characteristics, racial and ethnic minorities, and housing and transportation issues:

SVI Model Data

Code
# Create 2010 df, create post variable and set to 0, create year variable and set to 2010
lihtc_did10_div_svi <- svi_divisional_lihtc_df %>% 
  select(GEOID_2010_trt, cbsa, F_THEME1_10, F_THEME2_10, F_THEME3_10, F_THEME4_10, F_TOTAL_10, lihtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "lihtc_flag",
         "SVI_FLAG_COUNT_SES" = "F_THEME1_10",
         "SVI_FLAG_COUNT_HHCHAR" = "F_THEME2_10",
         "SVI_FLAG_COUNT_REM" = "F_THEME3_10",
         "SVI_FLAG_COUNT_HOUSETRANSPT" = "F_THEME4_10",
         "SVI_FLAG_COUNT_OVERALL" = "F_TOTAL_10") 

nrow(lihtc_did10_div_svi)
[1] 658
Code
lihtc_did10_div_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
34001001400 Atlantic City, NJ MSA 4 2 1 2 9 0 0 2010
34001001500 Atlantic City, NJ MSA 4 4 1 2 11 1 0 2010
34001002400 Atlantic City, NJ MSA 5 4 1 5 15 0 0 2010
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 2 1 1 2 6 0 0 2010
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 3 1 1 2 7 0 0 2010
34005702101 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 1 1 0 0 2 0 0 2010
Code
# Create 2020 df, create post variable and set to 1, create year variable and set to 2020
lihtc_did20_div_svi <- svi_divisional_lihtc_df %>% 
  select(GEOID_2010_trt, cbsa, F_THEME1_20, F_THEME2_20, F_THEME3_20, F_THEME4_20, F_TOTAL_20, lihtc_flag) %>% 
  mutate(post = 1,
         year = 2020) %>%
  rename("treat" = "lihtc_flag",
         "SVI_FLAG_COUNT_SES" = "F_THEME1_20",
         "SVI_FLAG_COUNT_HHCHAR" = "F_THEME2_20",
         "SVI_FLAG_COUNT_REM" = "F_THEME3_20",
         "SVI_FLAG_COUNT_HOUSETRANSPT" = "F_THEME4_20",
         "SVI_FLAG_COUNT_OVERALL" = "F_TOTAL_20"
  )


nrow(lihtc_did20_div_svi)
[1] 658
Code
lihtc_did20_div_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
34001001400 Atlantic City, NJ MSA 5 4 1 3 13 0 1 2020
34001001500 Atlantic City, NJ MSA 4 4 1 2 11 1 1 2020
34001002400 Atlantic City, NJ MSA 5 3 1 4 13 0 1 2020
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 3 1 1 2 7 0 1 2020
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 4 1 1 3 9 0 1 2020
34005702101 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 1 1 0 0 2 0 1 2020

Join 2010 and 2020 data into one df

Code
lihtc_diff_in_diff_div_svi <- bind_rows(lihtc_did10_div_svi, lihtc_did20_div_svi)

lihtc_diff_in_diff_div_svi <- lihtc_diff_in_diff_div_svi %>% arrange(post, treat, GEOID_2010_trt)

nrow(lihtc_diff_in_diff_div_svi)
[1] 1316

View top of data frame

Code
lihtc_diff_in_diff_div_svi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
34001001400 Atlantic City, NJ MSA 4 2 1 2 9 0 0 2010
34001002400 Atlantic City, NJ MSA 5 4 1 5 15 0 0 2010
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 2 1 1 2 6 0 0 2010
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 3 1 1 2 7 0 0 2010
34005702101 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 1 1 0 0 2 0 0 2010
34005702204 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 4 3 0 2 9 0 0 2010

View bottom of data frame

Code
lihtc_diff_in_diff_div_svi %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa SVI_FLAG_COUNT_SES SVI_FLAG_COUNT_HHCHAR SVI_FLAG_COUNT_REM SVI_FLAG_COUNT_HOUSETRANSPT SVI_FLAG_COUNT_OVERALL treat post year
42049001800 Erie, PA MSA 4 3 0 2 9 1 1 2020
42101002500 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 2 1 0 1 4 1 1 2020
42101011900 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 0 2 1 2 5 1 1 2020
42101024000 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 2 1 0 2 5 1 1 2020
42101028300 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 4 3 1 1 9 1 1 2020
42121200300 Oil City, PA MicroSA 3 3 0 2 8 1 1 2020

Economic Outcomes Models Data

Next, we can create a set of data with our variables to measure the economic outcomes of house price index, median home value, and median income:

Create dataset for median income

Code
# Create 2010 df, create post variable and set to 0, create year variable and set to 2010, remove any tracts that don't have data for 2010 and 2019
lihtc_did10_div_inc <- svi_divisional_lihtc_df %>% 
  filter(!is.na(Median_Income_10adj_log)) %>% filter(!is.na(Median_Income_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Income_10adj_log, lihtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "lihtc_flag",
         "MEDIAN_INCOME" = "Median_Income_10adj_log") 


nrow(lihtc_did10_div_inc)
[1] 657
Code
lihtc_did10_div_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
34001001400 Atlantic City, NJ MSA 9.876363 0 0 2010
34001001500 Atlantic City, NJ MSA 9.502774 1 0 2010
34001002400 Atlantic City, NJ MSA 9.741093 0 0 2010
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 10.258515 0 0 2010
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 10.076356 0 0 2010
34005702101 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 10.571445 0 0 2010
Code
# Create 2019 df, create post variable and set to 1, create year variable and set to 2019, remove any tracts that don't have data for 2010 and 2019
lihtc_did19_div_inc <- svi_divisional_lihtc_df %>% 
  filter(!is.na(Median_Income_10adj_log)) %>% filter(!is.na(Median_Income_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Income_19_log, lihtc_flag) %>% 
  mutate(post = 1,
         year = 2019) %>%
  rename("treat" = "lihtc_flag",
         "MEDIAN_INCOME" = "Median_Income_19_log") 


nrow(lihtc_did19_div_inc)
[1] 657
Code
lihtc_did19_div_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
34001001400 Atlantic City, NJ MSA 9.769213 0 1 2019
34001001500 Atlantic City, NJ MSA 9.420520 1 1 2019
34001002400 Atlantic City, NJ MSA 9.778264 0 1 2019
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 10.483438 0 1 2019
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 10.275327 0 1 2019
34005702101 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 10.700319 0 1 2019

Join 2010 and 2019 data into one df for income

Code
lihtc_diff_in_diff_div_inc <- bind_rows(lihtc_did10_div_inc, lihtc_did19_div_inc)

lihtc_diff_in_diff_div_inc <- lihtc_diff_in_diff_div_inc %>% arrange(post, treat, GEOID_2010_trt)

nrow(lihtc_diff_in_diff_div_inc)
[1] 1314

View top of data frame for income

Code
lihtc_diff_in_diff_div_inc %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
34001001400 Atlantic City, NJ MSA 9.876363 0 0 2010
34001002400 Atlantic City, NJ MSA 9.741093 0 0 2010
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 10.258515 0 0 2010
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 10.076356 0 0 2010
34005702101 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 10.571445 0 0 2010
34005702204 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 9.895838 0 0 2010

View bottom of data frame income

Code
lihtc_diff_in_diff_div_inc %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_INCOME treat post year
42049001800 Erie, PA MSA 9.674326 1 1 2019
42101002500 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 10.518430 1 1 2019
42101011900 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 10.142583 1 1 2019
42101024000 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 10.463903 1 1 2019
42101028300 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 9.959442 1 1 2019
42121200300 Oil City, PA MicroSA 10.178844 1 1 2019

Create dataset for home value

Code
lihtc_did10_div_mhv <- svi_divisional_lihtc_df %>% 
  filter(!is.na(Median_Home_Value_10adj_log)) %>% filter(!is.na(Median_Home_Value_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Home_Value_10adj_log, lihtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "lihtc_flag",
         "MEDIAN_HOME_VALUE" = "Median_Home_Value_10adj_log") 


nrow(lihtc_did10_div_mhv)
[1] 577
Code
lihtc_did10_div_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
34001001400 Atlantic City, NJ MSA 12.60057 0 0 2010
34001002400 Atlantic City, NJ MSA 12.55047 0 0 2010
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 13.02181 0 0 2010
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 13.02258 0 0 2010
34005702204 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 12.50119 0 0 2010
34007600200 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 11.17359 0 0 2010
Code
lihtc_did19_div_mhv <- svi_divisional_lihtc_df %>% 
  filter(!is.na(Median_Home_Value_10adj_log)) %>% filter(!is.na(Median_Home_Value_19_log)) %>%
  select(GEOID_2010_trt, cbsa, Median_Home_Value_19_log, lihtc_flag) %>% 
  mutate(post = 1,
         year = 2019) %>%
  rename("treat" = "lihtc_flag",
         "MEDIAN_HOME_VALUE" = "Median_Home_Value_19_log") 


nrow(lihtc_did19_div_mhv)
[1] 577
Code
lihtc_did19_div_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
34001001400 Atlantic City, NJ MSA 11.84295 0 1 2019
34001002400 Atlantic City, NJ MSA 12.62116 0 1 2019
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 12.69741 0 1 2019
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 12.77733 0 1 2019
34005702204 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 12.18485 0 1 2019
34007600200 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 11.07597 0 1 2019

Join 2010 and 2019 data into one df for home value

Code
lihtc_diff_in_diff_div_mhv <- bind_rows(lihtc_did10_div_mhv, lihtc_did19_div_mhv)

lihtc_diff_in_diff_div_mhv <- lihtc_diff_in_diff_div_mhv %>% arrange(post, treat, GEOID_2010_trt)

nrow(lihtc_diff_in_diff_div_mhv)
[1] 1154

View top of data frame for home value

Code
lihtc_diff_in_diff_div_mhv %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
34001001400 Atlantic City, NJ MSA 12.60057 0 0 2010
34001002400 Atlantic City, NJ MSA 12.55047 0 0 2010
34003015400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 13.02181 0 0 2010
34003018100 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 13.02258 0 0 2010
34005702204 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 12.50119 0 0 2010
34007600200 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 11.17359 0 0 2010

View bottom of data frame for home value

Code
lihtc_diff_in_diff_div_mhv %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa MEDIAN_HOME_VALUE treat post year
42049001800 Erie, PA MSA 10.73857 1 1 2019
42101002500 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 12.76569 1 1 2019
42101011900 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 11.68013 1 1 2019
42101024000 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 12.27979 1 1 2019
42101028300 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 11.41752 1 1 2019
42121200300 Oil City, PA MicroSA 10.81778 1 1 2019

Create data set for house price index

Code
lihtc_did10_div_hpi <- svi_divisional_lihtc_df %>% 
  filter(!is.na(housing_price_index10_log)) %>% filter(!is.na(housing_price_index20_log)) %>%
  select(GEOID_2010_trt, cbsa, housing_price_index10_log, lihtc_flag) %>% 
  mutate(post = 0,
         year = 2010) %>%
  rename("treat" = "lihtc_flag",
         "HOUSE_PRICE_INDEX" = "housing_price_index10_log") 


nrow(lihtc_did10_div_hpi)
[1] 77
Code
lihtc_did10_div_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
34005702204 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 4.740749 0 0 2010
34009021400 Ocean City, NJ MSA 5.595826 0 0 2010
34009021500 Ocean City, NJ MSA 4.792479 0 0 2010
34013002202 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 5.557021 0 0 2010
34013009400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 5.638390 0 0 2010
34013009500 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 4.985249 0 0 2010
Code
lihtc_did20_div_hpi <- svi_divisional_lihtc_df %>% 
  filter(!is.na(housing_price_index10_log)) %>% filter(!is.na(housing_price_index20_log)) %>%
  select(GEOID_2010_trt, cbsa, housing_price_index20_log, lihtc_flag) %>% 
  mutate(post = 1,
         year = 2020) %>%
  rename("treat" = "lihtc_flag",
         "HOUSE_PRICE_INDEX" = "housing_price_index20_log") 


nrow(lihtc_did20_div_hpi)
[1] 77
Code
lihtc_did20_div_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
34005702204 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 4.843163 0 1 2020
34009021400 Ocean City, NJ MSA 5.796635 0 1 2020
34009021500 Ocean City, NJ MSA 5.025130 0 1 2020
34013002202 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 5.703749 0 1 2020
34013009400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 5.867402 0 1 2020
34013009500 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 5.299517 0 1 2020

Join 2010 and 2019 data into one df for house price index

Code
lihtc_diff_in_diff_div_hpi <- bind_rows(lihtc_did10_div_hpi, lihtc_did20_div_hpi)

lihtc_diff_in_diff_div_hpi <- lihtc_diff_in_diff_div_hpi %>% arrange(post, treat, GEOID_2010_trt)

nrow(lihtc_diff_in_diff_div_hpi)
[1] 154

View top of data frame for house price index

Code
lihtc_diff_in_diff_div_hpi %>% head() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
34005702204 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 4.740749 0 0 2010
34009021400 Ocean City, NJ MSA 5.595826 0 0 2010
34009021500 Ocean City, NJ MSA 4.792479 0 0 2010
34013002202 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 5.557021 0 0 2010
34013009400 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 5.638390 0 0 2010
34013009500 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 4.985249 0 0 2010

View bottom of data frame for house price index

Code
lihtc_diff_in_diff_div_hpi %>% tail() %>% kbl() %>% kable_styling() %>% scroll_box(width = "100%")
GEOID_2010_trt cbsa HOUSE_PRICE_INDEX treat post year
36103122406 New York-Newark-Bridgeport, NY-NJ-CT-PA CSA 5.696825 1 1 2020
36109001100 Ithaca-Cortland, NY CSA 5.336961 1 1 2020
42011000300 Reading, PA MSA 5.129780 1 1 2020
42045400401 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 5.507200 1 1 2020
42101002500 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 6.431057 1 1 2020
42101024000 Philadelphia-Camden-Vineland, PA-NJ-DE-MD CSA 5.774893 1 1 2020

LIHTC Divisional Model

Now that we have our datasets created, we can craft our models. Remember that in R we can use the lm() function for linear models. We can then format the output of models using packages like modelsummary to create easy-to-read output tables (note: unlike stargazer and the base lm() output, your regression models will not print directly in your .RMD file, you will need to view the output in the ‘viewer’ window in RStudio):

Code
# SVI & Economic Models

m1_lihtc_div <- lm( SVI_FLAG_COUNT_SES ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_div_svi )

m2_lihtc_div <- lm( SVI_FLAG_COUNT_HHCHAR ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_div_svi )

m3_lihtc_div <- lm( SVI_FLAG_COUNT_REM ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_div_svi )

m4_lihtc_div <- lm( SVI_FLAG_COUNT_HOUSETRANSPT ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_div_svi )

m5_lihtc_div <- lm( SVI_FLAG_COUNT_OVERALL  ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_div_svi)

m6_lihtc_div <- lm( MEDIAN_INCOME ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_div_inc )

m7_lihtc_div <- lm( MEDIAN_HOME_VALUE ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_div_mhv )

m8_lihtc_div <- lm( HOUSE_PRICE_INDEX ~ treat + post + treat*post + cbsa, data=lihtc_diff_in_diff_div_hpi )

# Add all models to a list
models <- list(
  
  "SES" = m1_lihtc_div,
  "HHChar"  = m2_lihtc_div,
  "REM" = m3_lihtc_div,
  "HOUSETRANSPT" = m4_lihtc_div,
  "OVERALL" = m5_lihtc_div,
  "Median Income (USD, logged)" = m6_lihtc_div,
  "Median Home Value (USD, logged)" = m7_lihtc_div,
  "House Price Index (logged)" = m8_lihtc_div
)


# Display model results
modelsummary(models,  fmt = 2, stars = c('*' = .05, '**' = .01, '***' = .001), coef_omit = "cbsa", gof_omit = "IC|Log",
             notes = list('All models include metro-level fixed effects by core-based statistical area (cbsa).'),
             title = paste0("Differences-in-Differences Linear Regression Analysis of LIHTC in ", census_division)) %>%
  group_tt(j = list("Social Vulnerability" = 2:6, "Economic Outcomes" = 7:9))
Social Vulnerability Economic Outcomes
Differences-in-Differences Linear Regression Analysis of LIHTC in Middle Atlantic Division
SES HHChar REM HOUSETRANSPT OVERALL Median Income (USD, logged) Median Home Value (USD, logged) House Price Index (logged)
* p < 0.05, ** p < 0.01, *** p < 0.001
All models include metro-level fixed effects by core-based statistical area (cbsa).
(Intercept) 2.94*** 1.82*** 0.24*** 1.33*** 6.33*** 9.86*** 11.68*** 4.86***
(0.19) (0.16) (0.07) (0.16) (0.39) (0.06) (0.09) (0.28)
treat 0.23 0.30* 0.16** 0.34** 1.03*** -0.03 -0.13 0.11
(0.14) (0.12) (0.05) (0.12) (0.28) (0.04) (0.07) (0.14)
post -0.09 -0.09 -0.02 0.05 -0.15 0.04 -0.07* 0.27***
(0.07) (0.06) (0.02) (0.06) (0.14) (0.02) (0.03) (0.07)
treat × post 0.10 0.20 -0.04 -0.05 0.21 0.00 0.12 0.00
(0.19) (0.17) (0.07) (0.16) (0.39) (0.06) (0.10) (0.19)
Num.Obs. 1314 1314 1314 1314 1314 1312 1152 154
R2 0.145 0.137 0.271 0.220 0.236 0.209 0.698 0.255
R2 Adj. 0.123 0.114 0.251 0.199 0.216 0.188 0.689 0.162
F 6.391 5.949 13.967 10.608 11.637 9.938 78.299 2.739
RMSE 1.15 1.01 0.41 0.98 2.37 0.35 0.53 0.37

Interpret Divisional SVI & Economic Models

Once again, we first want to note that all of our models include metro-level fixed effect controls by cbsa (Core-Based Statistical Area) to allow the model to consider relative variation with metro areas and equitably make comparisons.

Again, we want to look at the treat x post variable to determine if our program had a statistically significant impact. If this variable is statistically significant, than we can deem that tracts that received program dollars performed significantly differently than would be expected according to general trends.

Just as with our national data, when we look at the Middle Atlantic Division, the diff-in-diff regression models for the LIHTC program does not indicate any statistically significant changes in social vulnerability or economic outcomes. Therefore we cannot conclude that the program had a measurable impact on our SVI and economic outcomes.

However, we can highlight that our Middle Atlantic Division tracts that received LIHTC dollars were statistically more vulnerable based on Household Characteristics, Racial and Ethnic diversity, Housing and Transportation, and Overall Social Vulnerability.

Similar to our discussion of the national data, it’s important to consider that the LIHTC program focuses on increasing availability of housing for low income individuals in a variety of communities and these results may suggest it is effective at targeting more vulnerable areas and accomplishing this goal. However, this would be a topic to explore in further depth in future studies.

Visualize Divisional Models

Again, since we do not have statistically significant changes, we do not need to visualize our outcomes.

Save data sets and models

Now that we have created our models and visualizations, we will save our final data sets to the rodeo folder as rds files. We will also save our collection of regression models to an RData file.

Code
save(m1_nmtc_usa, m2_nmtc_usa, m3_nmtc_usa, m4_nmtc_usa, m5_nmtc_usa, m6_nmtc_usa, m7_nmtc_usa, m8_nmtc_usa, file = here::here(paste0("data/rodeo/", str_replace_all(census_division, " ", "_"), "_svi_did_usa_models_nmtc.RData")), compress=TRUE)

save(m1_lihtc_usa, m2_lihtc_usa, m3_lihtc_usa, m4_lihtc_usa, m5_lihtc_usa, m6_lihtc_usa, m7_lihtc_usa, m8_lihtc_usa, file = here::here(paste0("data/rodeo/", str_replace_all(census_division, " ", "_"), "_svi_did_usa_models_lihtc.RData")), compress=TRUE)
Code
# Save data sets

saveRDS(svi_divisional_lihtc_df, file = here::here(paste0("data/rodeo/", str_replace_all(census_division, " ", "_"), "_svi_divisional_lihtc.rds")))

saveRDS(svi_national_lihtc_df, file = here::here(paste0("data/rodeo/", str_replace_all(census_division, " ", "_"), "_svi_national_lihtc.rds")))

saveRDS(svi_divisional_nmtc_df, file = here::here(paste0("data/rodeo/", str_replace_all(census_division, " ", "_"), "_svi_divisional_nmtc.rds")))

saveRDS(svi_national_nmtc_df, file = here::here(paste0("data/rodeo/", str_replace_all(census_division, " ", "_"), "_svi_national_nmtc.rds")))

# Save regression models

save(m1_nmtc_div, m2_nmtc_div, m3_nmtc_div, m4_nmtc_div, m5_nmtc_div, m6_nmtc_div, m7_nmtc_div, m8_nmtc_div, file = here::here(paste0("data/rodeo/", str_replace_all(census_division, " ", "_"), "_svi_did_models_nmtc.RData")), compress=TRUE, compression_level = 9)

save(m1_lihtc_div, m2_lihtc_div, m3_lihtc_div, m4_lihtc_div, m5_lihtc_div, m6_lihtc_div, m7_lihtc_div, m8_lihtc_div, file = here::here(paste0("data/rodeo/", str_replace_all(census_division, " ", "_"), "_svi_did_models_lihtc.RData")), compress=TRUE, compression_level = 9)

Homework:

  • Write a brief introduction paragraph with a summary of what the diff-in-diff model is and why you’re utilizing it for your evaluation. Include a summary of your dependent variable data (SVI, median income, median home value, and house price index) and your independent variables (the LIHTC and NMTC tax credit data).
  • Create regression models for SVI flags, median income, home price index, and median home values for LIHTC and NMTC for your division
  • Include brief description of model findings, particularly the significance of treat x post
  • Include slope graph visualizations of models with statistically significant treat x post coefficient and describe trends in visuals

Lab Submission Instructions

Congratulations! You’ve reached the end of the Lab-05 Tutorial!

You are now ready to complete your lab and submit it on Canvas.

Note

Your import step in your .RMD file should look similar to the code chunk below, but your project_data_steps.R file should have your name/initials on the end (i.e. project_data_steps_CS.R).

Code
import::here( "fips_census_regions",
              "load_svi_data",
              "merge_svi_data",
              "census_division",
              "slopegraph_plot",
              "census_pull",
             # notice the use of here::here() that points to the .R file
             # where all these R objects are created
             .from = here::here("analysis/project_data_steps.R"),
             .character_only = TRUE)

The following checklist will ensure that you’re on track:

Add newly created graphing function slopegraph_plot() and data pull function census_pull() to project_data_steps.R file
Create new .RMD file and load data and functions from project_data_steps.R file
Write a brief introduction paragraph with a summary of what the diff-in-diff model is and why you’re utilizing it for your evaluation. Include a summary of your dependent variable data (SVI, median income, median home value, and house price index) and your independent variables (the LIHTC and NMTC tax credit data).
Wrangle LIHTC and NMTC datasets to find summary statistics and create diff-in-diff data sets for regression analysis.
Create regression models for SVI flags, median income, home price index, and median home values for LIHTC and NMTC for your division.
Include brief description of model findings, particularly the significance of treat x post.
Include slope graph visualizations of models with statistically significant treat x post coefficient and describe trends in visuals
Apply code chunk options to hide any unwanted warnings/messages and graphing code
Knit .RMD file to create .HTML and .md (Github Flavored) for output
Review example report to get a general idea of what your output should look like
Submit project_data_steps.R, .RMD, .HTML, and .MD files to Canvas
Treat yourself for a job well-done!