11  Brott/kriminalitet

Author
Affiliation
Magnus Johansson
Published

February 8, 2023

Code
library(arrow)
library(ggrepel)
library(car)
library(grateful) # devtools::install_github("Pakillo/grateful")
library(kableExtra)
library(readxl)
library(tidyverse)
library(eRm)
library(mirt)
library(psych)
library(ggplot2)
library(psychotree)
library(matrixStats)
library(reshape)
library(knitr)
library(cowplot)
library(formattable) 
library(RISEkbmRasch) # devtools::install_github("pgmj/RISEkbmRasch")
library(glue)
library(foreach)

### set up color palette based on RISE guidelines
RISEprimGreen <- "#009ca6"
RISEprimRed <- "#e83c63"
RISEprimYellow <- "#ffe500"
RISEprimGreenMid <- "#8dc8c7"
RISEprimRedMid <- "#f5a9ab"
RISEprimYellowMid <- "#ffee8d"
RISEprimGreenLight <- "#ebf5f0"
RISEprimRedLight <- "#fde8df"
RISEprimYellowLight <- "#fff7dd"
RISEcompPurple <- "#482d55"
RISEcompGreenDark <- "#0e4e65"
RISEgrey1 <- "#f0f0f0"
RISEgrey2 <- "#c8c8c8"
RISEgrey3 <- "#828282"
RISEgrey4 <- "#555555"

# set some colors used later
cutoff_line <- RISEprimRed
dot_color <- "black"
backg_color <- RISEprimGreenLight

# set fontsize for all tables
r.fontsize <- 15

### first we pre-set our chosen cut-off values for some commonly used indices:
msq_min <- 0.7
msq_max <- 1.3
zstd_min <- -2
zstd_max <- 2
loc_dep <- 0.2 # above average residual correlation
dif_dif <- 0.5 # logits difference between groups in average item location (DIF)

### zstd is inflated with large samples (N > 500). Reduce sample size to jz and 
### run analysis yz random samples to get average ZSTD
jz = 300 # number to include in dataset
yz = 10 # number of random samples


### some commands exist in multiple packages, here we define preferred ones that are frequently used
select <- dplyr::select
count <- dplyr::count
recode <- car::recode
rename <- dplyr::rename
# import item information

df.all <- read_parquet("../../data/2022-09-18 sthlmsenkat recoded responses.parquet")

df <- df.all

# brott, items f75a till s, samt fråga 77 i PDF
# "Hur många gånger har du gjort följande saker under de senaste 12 månaderna?"

items.brott <- df %>% 
  select(starts_with("f75")) %>% 
  names()

for (i in items.brott) {
  df[[i]] <- recode(df[[i]],"'Ingen gång'=0;
                    '1-2 gånger'=1;
                    '3-5 gånger'=2;
                    '6-10 gånger'=3;
                    'Mer än 10 gånger'=4",
                    as.factor = FALSE)
}

# utsatt för brott, 80 i PDF, f78aa till f78ea

items.brott2 <- df %>% 
  select(starts_with("f78")) %>% 
  select(ends_with("a")) %>% 
  names()

for (i in items.brott2) {
  df[[i]] <- recode(df[[i]],"'Nej'=0;
                    'Ja, antal gånger'=1",
                    as.factor = FALSE)
}

itemlabels<-read_excel("BrottItemlabels.xls")

# create dataframe with 2014 and 2020 data with all variables (post recode)
df.1418 <- df %>% 
  filter(ar %in% c(2014,2018)) %>% 
  select(itemlabels$itemnr,Kön,ARSKURS,SkolSDO)

11.1 Beskrivning frågor

Frågorna i detta avsnitt är i datafilen betecknade som f75a till och med s (19 frågor, nr 77 i PDF med frågor), samt f77aa till ea (5 frågor, nr 80 i PDF). Den första sektionen fokuserar på hur ofta respondenten begått olika brott, medan den andra sektionen fokuserar på huruvida respondenten blivit utsatt för brott.

Frågorna f75a-s inleds med “Hur många gånger har du gjort följande saker under de senaste 12 månaderna?”

Svarsalternativen är

  • Ingen gång
  • 1-2 gånger
  • 3-5 gånger
  • 6-10 gånger
  • Mer än 10 gånger

De kodas om som siffror 0-5, där 0 = “Ingen gång”.

