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 guidelinesRISEprimGreen <-"#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 latercutoff_line <- RISEprimReddot_color <-"black"backg_color <- RISEprimGreenLight# set fontsize for all tablesr.fontsize <-15### first we pre-set our chosen cut-off values for some commonly used indices:msq_min <-0.7msq_max <-1.3zstd_min <--2zstd_max <-2loc_dep <-0.2# above average residual correlationdif_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 ZSTDjz =300# number to include in datasetyz =10# number of random samples### some commands exist in multiple packages, here we define preferred ones that are frequently usedselect <- dplyr::selectcount <- dplyr::countrecode <- car::recoderename <- dplyr::rename# import item informationdf.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 f78eaitems.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 outputkable_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")
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.
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?
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)
Trepte and Verbeet (2010); Strobl, Wickelmaier, and Zeileis (2011); Strobl, Kopf, and Zeileis (2015); Komboz, Zeileis, and Strobl (2018); Wickelmaier and Zeileis (2018)
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.
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.
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.
R Core Team. 2022. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
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.
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 SPIEGELStudentenpisa-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.
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.
---title: "Brott/kriminalitet"title-block-banner: "#009ca6"title-block-banner-color: "#FFFFFF"author: name: Magnus Johansson affiliation: RISE Research Institutes of Sweden affiliation-url: https://ri.se/shic orcid: 0000-0003-1669-592Xdate: last-modifiedformat: html: toc: true toc-depth: 4 toc-title: "Innehållsförteckning" embed-resources: true standalone: true page-layout: full logo: rise_logo_quarto.png mainfont: 'Lato' monofont: 'Roboto Mono' code-overflow: wrap code-tools: true code-fold: true number-sections: true #fig-dpi: 250 layout-align: left linestretch: 1.6 theme: materia pdf: papersize: a4 documentclass: article #article, report or book classoption: [twocolumn, portrait] revealjs: theme: default logo: rise_logo_quarto.png chalkboard: false self-contained: true# footer: 'Material skapat av magnus.p.johansson@ri.se' mainfont: 'Lato' slide-level: 4 scrollable: true smaller: falseexecute: echo: true warning: false message: false cache: trueeditor_options: markdown: wrap: 72 chunk_output_type: inlinebibliography: grateful-refs.bib---```{r}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 guidelinesRISEprimGreen <-"#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 latercutoff_line <- RISEprimReddot_color <-"black"backg_color <- RISEprimGreenLight# set fontsize for all tablesr.fontsize <-15### first we pre-set our chosen cut-off values for some commonly used indices:msq_min <-0.7msq_max <-1.3zstd_min <--2zstd_max <-2loc_dep <-0.2# above average residual correlationdif_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 ZSTDjz =300# number to include in datasetyz =10# number of random samples### some commands exist in multiple packages, here we define preferred ones that are frequently usedselect <- dplyr::selectcount <- dplyr::countrecode <- car::recoderename <- dplyr::rename# import item informationdf.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 f78eaitems.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)``````{r}#| label: setup#| code-fold: false#| include: false### set up color palette based on RISE guidelinesRISEprimGreen <-"#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 latercutoff_line <- RISEprimReddot_color <-"black"backg_color <- RISEprimGreenLight# set fontsize for all tablesr.fontsize <-15### first we pre-set our chosen cut-off values for some commonly used indices:msq_min <-0.7msq_max <-1.3zstd_min <--2zstd_max <-2loc_dep <-0.2# above average residual correlationdif_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 ZSTDjz =300# number to include in datasetyz =10# number of random samplesdf <- df.all %>%select(itemlabels$itemnr,Kön,ARSKURS,ar,SkolSDO)# create dataframe with 2014 data with all variables (post recode)df.2014<- df %>%filter(ar ==2014) %>%na.omit()df.all.years<-dfdf.omit.na <- df.2014df.omit.na$ar <-NULL# create DIF variables for gender and gradedif.gender <- df.omit.na$Köndf.omit.na$Kön <-NULLdif.arskurs <- df.omit.na$ARSKURSdf.omit.na$ARSKURS <-NULLdif.stadsdel <- df.omit.na$SkolSDOdf.omit.na$SkolSDO <-NULL# prepare for dif between yearsdf.dif.years <- df.all.years %>%select(!Kön,!ARSKURS,!SkolSDO) %>%na.omit()```## Beskrivning frågorFrå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ångerDe 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.```{r}itemlabels %>%kbl(booktabs = T, escape = F) %>%# bootstrap options are for HTML outputkable_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")```### Svarsbortfall```{r}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å.```{r}df.omit.na <-na.omit(df.1418)dif.gender <- df.omit.na$Köndf.omit.na$Kön <-NULLdif.arskurs <- df.omit.na$ARSKURSdf.omit.na$ARSKURS <-NULLdif.stadsdel <- df.omit.na$SkolSDOdf.omit.na$SkolSDO <-NULL```Vi har `r nrow(df.omit.na)` respondenter med kompletta svar från 2014 och 2018 (`r nrow(df.1418)-nrow(df.omit.na)` 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.## Deskriptiva data### Demografi```{r}#| label: descriptives1#| layout-ncol: 3RIdemographics(dif.gender, "Kön")RIdemographics(dif.arskurs, "Årskurs")#RIdemographics(dif.stadsdel, "Stadsdel")```### Item-data:::: column-page-inset-left::: panel-tabset#### Tile plot```{r}#| label: descriptives2RItileplot(df.omit.na)```#### Barplots {.scrollable}```{r}#| label: alt-descriptives#| layout-ncol: 2RIbarplot(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ångerVi 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.```{r}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.```{r}df.f75 <- df.omit.na %>%select(all_of(items.brott))```### Analys av svarskategorier f75```{r}#| include: falsemirt.rasch <-mirt(df.f75, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}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.```{r}for (i in items.brott){ df.f75[[i]] <-recode(df.omit.na[[i]],"2:4=1")}RItileplot(df.f75)```## Rasch-analys 1 - f75```{r}#| column: marginRIlistItemsMargin(df.f75, fontsize =11)```:::: column-page-inset-left::: panel-tabset### Item fit```{r}RIitemfitRM(df.f75, 500, 10)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.f75)```### Loadings 1st contrast```{r}RIloadLoc(na.omit(df.f75))```### Residualkorrelationer```{r}RIresidcorr(df.f75, cutoff =0.2)```### Targeting```{r}#| fig-height: 7RItargeting(df.f75, dich =TRUE)```### Itemhierarki```{r}#| fig-height: 7df.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.## Invarians/DIF### Kön```{r}#| column: marginRIlistItemsMargin(df.f75, 13)```:::: column-page-inset-left::: panel-tabset#### Tabell```{r}#| fig-height: 3RIdifTableRM(df.f75, dif.gender)```#### Figur item ```{r}RIdifFigureRM(df.f75, dif.gender)```:::::::Höga nivåer av DIF mellan kön för de flesta items.### Årskurs```{r}#| column: marginRIlistItemsMargin(df.f75, 13)```:::: column-page-inset-left::: panel-tabset#### Tabell```{r}#| fig-height: 3RIdifTableRM(df.f75, dif.arskurs)```#### Figur item ```{r}RIdifFigureRM(df.f75, dif.arskurs)```:::::::"Använt annans/falsk legitimation" och "Stulit en bil" skiljer sig mellan årskurserna.## Visualisering### Utsatt för brott```{r}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"))``````{r}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)```### Uppdelat på kön```{r}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)```### Uppdelat på årskurs```{r}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) %>%rename(Årskurs = 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)```### Årskurs och kön```{r}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) %>%rename(Årskurs = 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)```## Programvara som använts```{r}#| label: packagesvpkgs <-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%"')```## Referenser