Setup

library(pacman); p_load(DT, ggplot2, sandwich, car, lmtest, VIM)
datatable(data, extensions = c("Buttons", "FixedColumns"), options = list(dom = 'Bfrtip', buttons = c('copy', 'csv', 'print'), scrollX = T, fixedColumns = list(leftColumns = 3)))

Rationale

Using RAND’s 2016 state-level gun ownership data (https://www.rand.org/research/gun-policy/gun-ownership.html) and the FBI UCR’s 2016 intentional homicide rate per 100,000 (https://ucr.fbi.gov/crime-in-the-u.s, https://crime-data-explorer.app.cloud.gov/pages/explorer/crime/crime-trend), I aimed to conduct a simple replication of the relationship between gun ownership and homicide rates.

I used hunting licenses, Guns and Ammo subscriptions, and background checks as instruments for gun ownership in addition to GSS and Pew survey estimates of gun ownership. I also assessed whether states with universal background checks, permit to purchase laws, and (2016 and earlier) red flag laws had lower homicide rates. I also attempted to replicate the relationship between firearm suicide rates and both gun ownership rates and intentional homicide rates.

Analyses

Homicide Rate Prediction

First, GSS estimated gun ownership rates.

summary(lm(IHR ~ GSS, data))
## 
## Call:
## lm(formula = IHR ~ GSS, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7548 -1.8537  0.1942  1.5338  5.3143 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)    2.898      1.171   2.475   0.0179 *
## GSS            7.603      3.303   2.302   0.0269 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.19 on 38 degrees of freedom
##   (10 observations deleted due to missingness)
## Multiple R-squared:  0.1224, Adjusted R-squared:  0.0993 
## F-statistic:   5.3 on 1 and 38 DF,  p-value: 0.0269
ggplot(data, aes(x = GSS, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "General Social Survey Estimated Gun Ownership", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 10 rows containing non-finite values (stat_smooth).
## Warning: Removed 10 rows containing missing values (geom_point).

Next, Pew estimated gun ownership rates.

summary(lm(IHR ~ PEW, data))
## 
## Call:
## lm(formula = IHR ~ PEW, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6866 -2.0628  0.3514  1.6976  6.5725 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    4.057      1.165   3.484  0.00107 **
## PEW            1.775      2.175   0.816  0.41833   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.407 on 48 degrees of freedom
## Multiple R-squared:  0.01369,    Adjusted R-squared:  -0.006854 
## F-statistic: 0.6664 on 1 and 48 DF,  p-value: 0.4183
ggplot(data, aes(x = PEW, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "Pew Survey Estimated Gun Ownership", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

Then, male, followed by female, and then by combined (assuming equal population proportions by state) firearm suicide rates.

summary(lm(IHR ~ Male_FS_S, data))
## 
## Call:
## lm(formula = IHR ~ Male_FS_S, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8091 -1.6574  0.1047  1.2516  6.0672 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    0.642      1.567   0.410  0.68382   
## Male_FS_S      7.563      2.683   2.818  0.00699 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.245 on 48 degrees of freedom
## Multiple R-squared:  0.142,  Adjusted R-squared:  0.1241 
## F-statistic: 7.943 on 1 and 48 DF,  p-value: 0.006993
summary(lm(IHR ~ Fem_FS_S, data))
## 
## Call:
## lm(formula = IHR ~ Fem_FS_S, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.2337 -1.4091  0.0164  0.9303  5.0748 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   1.7336     0.6745   2.570   0.0133 *  
## Fem_FS_S     10.0224     1.9118   5.242 3.51e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.933 on 48 degrees of freedom
## Multiple R-squared:  0.3641, Adjusted R-squared:  0.3509 
## F-statistic: 27.48 on 1 and 48 DF,  p-value: 3.513e-06
summary(lm(IHR ~ Combined_FS_S, data))
## 
## Call:
## lm(formula = IHR ~ Combined_FS_S, data = data)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -3.270 -1.807  0.035  1.071  5.027 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     0.4217     1.0913   0.386    0.701    
## Combined_FS_S  10.1632     2.3523   4.321 7.79e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.057 on 48 degrees of freedom
## Multiple R-squared:   0.28,  Adjusted R-squared:  0.265 
## F-statistic: 18.67 on 1 and 48 DF,  p-value: 7.786e-05
ggplot(data, aes(x = Male_FS_S, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "Male Firearm Suicide Rate Instrument", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

ggplot(data, aes(x = Fem_FS_S, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "Female Firearm Suicide Rate Instrument", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

ggplot(data, aes(x = Combined_FS_S, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "Aggregate Firearm Suicide Rate Instrument", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

Next, hunting license instrumented gun ownership rates.

summary(lm(IHR ~ HuntLic, data))
## 
## Call:
## lm(formula = IHR ~ HuntLic, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5381 -2.0728 -0.0023  1.5588  6.8364 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    5.880      0.772   7.617 8.39e-10 ***
## HuntLic       -2.510      1.908  -1.316    0.194    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.381 on 48 degrees of freedom
## Multiple R-squared:  0.03482,    Adjusted R-squared:  0.01471 
## F-statistic: 1.732 on 1 and 48 DF,  p-value: 0.1944
ggplot(data, aes(x = HuntLic, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "Hunting License Instrument for Gun Ownership", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

Next, Guns & Ammo instrumented gun ownership rates.

summary(lm(IHR ~ GunsAmmo, data))
## 
## Call:
## lm(formula = IHR ~ GunsAmmo, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5894 -2.1597  0.0768  1.6326  6.5526 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   4.9660     0.3386  14.667   <2e-16 ***
## GunsAmmo     -0.3754     0.3420  -1.098    0.278    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.394 on 48 degrees of freedom
## Multiple R-squared:  0.02448,    Adjusted R-squared:  0.00416 
## F-statistic: 1.205 on 1 and 48 DF,  p-value: 0.2779
ggplot(data, aes(x = GunsAmmo, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "Guns & Ammo Subscriptions Instrument for Gun Ownership", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

Next, background check instrumented gun ownership rates.

summary(lm(IHR ~ BackChk, data))
## 
## Call:
## lm(formula = IHR ~ BackChk, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8294 -2.1091  0.2345  1.6030  6.6773 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   4.9660     0.3407  14.575   <2e-16 ***
## BackChk       0.2642     0.3442   0.768    0.446    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.409 on 48 degrees of freedom
## Multiple R-squared:  0.01213,    Adjusted R-squared:  -0.008455 
## F-statistic: 0.5892 on 1 and 48 DF,  p-value: 0.4465
ggplot(data, aes(x = BackChk, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "Background Check Instrument for Gun Ownership", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

Suicide Rate Prediction

summary(lm(Fem_FS_S ~ GSS, data))
## 
## Call:
## lm(formula = Fem_FS_S ~ GSS, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.275477 -0.056206  0.006615  0.074533  0.176398 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.03770    0.05651  -0.667    0.509    
## GSS          1.07718    0.15938   6.759 5.23e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1057 on 38 degrees of freedom
##   (10 observations deleted due to missingness)
## Multiple R-squared:  0.5459, Adjusted R-squared:  0.5339 
## F-statistic: 45.68 on 1 and 38 DF,  p-value: 5.226e-08
summary(lm(Fem_FS_S ~ PEW, data))
## 
## Call:
## lm(formula = Fem_FS_S ~ PEW, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.292227 -0.067648 -0.004885  0.091409  0.242588 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.01946    0.05377   0.362    0.719    
## PEW          0.59181    0.10042   5.893 3.65e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1112 on 48 degrees of freedom
## Multiple R-squared:  0.4198, Adjusted R-squared:  0.4077 
## F-statistic: 34.73 on 1 and 48 DF,  p-value: 3.646e-07
summary(lm(Fem_FS_S ~ HuntLic, data))
## 
## Call:
## lm(formula = Fem_FS_S ~ HuntLic, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.24500 -0.10559  0.00102  0.11162  0.32756 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.26173    0.04629   5.654 8.44e-07 ***
## HuntLic      0.16693    0.11439   1.459    0.151    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1428 on 48 degrees of freedom
## Multiple R-squared:  0.04248,    Adjusted R-squared:  0.02253 
## F-statistic: 2.129 on 1 and 48 DF,  p-value: 0.151
summary(lm(Fem_FS_S ~ GunsAmmo, data))
## 
## Call:
## lm(formula = Fem_FS_S ~ GunsAmmo, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.24194 -0.10197 -0.01715  0.09790  0.33350 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.32252    0.01966  16.409   <2e-16 ***
## GunsAmmo     0.04406    0.01985   2.219   0.0313 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.139 on 48 degrees of freedom
## Multiple R-squared:  0.09303,    Adjusted R-squared:  0.07413 
## F-statistic: 4.923 on 1 and 48 DF,  p-value: 0.03126
summary(lm(Fem_FS_S ~ BackChk, data))
## 
## Call:
## lm(formula = Fem_FS_S ~ BackChk, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.21301 -0.09992 -0.01400  0.07125  0.30282 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.32252    0.01741  18.522  < 2e-16 ***
## BackChk      0.07754    0.01759   4.409 5.84e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1231 on 48 degrees of freedom
## Multiple R-squared:  0.2882, Adjusted R-squared:  0.2734 
## F-statistic: 19.44 on 1 and 48 DF,  p-value: 5.838e-05
summary(lm(Male_FS_S ~ GSS, data))
## 
## Call:
## lm(formula = Male_FS_S ~ GSS, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.167166 -0.049328  0.000921  0.047662  0.122829 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.26365    0.03723   7.082 1.91e-08 ***
## GSS          0.90326    0.10501   8.602 1.88e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.06964 on 38 degrees of freedom
##   (10 observations deleted due to missingness)
## Multiple R-squared:  0.6607, Adjusted R-squared:  0.6518 
## F-statistic: 73.99 on 1 and 38 DF,  p-value: 1.883e-10
summary(lm(Male_FS_S ~ PEW, data))
## 
## Call:
## lm(formula = Male_FS_S ~ PEW, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.186325 -0.039440 -0.009411  0.040300  0.154434 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.25026    0.03253   7.692 6.45e-10 ***
## PEW          0.62781    0.06076  10.333 8.57e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.06726 on 48 degrees of freedom
## Multiple R-squared:  0.6899, Adjusted R-squared:  0.6834 
## F-statistic: 106.8 on 1 and 48 DF,  p-value: 8.567e-14
summary(lm(Male_FS_S ~ HuntLic, data))
## 
## Call:
## lm(formula = Male_FS_S ~ HuntLic, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.263222 -0.066942  0.006105  0.089209  0.163606 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.45510    0.03439   13.23  < 2e-16 ***
## HuntLic      0.32034    0.08498    3.77 0.000448 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1061 on 48 degrees of freedom
## Multiple R-squared:  0.2284, Adjusted R-squared:  0.2123 
## F-statistic: 14.21 on 1 and 48 DF,  p-value: 0.0004478
summary(lm(Male_FS_S ~ GunsAmmo, data))
## 
## Call:
## lm(formula = Male_FS_S ~ GunsAmmo, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.181616 -0.061948  0.001337  0.067225  0.195396 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.57175    0.01324  43.184  < 2e-16 ***
## GunsAmmo     0.07551    0.01337   5.646 8.67e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.09362 on 48 degrees of freedom
## Multiple R-squared:  0.3991, Adjusted R-squared:  0.3866 
## F-statistic: 31.88 on 1 and 48 DF,  p-value: 8.67e-07
summary(lm(Male_FS_S ~ BackChk, data))
## 
## Call:
## lm(formula = Male_FS_S ~ BackChk, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.22404 -0.05571  0.00458  0.06476  0.15831 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.57175    0.01331  42.971  < 2e-16 ***
## BackChk      0.07494    0.01344   5.576 1.11e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.09409 on 48 degrees of freedom
## Multiple R-squared:  0.3931, Adjusted R-squared:  0.3804 
## F-statistic: 31.09 on 1 and 48 DF,  p-value: 1.107e-06
summary(lm(Combined_FS_S ~ GSS, data))
## 
## Call:
## lm(formula = Combined_FS_S ~ GSS, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.16000 -0.05608 -0.00029  0.04808  0.14604 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.11298    0.04204   2.687   0.0106 *  
## GSS          0.99022    0.11858   8.350 3.98e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.07865 on 38 degrees of freedom
##   (10 observations deleted due to missingness)
## Multiple R-squared:  0.6473, Adjusted R-squared:  0.638 
## F-statistic: 69.73 on 1 and 38 DF,  p-value: 3.976e-10
summary(lm(Combined_FS_S ~ PEW, data))
## 
## Call:
## lm(formula = Combined_FS_S ~ PEW, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.125297 -0.064812 -0.003547  0.059912  0.157490 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.13486    0.03880   3.475  0.00109 ** 
## PEW          0.60981    0.07247   8.415 5.23e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.08022 on 48 degrees of freedom
## Multiple R-squared:  0.596,  Adjusted R-squared:  0.5876 
## F-statistic: 70.82 on 1 and 48 DF,  p-value: 5.231e-11
summary(lm(Combined_FS_S ~ HuntLic, data))
## 
## Call:
## lm(formula = Combined_FS_S ~ HuntLic, data = data)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.242884 -0.072389 -0.009259  0.100577  0.237258 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.35842    0.03836   9.344 2.23e-12 ***
## HuntLic      0.24363    0.09479   2.570   0.0133 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1183 on 48 degrees of freedom
## Multiple R-squared:  0.121,  Adjusted R-squared:  0.1027 
## F-statistic: 6.607 on 1 and 48 DF,  p-value: 0.01332
summary(lm(Combined_FS_S ~ GunsAmmo, data))
## 
## Call:
## lm(formula = Combined_FS_S ~ GunsAmmo, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.18678 -0.08433 -0.01270  0.08059  0.24563 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.44714    0.01567  28.532  < 2e-16 ***
## GunsAmmo     0.05978    0.01583   3.776 0.000439 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1108 on 48 degrees of freedom
## Multiple R-squared:  0.2291, Adjusted R-squared:  0.213 
## F-statistic: 14.26 on 1 and 48 DF,  p-value: 0.0004386
summary(lm(Combined_FS_S ~ BackChk, data))
## 
## Call:
## lm(formula = Combined_FS_S ~ BackChk, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.19540 -0.07688 -0.01510  0.06811  0.21115 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.44714    0.01414  31.627  < 2e-16 ***
## BackChk      0.07624    0.01428   5.339 2.52e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.09997 on 48 degrees of freedom
## Multiple R-squared:  0.3726, Adjusted R-squared:  0.3595 
## F-statistic:  28.5 on 1 and 48 DF,  p-value: 2.522e-06

Law Effects

leveneTest(IHR ~ as.factor(universl), data) #Normality fails via Shapiro-Wilk for IHR, but not Levene's test, so ultimately, Wilcoxon tests had to be used for mean comparisons rather than t-tests.
leveneTest(IHR ~ as.factor(permit), data)
leveneTest(IHR ~ as.factor(redflag), data)
wilcox.test(data$universl, data$IHR, paired = F, alternative = "two.sided")
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  data$universl and data$IHR
## W = 0, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
ggplot(data = data, aes(x = as.factor(universl), y = IHR)) + geom_bar(stat = "summary", width = .5) + labs(title = "Intentional Homicide Rates in States With and Without Universal Background Checks", x = "Presence or Absence of UBCs", y = "Intentional Homicide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + scale_x_discrete(labels = c("No UBCs", "UBCs"))
## No summary function supplied, defaulting to `mean_se()`

wilcox.test(data$permit, data$IHR, paired = F, alternative = "two.sided")
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  data$permit and data$IHR
## W = 0, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
ggplot(data = data, aes(x = as.factor(permit), y = IHR)) + geom_bar(stat = "summary", width = .5) + labs(title = "Intentional Homicide Rates in States With and Without Permit to Purchase Laws", x = "Presence or Absence of PPLs", y = "Intentional Homicide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + scale_x_discrete(labels = c("No PPLs", "PPLs"))
## No summary function supplied, defaulting to `mean_se()`

wilcox.test(data$redflag, data$IHR, paired = F, alternative = "two.sided")
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  data$redflag and data$IHR
## W = 0, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
ggplot(data = data, aes(x = as.factor(redflag), y = IHR)) + geom_bar(stat = "summary", width = .5) + labs(title = "Intentional Homicide Rates in States With and Without Red Flag Laws", x = "Presence or Absence of RFLs", y = "Intentional Homicide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5)) + scale_x_discrete(labels = c("No RFLs", "RFLs"))
## No summary function supplied, defaulting to `mean_se()`

Summary

Gun ownership rates, as measured in two surveys or proxied by plausible instruments were unrelated to intentional homicide rates in 4/5 specifications, and in one, they were modestly positively related (p = .0269). This might have been due to 20% of the data for that specification (GSS survey-based) being missing. One method that might help with the possibility of an induced bias then, might be to impute those states from the other estimates, or to use robust regressions.

Robust regression on the unimputed data replicates the result whilst making it somewhat weaker:

GSSSpec <- lm(IHR ~ GSS, data)
GSSVC <- vcovHC(GSSSpec, type = "HC5")
Results <- coeftest(GSSSpec, vcov = GSSVC); Results
## 
## t test of coefficients:
## 
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)   2.8975     1.1975  2.4196  0.02043 *
## GSS           7.6026     3.4992  2.1727  0.03611 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Iterative Robust Model-based Imputation using the other

IMPData <- irmi(data[, c("GSS", "PEW", "HuntLic", "GunsAmmo", "BackChk")])
data$GSSImp <- IMPData$GSS

GSSSpec <- lm(IHR ~ GSSImp, data); summary(GSSSpec)
## 
## Call:
## lm(formula = IHR ~ GSSImp, data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5808 -2.0238  0.4282  1.6968  6.2536 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    3.303      1.163   2.841  0.00658 **
## GSSImp         4.753      3.182   1.494  0.14180   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.37 on 48 degrees of freedom
## Multiple R-squared:  0.04442,    Adjusted R-squared:  0.02451 
## F-statistic: 2.231 on 1 and 48 DF,  p-value: 0.1418
GSSVC <- vcovHC(GSSSpec, type = "HC5")
Results <- coeftest(GSSSpec, vcov = GSSVC); Results
## 
## t test of coefficients:
## 
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   3.3031     1.1062  2.9860 0.004439 **
## GSSImp        4.7530     3.1778  1.4957 0.141277   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The result becomes nonsignificant with imputation both before and after the use of robust regression. However, this is perhaps not a meaningful result. The reason is this: imputation was conducted based on variables known to yield nonsignificant relationships with the measure of intentional homicide rates, thus practically assuring the resulting relationship would be less significant if the imputed datapoints were consistent with that, and they probably were, given their high correlations. This is assured via correlational transitivity when \(r^2_A + r^2_B > 1\), which was the case or very nearly the case for most of the gun ownership variables.

mean(data$GSS, na.rm = T); mean(data$GSSImp)
## [1] 0.338696
## [1] 0.3498604
cor(data[,8:12], use = "pairwise.complete")
##                GSS       PEW   HuntLic  GunsAmmo   BackChk
## GSS      1.0000000 0.9294753 0.6267943 0.7587861 0.7728019
## PEW      0.9294753 1.0000000 0.7032986 0.7753663 0.7347020
## HuntLic  0.6267943 0.7032986 1.0000000 0.7866777 0.6282259
## GunsAmmo 0.7587861 0.7753663 0.7866777 1.0000000 0.7083116
## BackChk  0.7728019 0.7347020 0.6282259 0.7083116 1.0000000
cor(data[,8:12], use = "pairwise.complete")^2 + cor(data[,8:12], use = "pairwise.complete")^2
##                GSS       PEW   HuntLic GunsAmmo   BackChk
## GSS      2.0000000 1.7278486 0.7857422 1.151513 1.1944456
## PEW      1.7278486 2.0000000 0.9892579 1.202386 1.0795741
## HuntLic  0.7857422 0.9892579 2.0000000 1.237724 0.7893355
## GunsAmmo 1.1515127 1.2023857 1.2377236 2.000000 1.0034105
## BackChk  1.1944456 1.0795741 0.7893355 1.003411 2.0000000

Regardless, here is the plot of the imputed GSS survey estimate relationship with homicide rates.

ggplot(data, aes(x = GSSImp, y = IHR)) + geom_point() + geom_smooth(method = lm, color = "orangered") + labs(title = "Relationship between Gun Ownership and Homicide Rates", x = "General Social Survey Estimated Gun Ownership with Imputation", y = "FBI UCR Intentional Homimcide Rate") + theme_minimal() + theme(legend.position = "none", text = element_text(size = 12, family = "serif"), plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

Replicating Briggs & Tabarrok’s (2014) study, gun ownership was consistently positively related to suicide rates. This makes sense because guns are a quick and easy way to commit suicide. Moreover, we do have causal evidence for this relationship (Shelef et al., 2015). It interesting that firearm suicide and total homicide rates were related. It might be the case that they were related for reasons to do with suicidality often coming with a desire to take out others, but this data was not sufficient to assess that. Future data using different types of suicide rates versus different types of and total homicides would be interesting to examine.

States that had implemented universal background checks, permit to purchase laws, and red flag laws had consistently and significantly lower homicide rates, but this does not provide evidence that such laws work, only the states in which they are implemented have lower homicide rates for whatever reason. To grasp the effect of these laws, areas where these laws are implemented should have their homicide rates plotted over time, as implementation should cause a reduction for them. Moreover, implementation in one area should not lead to changes in neighboring areas without similar policies, so those can be used for quick and easy comparison (see Levitt, 2004).

More systematic investigations of all of these phenomena alongside the inclusion of variables like legal versus illegal gun availability (see Stolzenberg & D’Alessio, 2000) and use in crimes, and with information regarding substitution with other deadly weapons like knives or blunt instruments.

References

Briggs, J. T., & Tabarrok, A. (2014). Firearms and suicides in US states. International Review of Law and Economics, 37, 180–188. https://doi.org/10.1016/j.irle.2013.10.004

Shelef, L., Laur, L., Raviv, G., & Fruchter, E. (2015). A military suicide prevention program in the Israeli Defense Force: A review of an important military medical procedure. Disaster and Military Medicine, 1(1), 16. https://doi.org/10.1186/s40696-015-0007-y

Levitt, S. D. (2004). Understanding Why Crime Fell in the 1990s: Four Factors that Explain the Decline and Six that Do Not. Journal of Economic Perspectives, 18(1), 163–190. https://doi.org/10.1257/089533004773563485

Stolzenberg, L., & D’Alessio, S. J. (2000). Gun Availability and Violent Crime: New Evidence from the National Incident-Based Reporting System. Social Forces, 78(4), 1461–1482. https://doi.org/10.1093/sf/78.4.1461

sessionInfo()
## R version 4.1.2 (2021-11-01)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19044)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=English_United States.1252 
## [2] LC_CTYPE=English_United States.1252   
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.1252    
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] VIM_6.1.1        colorspace_2.0-2 lmtest_0.9-38    zoo_1.8-9       
##  [5] car_3.0-12       carData_3.0-4    sandwich_3.0-1   ggplot2_3.3.5   
##  [9] DT_0.20          pacman_0.5.1    
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.7        vcd_1.4-9         lattice_0.20-45   class_7.3-19     
##  [5] assertthat_0.2.1  digest_0.6.28     utf8_1.2.2        R6_2.5.1         
##  [9] ranger_0.13.1     evaluate_0.14     e1071_1.7-9       highr_0.9        
## [13] pillar_1.6.4      rlang_0.4.12      data.table_1.14.2 jquerylib_0.1.4  
## [17] Matrix_1.3-4      rmarkdown_2.11    labeling_0.4.2    splines_4.1.2    
## [21] stringr_1.4.0     htmlwidgets_1.5.4 munsell_0.5.0     proxy_0.4-26     
## [25] compiler_4.1.2    xfun_0.27         pkgconfig_2.0.3   mgcv_1.8-38      
## [29] htmltools_0.5.2   nnet_7.3-16       tidyselect_1.1.1  tibble_3.1.5     
## [33] fansi_0.5.0       crayon_1.4.2      dplyr_1.0.7       laeken_0.5.2     
## [37] withr_2.4.2       MASS_7.3-54       nlme_3.1-153      jsonlite_1.7.2   
## [41] gtable_0.3.0      lifecycle_1.0.1   DBI_1.1.2         magrittr_2.0.1   
## [45] scales_1.1.1      stringi_1.7.5     farver_2.1.0      sp_1.4-6         
## [49] robustbase_0.93-9 bslib_0.3.1       ellipsis_0.3.2    generics_0.1.1   
## [53] vctrs_0.3.8       boot_1.3-28       tools_4.1.2       glue_1.4.2       
## [57] DEoptimR_1.0-9    purrr_0.3.4       crosstalk_1.2.0   abind_1.4-5      
## [61] fastmap_1.1.0     yaml_2.2.1        knitr_1.36        sass_0.4.0