library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.2.0
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(MASS)
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
additional_data <- read_excel("tx.counties.xlsx", sheet = "Additional Measure Data", skip = 1)
## New names:
## • `95% CI - Low` -> `95% CI - Low...5`
## • `95% CI - High` -> `95% CI - High...6`
## • `# Deaths` -> `# Deaths...28`
## • `95% CI - Low` -> `95% CI - Low...30`
## • `95% CI - High` -> `95% CI - High...31`
## • `# Deaths` -> `# Deaths...53`
## • `95% CI - Low` -> `95% CI - Low...55`
## • `95% CI - High` -> `95% CI - High...56`
## • `# Deaths` -> `# Deaths...78`
## • `95% CI - Low` -> `95% CI - Low...80`
## • `95% CI - High` -> `95% CI - High...81`
## • `95% CI - Low` -> `95% CI - Low...104`
## • `95% CI - High` -> `95% CI - High...105`
## • `95% CI - Low` -> `95% CI - Low...107`
## • `95% CI - High` -> `95% CI - High...108`
## • `95% CI - Low` -> `95% CI - Low...112`
## • `95% CI - High` -> `95% CI - High...113`
## • `95% CI - Low` -> `95% CI - Low...115`
## • `95% CI - High` -> `95% CI - High...116`
## • `# Deaths` -> `# Deaths...117`
## • `95% CI - Low` -> `95% CI - Low...119`
## • `95% CI - High` -> `95% CI - High...120`
## • `95% CI - Low` -> `95% CI - Low...144`
## • `95% CI - High` -> `95% CI - High...145`
## • `95% CI - Low` -> `95% CI - Low...151`
## • `95% CI - High` -> `95% CI - High...152`
## • `95% CI - Low` -> `95% CI - Low...154`
## • `95% CI - High` -> `95% CI - High...155`
## • `95% CI - Low` -> `95% CI - Low...180`
## • `95% CI - High` -> `95% CI - High...181`
## • `95% CI - Low` -> `95% CI - Low...185`
## • `95% CI - High` -> `95% CI - High...186`
## • `95% CI - Low` -> `95% CI - Low...189`
## • `95% CI - High` -> `95% CI - High...190`
## • `95% CI - Low` -> `95% CI - Low...213`
## • `95% CI - High` -> `95% CI - High...214`
## • `95% CI - Low` -> `95% CI - Low...216`
## • `95% CI - High` -> `95% CI - High...217`
## • `95% CI - Low` -> `95% CI - Low...220`
## • `95% CI - High` -> `95% CI - High...221`
## • `95% CI - Low` -> `95% CI - Low...224`
## • `95% CI - High` -> `95% CI - High...225`
## • `95% CI - Low` -> `95% CI - Low...231`
## • `95% CI - High` -> `95% CI - High...232`
## • `95% CI - Low` -> `95% CI - Low...235`
## • `95% CI - High` -> `95% CI - High...236`
## • `Average Grade Performance` -> `Average Grade Performance...246`
## • `Average Grade Performance (AIAN)` -> `Average Grade Performance
##   (AIAN)...247`
## • `Average Grade Performance (Asian)` -> `Average Grade Performance
##   (Asian)...248`
## • `Average Grade Performance (Black)` -> `Average Grade Performance
##   (Black)...249`
## • `Average Grade Performance (Hispanic)` -> `Average Grade Performance
##   (Hispanic)...250`
## • `Average Grade Performance (White)` -> `Average Grade Performance
##   (White)...251`
## • `Average Grade Performance` -> `Average Grade Performance...252`
## • `Average Grade Performance (AIAN)` -> `Average Grade Performance
##   (AIAN)...253`
## • `Average Grade Performance (Asian)` -> `Average Grade Performance
##   (Asian)...254`
## • `Average Grade Performance (Black)` -> `Average Grade Performance
##   (Black)...255`
## • `Average Grade Performance (Hispanic)` -> `Average Grade Performance
##   (Hispanic)...256`
## • `Average Grade Performance (White)` -> `Average Grade Performance
##   (White)...257`
## • `Segregation Index` -> `Segregation Index...258`
## • `95% CI - Low` -> `95% CI - Low...265`
## • `95% CI - High` -> `95% CI - High...266`
## • `95% CI - Low` -> `95% CI - Low...268`
## • `95% CI - High` -> `95% CI - High...269`
## • `Segregation Index` -> `Segregation Index...287`
## • `95% CI - Low` -> `95% CI - Low...289`
## • `95% CI - High` -> `95% CI - High...290`
## • `95% CI - Low` -> `95% CI - Low...314`
## • `95% CI - High` -> `95% CI - High...315`
## • `95% CI - Low` -> `95% CI - Low...339`
## • `95% CI - High` -> `95% CI - High...340`
## • `95% CI - Low` -> `95% CI - Low...363`
## • `95% CI - High` -> `95% CI - High...364`
## • `95% CI - Low` -> `95% CI - Low...366`
## • `95% CI - High` -> `95% CI - High...367`
## • `95% CI - Low` -> `95% CI - Low...386`
## • `95% CI - High` -> `95% CI - High...387`
## • `95% CI - Low` -> `95% CI - Low...391`
## • `95% CI - High` -> `95% CI - High...392`
counties <- additional_data[-1, ]
model <- lm(`% Frequent Mental Distress` ~ `% Food Insecure` + `% Uninsured Adults`, data = counties)
raintest(model)
## 
##  Rainbow test
## 
## data:  model
## Rain = 1.1045, df1 = 127, df2 = 124, p-value = 0.2895
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
plot(model)

library(car)
durbinWatsonTest(model)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.0569551        1.8835   0.338
##  Alternative hypothesis: rho != 0
bptest(model)
## 
##  studentized Breusch-Pagan test
## 
## data:  model
## BP = 1.7571, df = 2, p-value = 0.4154
plot(model,which=2)

this model appears to meet linearity assumption becausee the rainbow test produced a p-value of 0.29, which is greater than 0.05. however there are some deviations from normality on the ends.

vif(model)
##    `% Food Insecure` `% Uninsured Adults` 
##             1.261515             1.261515
cor(counties[c("% Food Insecure", "% Uninsured Adults")],
    use = "complete.obs")
##                    % Food Insecure % Uninsured Adults
## % Food Insecure          1.0000000          0.4553044
## % Uninsured Adults       0.4553044          1.0000000

The correlation between food insecurity and uninsured adults is aproximately 0.46, indicating a positive relationship.

The assumptions met are linearity, independence of errors, homoscedasticity, and multicollinearity based on statistical tests.

shapiro.test(residuals(model))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model)
## W = 0.98324, p-value = 0.004382

After this test it looks like the normality of residuals assumption is violated because it produced a p-value of 0.004, which is less than 0.05.

Per the cheat sheet for mitigation, i will try to resolve this with a log transformation.

model_log <- lm(log(`% Frequent Mental Distress`) ~ `% Food Insecure` + `% Uninsured Adults`, data = counties)
shapiro.test(residuals(model_log))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(model_log)
## W = 0.9719, p-value = 6.561e-05

to address the violation of the normality of assumption, i applied log transformation to dependent variable. frequent mental distress, then ran shapiro test. the P-value is less than 0.05, which is still not normal.

plot(model_log, which = 2)

This new QQ plot shows deviations in the tails, the log transformation did not resolve my problemo.