Denna typ av frekvensskattningar med så många svarsalternativ brukar sällan ge psykometriskt meningsfull information, d.v.s. det är inte tillräckligt stor skillnad på de olika svarsalternativen för att var och en av kategorierna ska bidra med mera information om respondenten. Vi kommer med största sannolikhet behöva slå samman flera av dem för att kunna göra en rimlig analys.

Frågorna f77a-e inleds med “Har du varit med om något av följande under de senaste 12 månaderna?”

Svarsalternativen är “Nej” eller “Ja ….. antal gånger”, med följdfråga på “Ja” som är “Anmälde du detta till polisen”. Vi kommer inte titta på följdfrågorna i denna analys.

För denna analys är inte målsättningen att undersöka möjligheten att ta fram ett eller flera indexvärden utifrån sammansättningar av items/frågor som sedan kan användas på samtliga deltagare. Detta beror på att de flesta har såpass liten användning av substanser eller ens har svarat på frågorna. Däremot vill vi se hur frågorna fungerar relativt varandra (item-hierarki) och om det skiljer sig mellan kön, årskurs och över tid.

Code
itemlabels %>% 
  kbl(booktabs = T, escape = F) %>%
      # bootstrap options are for HTML output
      kable_styling(bootstrap_options = c("striped", "hover"), 
                    position = "left",
                    full_width = F,
                    font_size = r.fontsize,
                    fixed_thead = T) %>% # when there is a long list in the table
      #  column_spec(c(2:3), color = "red") %>% 
      row_spec(1:19, bold = F, color = "black", background = "lightblue") %>% 
      row_spec(20:24, bold = F, color = "white", background = RISEprimGreen) %>%
      column_spec(1, bold = T) %>% 
      kable_classic(html_font = "Lato")
