Kapitel 4 Bivariat analys

4.1 Krosstabler: Två kategorisk variabler

Precis som alla andra saker i R det finns många olika sätt att skapa kross tabell i R. Här er den enklaste exempel som beräkna bara hur många fall finns det i värj kategori.

table(df$Radsla_oro, df$Storstad)
##              
##               Inte storstad Storstad
##   Inte orolig        140012    60760
##   Orolig             119997    45354

Men vi kan också ändra den kod att räkna ut procent i värj låda

prop.table(table(df$Radsla_oro, df$Storstad),2)
##              
##               Inte storstad  Storstad
##   Inte orolig     0.5384891 0.5725917
##   Orolig          0.4615109 0.4274083

Och vi kan även räkna ut de så att de ser ut som procent

round(100* prop.table(table(df$Radsla_oro, df$Storstad),2))
##              
##               Inte storstad Storstad
##   Inte orolig            54       57
##   Orolig                 46       43

Men nu att räkna ut \(\chi {2}\) vi behöver först räkna ut föväntade värderna om de fanns ingen skillnad mellan grupperna. Formel att räckna ut varje cell i en tabell är \({e}= \frac{radtotal \ast koltotal}{total}\) sen från tabellen övanför det skulle ser ut så här

(200772*260009)/366123
## [1] 142581.9
(200772*106114)/366123
## [1] 58190.06
(165351*260009)/366123
## [1] 117427.1
(165351*106114)/366123
## [1] 47923.94

Sen med förväntade värderna vi kan får \(\chi {2}\) genom formeln
\(\chi ^{2}=\sum \frac{(O-E)^2}{E}\)

Och vi kan använder R att räcnka ut \(\chi {2}\) för oss så här:

chisq.test(df$Storstad, df$Radsla_oro)
## 
##  Pearson's Chi-squared test with
##  Yates' continuity correction
## 
## data:  df$Storstad and df$Radsla_oro
## X-squared = 353.74, df = 1, p-value
## < 2.2e-16

Men vi kan också använder en packet i R som heter sjPlot att visa alla information i samma plats samt kör \(\chi {2}\) prov.

library(sjPlot)
tab_xtab(
  var.row = df$Radsla_oro,
  var.col = df$Storstad,
  show.summary = TRUE,
  show.col.prc = TRUE,
  use.viewer = TRUE
)
Radsla_oro Storstad Total
Inte storstad Storstad
Inte orolig 140012
53.8 %
60760
57.3 %
200772
54.8 %
Orolig 119997
46.2 %
45354
42.7 %
165351
45.2 %
Total 260009
100 %
106114
100 %
366123
100 %
χ2=353.742 · df=1 · &phi=0.031 · p=0.000

Men då vi kan också skapa en figur av skillnader andel de som är orolig baserad på stads storlek.

df %>%
  drop_na() %>% 
  count(Storstad, Radsla_oro) %>% 
  group_by(Storstad) %>%
  mutate(prop = n / sum(n), na.rm=TRUE) %>%
  ggplot(aes(x = Storstad, y = prop, fill = Radsla_oro)) +
  geom_col(position = position_dodge()) +
  geom_text(aes(label = round(100 * prop)),
            position = position_dodge(.9), vjust = -.2
  )+
  theme_bw()

4.2 Korrelationer: Två kontinuerlig variabel

Bara två variabler från datasetet:

shootings %>% 
  select(shootings_rate, education_average) %>% #Första välja variablerna att inkludera i korrelationsanalys
  tab_corr(corr.method='pearson', triangle = 'lower')
  shootings_rate education_average
shootings_rate    
education_average 0.381**  
Computed correlation used pearson-method with listwise-deletion.

Sen vi kan kolla på hur alla fyra variabler korrelera med vandra:

shootings %>% 
  select(shootings_rate, education_average, trust_police_average, income_average) %>% #Första välja variablerna att inkludera i korrelationsanalys
  tab_corr(corr.method='pearson', triangle = 'lower')
  shootings_rate education_average trust_police_average income_average
shootings_rate        
education_average 0.381**      
trust_police_average -0.151 -0.066    
income_average 0.562*** 0.565*** -0.184  
Computed correlation used pearson-method with listwise-deletion.
shootings %>% 
  select(shootings_rate, education_average, trust_police_average, income_average) %>% #Första välja variablerna att inkludera i korrelationsanalys
  sjp.corr(corr.method = 'pearson')
## Warning in sjp.corr(., corr.method =
## "pearson"): 'sjp.corr' is deprecated.
## Please use 'correlation::correlation()'
## and its related plot()-method.
## Computing correlation using pearson-method with listwise-deletion...
## Warning: Removed 10 rows containing missing
## values or values outside the scale range
## (`geom_text()`).

Sen vi kan visualisera sambandet tillsammans med iakttog punkterna med ggplot. Första vi kan bygga en skatterplot av sambandet

shootings %>% 
  ggplot(aes(education_average, shootings_rate))+
  geom_point()+
  theme_bw()

Sen vi kan lägga till en regressions linje

shootings %>% 
  ggplot(aes(education_average, shootings_rate))+
  geom_point()+
  geom_smooth(method= 'lm')+
  theme_bw()
## `geom_smooth()` using formula = 'y ~ x'

4.3 Jämförelsen av medelvärdet: Kontinuerlig beroende varaibel och kategorisk oberoends variabel

aov<-aov(shootings_rate~ year, data=shootings)
summary(aov)
##             Df Sum Sq Mean Sq F value
## year         1   2.97   2.965    0.82
## Residuals   61 220.51   3.615        
##             Pr(>F)
## year         0.369
## Residuals

Sen vi får medelvärdena och konfidensintervaller men ememans packetet

library(emmeans)
emmeans(aov, spec = 'year')
##  year emmean   SE df lower.CL upper.CL
##  2019   2.56 0.24 61     2.08     3.04
## 
## Confidence level used: 0.95

Sen vi kan visualisera sambandet mellan skottfrekvens och år.

shootings %>% 
 ggplot(aes(year, shootings_rate))+
  geom_jitter(position=position_jitter(.05))+
  stat_summary(fun.data = mean_cl_normal, geom = "errorbar", 
        width = 0.1, position=position_nudge(x = 0.15)) +
    stat_summary(fun.y = mean, geom = "point",
        size = 3, position=position_nudge(x = 0.15))+
  theme_bw()