itemnr item
f75a Snattat?
f75b Klottrat/olaglig graffiti?
f75c Stulit en cykel?
f75d Stulit en moped eller motorcykel?
f75e Stulit en bil?
f75f Tvingat någon att ge dig pengar, mobiltelefon eller något annat värdefullt?
f75g Med avsikt förstört saker som inte var dina (t.ex. Fönsterrutor, gatlampor, cyklar)?
f75h Använt annans/falsk legitimation?
f75i Tagit pengar hemma som inte var dina?
f75j Smitit från betalning (t.ex. bio
f75k Tvingat någon att ha sex med dig?
f75l Stulit ur någons ficka?
f75m Stulit något annat som vi inte frågat om?
f75n Köpt något som du vet var stulet?
f75o Sålt något som var stulet?
f75p Tjuvåkt på tunnelbanan eller pendeltåget?
f75q Gjort inbrott i bil, affär, kiosk eller annan byggnad?
f75r Med avsikt slagit någon så att du tror eller vet att han/hon behövde sjukvård?
f75s Burit vapen (t.ex. kniv eller knogjärn)?
f78aa Känt dig allvarligt hotad?
f78ba Blivit rånad?
f78ca Blivit bestulen?
f78da Blivit misshandlad?
f78ea Blivit tvingad till sex/våldtagen?

11.1.1 Svarsbortfall

Code
df.1418 %>%
  select(itemlabels$itemnr) %>% 
  t() %>% 
  as.data.frame() %>% 
  mutate(Missing = rowSums(is.na(.))) %>% 
  select(Missing) %>% 
  arrange(desc(Missing)) %>% 
  rownames_to_column(var = "Item") %>% 
  mutate(Percentage = Missing/nrow(df)*100) %>% 
  mutate(Item = factor(Item, levels = rev(Item))) %>%
  ggplot(aes(x = Item, y = Percentage)) +
  geom_col() +
  coord_flip() +
  ggtitle("Missing data per item") +
  xlab("Items") +
  ylab("Percentage of responses missing")

Det är låg nivå av bortfall på itemnivå.

Code
df.omit.na <- na.omit(df.1418)

dif.gender <- df.omit.na$Kön
df.omit.na$Kön <- NULL
dif.arskurs <- df.omit.na$ARSKURS
df.omit.na$ARSKURS <- NULL
dif.stadsdel <- df.omit.na$SkolSDO
df.omit.na$SkolSDO <- NULL

Vi har 16963 respondenter med kompletta svar från 2014 och 2018 (7530 har filtrerats bort p.g.a. saknade svar). Att vi valt att ta med två år är för att säkerställa att det finns tillräcklig variation i data.

11.2 Deskriptiva data

11.2.1 Demografi

Code
RIdemographics(dif.gender, "Kön")
RIdemographics(dif.arskurs, "Årskurs")
#RIdemographics(dif.stadsdel, "Stadsdel")
Kön n Percent
Flicka 9053 53.4
Pojke 7910 46.6
Årskurs n Percent
Åk 9 8082 47.6
Gy 2 8881 52.4

11.2.2 Item-data

Code
RItileplot(df.omit.na)

Code
RIbarplot(df.omit.na)

Som väntat extremt skeva svarsfördelningar.

Svarsalternativen för f75-frågorna är:

  • Ingen gång
  • 1-2 gånger
  • 3-5 gånger
  • 6-10 gånger
  • Mer än 10 gånger

Vi kan prova att slå samman de tre högsta, så vi får tre kategorier för samtliga frågor, innan vi går vidare till Rasch-analysen.

Code
for (i in items.brott){
  df.omit.na[[i]] <- recode(df.omit.na[[i]],"3:4=2")
}
RItileplot(df.omit.na)

Vi tittar på f75-frågorna först.

Code
df.f75 <- df.omit.na %>% 
  select(all_of(items.brott))

11.2.3 Analys av svarskategorier f75

Code
plot(mirt.rasch, type="trace")

Det fungerar inte med tre kategorier. Vi slår samman alla kategorier över 0, så det blir en helt dikotom modell.

Code
for (i in items.brott){
  df.f75[[i]] <- recode(df.omit.na[[i]],"2:4=1")
}
RItileplot(df.f75)

11.3 Rasch-analys 1 - f75

Code
RIlistItemsMargin(df.f75, fontsize = 11)
itemnr item
f75a Snattat?
f75b Klottrat/olaglig graffiti?
f75c Stulit en cykel?
f75d Stulit en moped eller motorcykel?
f75e Stulit en bil?
f75f Tvingat någon att ge dig pengar, mobiltelefon eller något annat värdefullt?
f75g Med avsikt förstört saker som inte var dina (t.ex. Fönsterrutor, gatlampor, cyklar)?
f75h Använt annans/falsk legitimation?
f75i Tagit pengar hemma som inte var dina?
f75j Smitit från betalning (t.ex. bio
f75k Tvingat någon att ha sex med dig?
f75l Stulit ur någons ficka?
f75m Stulit något annat som vi inte frågat om?
f75n Köpt något som du vet var stulet?
f75o Sålt något som var stulet?
f75p Tjuvåkt på tunnelbanan eller pendeltåget?
f75q Gjort inbrott i bil, affär, kiosk eller annan byggnad?
f75r Med avsikt slagit någon så att du tror eller vet att han/hon behövde sjukvård?
f75s Burit vapen (t.ex. kniv eller knogjärn)?
Code
RIitemfitRM(df.f75, 500, 10)
OutfitMSQ InfitMSQ OutfitZSTD InfitZSTD
f75a 0.825 0.867 -1.606 -1.787
f75b 0.786 0.949 -1.288 -0.614
f75c 0.498 0.801 -1.888 -1.209
f75d 0.279 0.675 -1.411 -0.858
f75e 0.322 0.709 -0.508 -0.627
f75f 0.506 0.705 -0.981 -0.776
f75g 0.543 0.76 -2.46 -1.871
f75h 1.276 1.177 0.89 1.13
f75i 1.419 1.101 4.144 1.504
f75j 0.625 0.876 -1.538 -0.886
f75k 0.907 0.936 -0.058 0.001
f75l 0.352 0.77 -1.417 -0.916
f75m 0.594 0.839 -1.871 -1.204
f75n 0.734 0.897 -0.586 -0.573
f75o 0.333 0.729 -0.87 -1.203
f75p 1.617 0.922 2.361 -1.087
f75q 0.605 0.806 -0.785 -0.462
f75r 0.678 0.863 -0.551 -0.45
f75s 0.857 0.908 -0.453 -0.78
Code
RIpcmPCA(df.f75)
PCA of Rasch model residuals
Eigenvalues
1.46
1.31
1.17
1.16
1.14
Code
RIloadLoc(na.omit(df.f75))

Code
RIresidcorr(df.f75, cutoff = 0.2)
f75a f75b f75c f75d f75e f75f f75g f75h f75i f75j f75k f75l f75m f75n f75o f75p f75q f75r f75s
f75a
f75b -0.03
f75c -0.02 -0.03
f75d -0.06 -0.05 0.2
f75e -0.08 -0.03 0.06 0.35
f75f -0.07 -0.05 -0.02 0.19 0.22
f75g -0.05 0.02 0.03 -0.02 -0.04 0
f75h -0.1 -0.09 -0.08 -0.06 0.02 -0.05 -0.13
f75i -0.06 -0.08 -0.14 -0.13 -0.08 -0.05 -0.13 -0.06
f75j 0 -0.07 -0.04 -0.04 -0.01 0 -0.03 -0.01 -0.05
f75k -0.06 0.01 0 0.11 0.19 0.16 -0.01 0.03 -0.01 0.03
f75l -0.04 -0.05 -0.02 0.09 0.12 0.15 0.02 -0.07 -0.03 0.01 0.15
f75m 0.01 -0.08 -0.06 -0.02 -0.03 0.02 0.02 -0.13 -0.04 -0.03 -0.01 0.1
f75n -0.09 -0.09 0.04 0.01 -0.01 -0.01 -0.03 -0.06 -0.17 -0.06 -0.08 -0.04 -0.05
f75o -0.06 -0.11 0.06 0.13 0.04 0.05 0 -0.09 -0.17 -0.03 -0.08 0.01 0 0.25
f75p -0.11 -0.08 -0.07 -0.07 -0.08 -0.05 -0.07 -0.08 -0.14 -0.05 -0.06 -0.05 -0.08 -0.05 -0.04
f75q -0.06 -0.03 0 0.08 0.11 0.07 0 -0.09 -0.11 -0.03 -0.03 0.01 0.01 -0.01 0.07 -0.02
f75r -0.1 -0.05 -0.02 0.06 0.12 0.1 -0.01 -0.04 -0.11 -0.05 0.02 -0.01 -0.06 0.03 0.05 -0.03 0.06
f75s -0.11 -0.02 -0.05 -0.03 -0.04 -0.02 0.02 -0.11 -0.16 -0.09 -0.05 -0.04 -0.03 0.01 0.05 -0.08 0.05 0.07
Note:
Relative cut-off value (highlighted in red) is 0.183, which is 0.2 above the average correlation.
Code
RItargeting(df.f75, dich = TRUE)

Code
df.erm <- RM(df.f75)
plotPImap(df.erm, sorted = T)

Item f75p (tjuvåkt på tunnelbana/pendeltåg) verkar inte passa in bland de övriga frågorna.

Ett antal kluster av residualkorrelationer, bl.a. mellan olika typer av stöld, och köpt/sålt stöldgods.

Att Outfit MSQ visar på problem är inte oväntat när vi har en sådan klar majoritet som svarar 0 på frågorna och MSQ är oviktad. I denna analys är ZSTD betydligt mera viktig att titta på.

Vi går dock inte vidare och gör några åtgärder, utan tittar i stället på invarians/DIF.

11.4 Invarians/DIF

11.4.1 Kön

Code
RIlistItemsMargin(df.f75, 13)
itemnr item
f75a Snattat?
f75b Klottrat/olaglig graffiti?
f75c Stulit en cykel?
f75d Stulit en moped eller motorcykel?
f75e Stulit en bil?
f75f Tvingat någon att ge dig pengar, mobiltelefon eller något annat värdefullt?
f75g Med avsikt förstört saker som inte var dina (t.ex. Fönsterrutor, gatlampor, cyklar)?
f75h Använt annans/falsk legitimation?
f75i Tagit pengar hemma som inte var dina?
f75j Smitit från betalning (t.ex. bio
f75k Tvingat någon att ha sex med dig?
f75l Stulit ur någons ficka?
f75m Stulit något annat som vi inte frågat om?
f75n Köpt något som du vet var stulet?
f75o Sålt något som var stulet?
f75p Tjuvåkt på tunnelbanan eller pendeltåget?
f75q Gjort inbrott i bil, affär, kiosk eller annan byggnad?
f75r Med avsikt slagit någon så att du tror eller vet att han/hon behövde sjukvård?
f75s Burit vapen (t.ex. kniv eller knogjärn)?
Code
RIdifTableRM(df.f75, dif.gender)

Item 2 3 Mean location StDev MaxDiff
f75a -2.137 -1.629 -1.883 0.359 0.508
f75b -1.051 -0.630 -0.840 0.297 0.420
f75c 0.107 -0.290 -0.091 0.281 0.397
f75d 1.973 1.295 1.634 0.479 0.678
f75e 2.407 1.926 2.167 0.340 0.481
f75f 1.973 1.570 1.771 0.285 0.403
f75g -0.538 -1.074 -0.806 0.379 0.536
f75h -1.311 -0.020 -0.666 0.913 1.291
f75i -3.022 -1.797 -2.409 0.867 1.226
f75j -0.336 -0.065 -0.201 0.192 0.272
f75k 2.307 2.707 2.507 0.283 0.401
f75l 1.346 1.400 1.373 0.039 0.055
f75m -0.444 -0.142 -0.293 0.214 0.302
f75n 0.242 -0.259 -0.008 0.354 0.501
f75o 0.956 0.367 0.661 0.416 0.588
f75p -4.793 -4.112 -4.453 0.482 0.682
f75q 1.451 0.854 1.152 0.422 0.597
f75r 1.317 0.833 1.075 0.342 0.484
f75s -0.444 -0.935 -0.690 0.347 0.491
Code
RIdifFigureRM(df.f75, dif.gender)

Höga nivåer av DIF mellan kön för de flesta items.

11.4.2 Årskurs

Code
RIlistItemsMargin(df.f75, 13)
itemnr item
f75a Snattat?
f75b Klottrat/olaglig graffiti?
f75c Stulit en cykel?
f75d Stulit en moped eller motorcykel?
f75e Stulit en bil?
f75f Tvingat någon att ge dig pengar, mobiltelefon eller något annat värdefullt?
f75g Med avsikt förstört saker som inte var dina (t.ex. Fönsterrutor, gatlampor, cyklar)?
f75h Använt annans/falsk legitimation?
f75i Tagit pengar hemma som inte var dina?
f75j Smitit från betalning (t.ex. bio
f75k Tvingat någon att ha sex med dig?
f75l Stulit ur någons ficka?
f75m Stulit något annat som vi inte frågat om?
f75n Köpt något som du vet var stulet?
f75o Sålt något som var stulet?
f75p Tjuvåkt på tunnelbanan eller pendeltåget?
f75q Gjort inbrott i bil, affär, kiosk eller annan byggnad?
f75r Med avsikt slagit någon så att du tror eller vet att han/hon behövde sjukvård?
f75s Burit vapen (t.ex. kniv eller knogjärn)?
Code
RIdifTableRM(df.f75, dif.arskurs)

Item 2 3 Mean location StDev MaxDiff
f75a -2.062 -1.616 -1.839 0.315 0.445
f75b -0.924 -0.654 -0.789 0.191 0.271
f75c -0.213 -0.037 -0.125 0.124 0.176
f75d 1.453 1.560 1.507 0.076 0.108
f75e 2.424 1.753 2.088 0.475 0.671
f75f 1.683 1.739 1.711 0.040 0.056
f75g -1.035 -0.639 -0.837 0.281 0.397
f75h 0.685 -1.416 -0.366 1.486 2.101
f75i -2.600 -2.221 -2.410 0.268 0.380
f75j -0.107 -0.214 -0.160 0.076 0.107
f75k 2.854 2.367 2.610 0.345 0.487
f75l 1.303 1.537 1.420 0.165 0.234
f75m -0.423 -0.037 -0.230 0.273 0.386
f75n -0.060 -0.079 -0.069 0.013 0.019
f75o 0.423 0.757 0.590 0.237 0.335
f75p -4.581 -4.273 -4.427 0.218 0.308
f75q 1.037 1.063 1.050 0.019 0.027
f75r 0.962 1.047 1.004 0.060 0.085
f75s -0.818 -0.639 -0.728 0.127 0.179
Code
RIdifFigureRM(df.f75, dif.arskurs)

“Använt annans/falsk legitimation” och “Stulit en bil” skiljer sig mellan årskurserna.

11.5 Visualisering

11.5.1 Utsatt för brott

Code
items.utsatt <- df %>% 
  select(starts_with("f78")) %>% 
  names()

SEutsatt <- function(i) {
  df %>%
    group_by(ar,.data[[i]]) %>%
    summarise(n = n()) %>%
    mutate(Procent = round(100 * n / sum(n), 1)) %>% 
    ungroup() %>% 
    add_column(Item = as.character(i)) %>% 
    rename(respons = as.character(i))
}

df.utsatt <- rbind(SEutsatt("f78aa"),
                   SEutsatt("f78ba"),
                   SEutsatt("f78ca"),
                   SEutsatt("f78da"),
                   SEutsatt("f78ea"))
Code
utsatt.legend <- c("Allvarligt hotad","Rånad","Bestulen","Misshandlad","Tvingad till sex")
RISEpalette1 <- colorRampPalette(colors = c("#009ca6", "#e83c63", "#ffe500"))(6)
library(ggiraph)

fig1 <- df.utsatt %>% 
  filter(respons == 1) %>% 
  ggplot(aes(y = Procent, x = factor(ar), group = Item, color = Item)) +
  geom_point_interactive(aes(tooltip = Procent),
                         size = 3) +
  geom_line(linewidth = 1.2) +
  scale_color_manual(labels = utsatt.legend, values = RISEpalette1) +
  xlab("Årtal")

girafe(ggobj = fig1)

11.5.2 Uppdelat på kön

Code
SEutsattG <- function(i) {
  df %>%
    filter(Kön %in% c("Pojke","Flicka")) %>% 
    group_by(ar,Kön,.data[[i]]) %>%
    summarise(n = n()) %>%
    mutate(Procent = round(100 * n / sum(n), 1)) %>% 
    ungroup() %>% 
    add_column(Item = as.character(i)) %>% 
    rename(respons = as.character(i))
}

df.utsattG <- rbind(SEutsattG("f78aa"),
                   SEutsattG("f78ba"),
                   SEutsattG("f78ca"),
                   SEutsattG("f78da"),
                   SEutsattG("f78ea"))

fig2 <- df.utsattG %>% 
  filter(respons == 1) %>% 
  ggplot(aes(y = Procent, x = factor(ar), group = Item, color = Item)) +
  geom_point_interactive(aes(tooltip = Procent),
                         size = 3) +
  geom_line(linewidth = 1.2) +
  scale_color_manual(labels = utsatt.legend, values = RISEpalette1) +
  xlab("Årtal") +
  facet_wrap(~Kön)

girafe(ggobj = fig2)

11.5.3 Uppdelat på årskurs

Code
SEutsattÅK <- function(i) {
  df %>%
    filter(Kön %in% c("Pojke","Flicka")) %>% 
    group_by(ar,ARSKURS,.data[[i]]) %>%
    summarise(n = n()) %>%
    mutate(Procent = round(100 * n / sum(n), 1)) %>% 
    ungroup() %>% 
    add_column(Item = as.character(i)) %>% 
    rename(respons = as.character(i))
}

df.utsattÅK <- rbind(SEutsattÅK("f78aa"),
                   SEutsattÅK("f78ba"),
                   SEutsattÅK("f78ca"),
                   SEutsattÅK("f78da"),
                   SEutsattÅK("f78ea"))

fig3 <- df.utsattÅK %>% 
  filter(respons == 1) %>% 
  renamerskurs = ARSKURS) %>% 
  ggplot(aes(y = Procent, x = factor(ar), group = Item, color = Item)) +
  geom_point_interactive(aes(tooltip = Procent),
                         size = 3) +
  geom_line(linewidth = 1.2) +
  scale_color_manual(labels = utsatt.legend, values = RISEpalette1) +
  xlab("Årtal") +
  facet_wrap(~Årskurs)

girafe(ggobj = fig3)

11.5.4 Årskurs och kön

Code
SEutsattGÅ <- function(i) {
  df %>%
    filter(Kön %in% c("Pojke","Flicka")) %>% 
    group_by(ar,ARSKURS,Kön,.data[[i]]) %>%
    summarise(n = n()) %>%
    mutate(Procent = round(100 * n / sum(n), 1)) %>% 
    ungroup() %>% 
    add_column(Item = as.character(i)) %>% 
    rename(respons = as.character(i))
}

df.utsattGÅ <- rbind(SEutsattGÅ("f78aa"),
                   SEutsattGÅ("f78ba"),
                   SEutsattGÅ("f78ca"),
                   SEutsattGÅ("f78da"),
                   SEutsattGÅ("f78ea"))

df.utsattGÅ %>% 
  filter(respons == 1) %>% 
  renamerskurs = ARSKURS) %>% 
  ggplot(aes(y = Procent, x = factor(ar), group = Item, color = Item)) +
  geom_point(aes(tooltip = Procent),
                         size = 2) +
  geom_line(linewidth = 1) +
  scale_color_manual(labels = utsatt.legend, values = RISEpalette1) +
  xlab("Årtal") +
  facet_grid(Årskurs~Kön)

11.6 Programvara som använts

Code
pkgs <- cite_packages(cite.tidyverse = TRUE, 
                      output = "table",
                      bib.file = "grateful-refs.bib",
                      include.RStudio = TRUE)
formattable(pkgs, 
            table.attr = 'class=\"table table-striped\" style="font-size: 14px; font-family: Lato; width: 80%"')
Package Version Citation
arrow 10.0.0 Richardson et al. (2022)
base 4.2.2 R Core Team (2022)
car 3.1.1 Fox and Weisberg (2019)
cowplot 1.1.1 Wilke (2020)
eRm 1.0.2 Mair and Hatzinger (2007b); Mair and Hatzinger (2007a); Hatzinger and Rusch (2009); Rusch, Maier, and Hatzinger (2013); Koller, Maier, and Hatzinger (2015); Debelak and Koller (2019); Mair, Hatzinger, and Maier (2021)
foreach 1.5.2 Microsoft and Weston (2022)
formattable 0.2.1 Ren and Russell (2021)
ggiraph 0.8.4 Gohel and Skintzos (2022)
ggrepel 0.9.3 Slowikowski (2023)
glue 1.6.2 Hester and Bryan (2022)
grateful 0.1.11 Rodríguez-Sánchez, Jackson, and Hutchins (2022)
kableExtra 1.3.4 Zhu (2021)
knitr 1.42 Xie (2014); Xie (2015); Xie (2023)
matrixStats 0.63.0 Bengtsson (2022)
mirt 1.37.1 Chalmers (2012)
psych 2.2.9 Revelle (2022)
psychotree 0.16.0 Trepte and Verbeet (2010); Strobl, Wickelmaier, and Zeileis (2011); Strobl, Kopf, and Zeileis (2015); Komboz, Zeileis, and Strobl (2018); Wickelmaier and Zeileis (2018)
reshape 0.8.9 Wickham (2007)
RISEkbmRasch 0.1.12 Johansson (2023)
rmarkdown 2.20 Xie, Allaire, and Grolemund (2018); Xie, Dervieux, and Riederer (2020); Allaire et al. (2023)
tidyverse 2.0.0 Wickham et al. (2019)

11.7 Referenser

Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, and Richard Iannone. 2023. Rmarkdown: Dynamic Documents for r. https://github.com/rstudio/rmarkdown.
Bengtsson, Henrik. 2022. matrixStats: Functions That Apply to Rows and Columns of Matrices (and to Vectors). https://CRAN.R-project.org/package=matrixStats.
Chalmers, R. Philip. 2012. mirt: A Multidimensional Item Response Theory Package for the R Environment.” Journal of Statistical Software 48 (6): 1–29. https://doi.org/10.18637/jss.v048.i06.
Debelak, Rudolf, and Ingrid Koller. 2019. Testing the Local Independence Assumption of the Rasch Model With Q3-Based Nonparametric Model Tests.” Applied Psychological Measurement. https://doi.org/10.1177/0146621619835501.
Fox, John, and Sanford Weisberg. 2019. An R Companion to Applied Regression. Third. Thousand Oaks CA: Sage. https://socialsciences.mcmaster.ca/jfox/Books/Companion/.
Gohel, David, and Panagiotis Skintzos. 2022. Ggiraph: Make ’Ggplot2’ Graphics Interactive. https://CRAN.R-project.org/package=ggiraph.
Hatzinger, Reinhold, and Thomas Rusch. 2009. IRT models with relaxed assumptions in eRm: A manual-like instruction.” Psychology Science Quarterly 51.
Hester, Jim, and Jennifer Bryan. 2022. Glue: Interpreted String Literals. https://CRAN.R-project.org/package=glue.
Johansson, Magnus. 2023. RISEkbmRasch: Psychometric Analysis in r with Rasch Measurement Theory. https://github.com/pgmj/RISEkbmRasch.
Koller, Ingrid, Marco Johannes Maier, and Reinhold Hatzinger. 2015. An Empirical Power Analysis of Quasi-Exact Tests for the Rasch Model: Measurement Invariance in Small Samples.” Methodology 11. https://doi.org/10.1027/1614-2241/a000090.
Komboz, Basil, Achim Zeileis, and Carolin Strobl. 2018. “Tree-Based Global Model Tests for Polytomous Rasch Models.” Educational and Psychological Measurement 78 (1): 128–66. https://doi.org/10.1177/0013164416664394.
Mair, Patrick, and Reinhold Hatzinger. 2007a. CML based estimation of extended Rasch models with the eRm package in R.” Psychology Science 49.
———. 2007b. Extended Rasch modeling: The eRm package for the application of IRT models in R.” Journal of Statistical Software 20. https://www.jstatsoft.org/v20/i09.
Mair, Patrick, Reinhold Hatzinger, and Marco Johannes Maier. 2021. eRm: Extended Rasch Modeling. https://cran.r-project.org/package=eRm.
Microsoft, and Steve Weston. 2022. Foreach: Provides Foreach Looping Construct. https://CRAN.R-project.org/package=foreach.
R Core Team. 2022. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Ren, Kun, and Kenton Russell. 2021. Formattable: Create ’Formattable’ Data Structures. https://CRAN.R-project.org/package=formattable.
Revelle, William. 2022. Psych: Procedures for Psychological, Psychometric, and Personality Research. Evanston, Illinois: Northwestern University. https://CRAN.R-project.org/package=psych.
Richardson, Neal, Ian Cook, Nic Crane, Dewey Dunnington, Romain François, Jonathan Keane, Dragoș Moldovan-Grünfeld, Jeroen Ooms, and Apache Arrow. 2022. Arrow: Integration to ’Apache’ ’Arrow’. https://CRAN.R-project.org/package=arrow.
Rodríguez-Sánchez, Francisco, Connor P. Jackson, and Shaurita D. Hutchins. 2022. Grateful: Facilitate Citation of r Packages. https://github.com/Pakillo/grateful.
Rusch, Thomas, Marco Johannes Maier, and Reinhold Hatzinger. 2013. Linear logistic models with relaxed assumptions in R.” In Algorithms from and for Nature and Life, edited by Berthold Lausen, Dirk van den Poel, and Alfred Ultsch. Studies in Classification, Data Analysis, and Knowledge Organization. New York: Springer. https://doi.org/10.1007/978-3-319-00035-0_34.
Slowikowski, Kamil. 2023. Ggrepel: Automatically Position Non-Overlapping Text Labels with ’Ggplot2’. https://CRAN.R-project.org/package=ggrepel.
Strobl, Carolin, Julia Kopf, and Achim Zeileis. 2015. “Rasch Trees: A New Method for Detecting Differential Item Functioning in the Rasch Model.” Psychometrika 80 (2): 289–316. https://doi.org/10.1007/s11336-013-9388-3.
Strobl, Carolin, Florian Wickelmaier, and Achim Zeileis. 2011. “Accounting for Individual Differences in Bradley-Terry Models by Means of Recursive Partitioning.” Journal of Educational and Behavioral Statistics 36 (2): 135–53. https://doi.org/10.3102/1076998609359791.
Trepte, Sabine, and Markus Verbeet, eds. 2010. Allgemeinbildung in Deutschland – Erkenntnisse Aus Dem SPIEGEL Studentenpisa-Test. Wiesbaden: VS Verlag.
Wickelmaier, Florian, and Achim Zeileis. 2018. “Using Recursive Partitioning to Account for Parameter Heterogeneity in Multinomial Processing Tree Models.” Behavior Research Methods 50 (3): 1217–33. https://doi.org/10.3758/s13428-017-0937-z.
Wickham, Hadley. 2007. “Reshaping Data with the Reshape Package.” Journal of Statistical Software 21 (12). https://www.jstatsoft.org/v21/i12/.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Wilke, Claus O. 2020. Cowplot: Streamlined Plot Theme and Plot Annotations for ’Ggplot2’. https://CRAN.R-project.org/package=cowplot.
Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2023. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.
Zhu, Hao. 2021. kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax. https://CRAN.R-project.org/package=kableExtra.