Items i f60 inleds med texten: Har du känt dig mobbad eller trakasserad i skolan det här läsåret? (Markera med ett eller flera kryss)
Item f60a har enbart kryssruta för “Nej” och har därför tagits bort. Övriga items i f60 har också kryssrutor, vilket innebär att de antingen är förkryssade eller inte. Dessa har blivit kodade som 1 när ett svar är förkryssat, och 0 när kryss saknas.
Item F61 efterfrågar frekvens på mobbning/trakassering i skolan under läsåret, och har därför fler svarskategorier.
Eftersom det är relativt få respondenter i varje års mätning lägger vi samman 2012-2018 och får 5228 respondenter totalt.
Relative cut-off value (highlighted in red) is 0.179, which is 0.2 above the average correlation.
Code
RItargeting(df.omit.na)
Code
RIitemHierarchy(df.omit.na)
Code
plot(mirt.rasch, type="trace")
F61 har alldeles för låg item fit, och svarskategorierna fungerar dåligt.
Jag har inte blivit mobbad = 0
Det har hänt någon enstaka gång = 1
2 eller 3 gånger i månaden = 2
Ungefär en gång i veckan = 3
Flera gånger i veckan = 4
Vi kodar om F61 så att 3 och 4 = 2 och tittar sedan på item fit igen. Det är inte oväntat att en allmän fråga får låg item fit när den används tillsammans med mera specifika frågor inom samma område.
df.plot %>%filter(is.na(F63)) %>%group_by(ar) %>%count(Kön) %>%mutate(Andel =100* n /sum(n)) %>%ggplot(aes(x = ar, y = n, color = Kön)) +geom_point(size =2) +geom_line() +scale_color_viridis_d(begin =0.2, end =0.8) +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +ylab("Antal svar") +theme_minimal() +theme_rise()
Code
df.plot %>%filter(is.na(F63)) %>%filter(!is.na(Kön)) %>%group_by(ar) %>%count(Kön) %>%mutate(Andel =100* n /sum(n)) %>%ggplot(aes(x = ar, y = Andel, color = Kön)) +geom_point(size =2) +geom_line() +scale_color_viridis_d(begin =0.2, end =0.8) +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +scale_y_continuous(limits =c(0,100)) +ylab("Andel svar") +theme_minimal() +theme_rise()
Code
df.plot %>%filter(is.na(F63)) %>%filter(!is.na(SkolSDO)) %>%group_by(ar) %>%count(SkolSDO) %>%mutate(Andel =100* n /sum(n)) %>%ggplot(aes(x = ar, y = n, color = SkolSDO)) +geom_point(size =2) +geom_line() +scale_color_viridis_d() +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +ylab("Antal svar") +theme_minimal() +theme_rise()
Code
df.plot %>%filter(is.na(F63)) %>%group_by(ar) %>%count(SkolSDO) %>%mutate(Andel =100* n /sum(n)) %>%ggplot(aes(x = ar, y = Andel, color = SkolSDO)) +geom_point(size =2) +geom_line() +scale_color_viridis_d(begin =0.2, end =0.8) +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +ylab("Andel svar") +theme_minimal() +theme_rise()
Inget tydligt mönster framgår.
9.5.2 Stapeldiagram
Motsvarar det som Länsstyrelsen får från Origo.
Code
# df.plot <- df %>% # filter(DIDkommun == "Vallentuna") %>% # select(starts_with("f60"),F63,ar,Kön,ARSKURS)RISEpalette1 <-colorRampPalette(colors =c("#009ca6", "#e83c63", "#ffe500"))(6)df.mobbad <- df.plot %>%mutate(mobbad =case_when(f60b ==1~"Jag har blivit hånad, förlöjligad, kallad öknamn eller blivit retad på ett obehagligt och sårande sätt", f60c ==1~"Jag har blivit utfrusen av andra elever", f60d ==1~"Jag har blivit slagen, sparkad, knuffad eller stängd inne", f60e ==1~"Någon elev har spritt lögner eller falska rykten om mig och försökt få andra att tycka illa om mig", f60f ==1~"Jag har blivit fråntagen pengar eller saker eller fått saker förstörda", f60g ==1~"Jag har blivit hotad eller tvingad att göra saker som jag inte ville göra", f60h ==1~"Lärare har psykat eller på annat sätt varit elaka mot mig", f60i ==1~"Jag har mobbats på annat sätt.", F63 ==1~"Har du blivit mobbad eller trakasserad via internet eller SMS/MMS det här läsåret?", f60a ==1~"Nej",TRUE~NA )) %>%mutate(mobbad =factor(mobbad))df.mobbadG <- df.mobbad %>%filter(ar ==2022,!is.na(Kön)) %>%group_by(Kön) %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%mutate(mobbad =fct_reorder(mobbad, desc(n)))df.mobbadAlla <- df.mobbad %>%filter(ar ==2022) %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%mutate(mobbad =fct_reorder(mobbad, desc(n)))nejMedel <- df.mobbadAlla %>%filter(mobbad =='Nej') %>%pull(Andel) %>%round(1)nejMedelÅk9 <- df.mobbad %>%filter(ar ==2022,!is.na(Kön), ARSKURS =="Åk 9") %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%filter(mobbad =='Nej') %>%pull(Andel) %>%round(1)nejMedelGy2 <- df.mobbad %>%filter(ar ==2022,!is.na(Kön), ARSKURS =="Gy 2") %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%filter(mobbad =='Nej') %>%pull(Andel) %>%round(1)
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, Christophe Dervieux, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, et al. 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. 2023. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Richardson, Neal, Ian Cook, Nic Crane, Dewey Dunnington, Romain François, Jonathan Keane, Dragoș Moldovan-Grünfeld, Jeroen Ooms, and Apache Arrow. 2023. 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.
William Revelle. 2023. Psych: Procedures for Psychological, Psychometric, and Personality Research. Evanston, Illinois: Northwestern University. https://CRAN.R-project.org/package=psych.
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: "Mobbning i skolan"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: 3 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: report #article, report or book classoption: [onecolumn, portrait] revealjs: theme: default logo: rise_logo_quarto.png chalkboard: true embed-resources: false footer: 'Material skapat av magnus.p.johansson@ri.se' mainfont: 'Lato' slide-level: 4 scrollable: true smaller: trueexecute: echo: true warning: false message: false cache: trueeditor_options: markdown: wrap: 72 chunk_output_type: consolebibliography: grateful-refs.bib---```{r}#| label: setup#| include: falselibrary(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)### some commands exist in multiple packages, here we define preferred ones that are frequently usedselect <- dplyr::selectcount <- dplyr::countrecode <- car::recoderename <- dplyr::rename### 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"# import item informationitemlabels <-read.csv("../../data/MOBBNINGitemlabels.csv", fileEncoding ="UTF-8")# import recoded datadf.all <-read_parquet("../../data/2022-09-18 sthlmsenkat recoded responses.parquet")# filter relevant variablesdf <- df.all %>%select(starts_with("f60"),F61,F63,ar,Kön,ARSKURS,SkolSDO)# create dataframe with 2014 data with all variables (post recode)df.2014<- df %>%filter(ar %in%c(2012,2014,2016,2018)) %>%na.omit()df.all.years <-na.omit(df)df.omit.na <- df.2014df.omit.na$ar <-NULLdf.omit.na$f60a <-NULL# enbart svaret "Nej"# 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.SkolSDO <- df.omit.na$SkolSDOdf.omit.na$SkolSDO <-NULL# prepare for dif between yearsdf.dif.years <- df.all.years %>%select(!Kön,!ARSKURS,!SkolSDO)dif.year <- df.dif.years$ardf.dif.years$ar <-NULL# df.dif.years can later be used for DIF analysis of years```Items i f60 inleds med texten:*Har du känt dig mobbad eller trakasserad i skolan det här läsåret? (Markera med ett eller flera kryss)*Item f60a har enbart kryssruta för "Nej" och har därför tagits bort. Övriga items i f60 har också kryssrutor, vilket innebär att de antingen är förkryssade eller inte. Dessa har blivit kodade som 1 när ett svar är förkryssat, och 0 när kryss saknas.Item F61 efterfrågar frekvens på mobbning/trakassering i skolan under läsåret, och har därför fler svarskategorier.Eftersom det är relativt få respondenter i varje års mätning lägger vi samman 2012-2018 och får `r nrow(df.omit.na)` respondenter totalt.## Deskriptiva data### Demografi```{r}#| label: descriptives1#| layout-ncol: 2RIdemographics(dif.gender, "Kön")RIdemographics(dif.arskurs, "Årskurs")```### Item-data```{r}RIlistItemsMargin(df.omit.na, "12")```:::: column-page-inset-left::: panel-tabset#### Tile plot```{r}#| label: descriptives2RItileplot(df.omit.na)```#### Stacked bars```{r}#| label: stack1RIbarstack(df.omit.na)```#### Barplots {.scrollable}```{r}#| label: alt-descriptives#| layout-ncol: 2RIbarplot(df.omit.na)```:::::::## Rasch-analys 1Eftersom vi har en blandning av dikotoma och polytoma (fler än 2 svarskategorier) använder vi Partial Credit Model.```{r}#| column: marginRIlistItemsMargin(df.omit.na, fontsize =13)```:::: column-page-inset-left::: panel-tabset### Item fit```{r}RIitemfitPCM2(df.omit.na, 300, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.omit.na)```### Loadings 1st contrast```{r}RIloadLoc(df.omit.na)```### Residualkorrelationer```{r}RIresidcorr(df.omit.na, cutoff =0.2)```### Targeting```{r}#| fig-height: 5RItargeting(df.omit.na)```### Itemhierarki```{r}#| fig-height: 6RIitemHierarchy(df.omit.na)```### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.omit.na, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```:::::::F61 har alldeles för låg item fit, och svarskategorierna fungerar dåligt.- Jag har inte blivit mobbad = 0- Det har hänt någon enstaka gång = 1 - 2 eller 3 gånger i månaden = 2- Ungefär en gång i veckan = 3- Flera gånger i veckan = 4Vi kodar om F61 så att 3 och 4 = 2 och tittar sedan på item fit igen. Det är inte oväntat att en allmän fråga får låg item fit när den används tillsammans med mera specifika frågor inom samma område.```{r}df.omit.na$F61 <-recode(df.omit.na$F61,"4=2;3=2")RIitemCats(df.omit.na, items ="F61")RIitemfitPCM2(df.omit.na, 300, 32, 8)```Vi tar bort F61 pga låg item fit, men kan prova att använda den bland skolfrågor och "Vantrivsel i skolan".## Rasch-parametrar 2 (utan F61)Eftersom vi inte längre har en blandning av dikotoma och polytoma items, utan bara dikotoma använder vi den vanliga Rasch-modellen.::: panel-tabset### Item fit```{r}#| label: rasch1.fitdf.omit.na$F61 <-NULLRIitemfitRM(df.omit.na, 300, 32)```### PCA```{r}#| label: rasch1.pca#| tbl-cap: "PCA of Rasch model residuals"RIrmPCA(df.omit.na)```### Residualkorrelationer```{r}#| label: rasch1.rcorrRIresidcorr(df.omit.na, cutoff =0.2)```### Targeting```{r}#| label: rasch1.targRItargeting(df.omit.na, dich = T)```### Item-hierarki```{r}df.erm <-RM(df.omit.na)plotPImap(df.erm, sorted = T)```### Loadings 1st contrast```{r}#| label: rasch1.loadRIloadLoc(df.omit.na)```### Items```{r}#| label: rasch1.itemsRIlistitems(df.omit.na)```:::Inga problem med dimensionalitet.## Reliabilitet```{r}RItif(df.omit.na)```Den låga reliabiliteten gör att det inte är meningsfullt att estimera indexvärden utifrån mobbningsfrågorna.## VisualiseringMed data från 2006 till 2020.```{r}df.plot <- df %>%select(!F61)```### Missing data::: panel-tabset#### 2020```{r}df.plot %>%filter(ar ==2020) %>%select(starts_with("f")) %>%RImissing()```#### 2018```{r}df.plot %>%filter(ar ==2018) %>%select(starts_with("f")) %>%RImissing()```#### 2016```{r}df.plot %>%filter(ar ==2016) %>%select(starts_with("f")) %>%RImissing()```#### 2014```{r}df.plot %>%filter(ar ==2014) %>%select(starts_with("f")) %>%RImissing()```:::Det verkar bara vara item F63 som har missing data. Vi tar en närmare titt på de som har missing data på F63 för att se om det finns ett mönster.```{r}#| include: falsetheme_rise <-function(fontfamily ="Lato", axissize =13, titlesize =15,margins =12, axisface ="plain", stripsize =12,panelDist =0.6, legendSize =11, legendTsize =12) {theme(text =element_text(family = fontfamily),axis.title.x =element_text(margin =margin(t = margins),size = axissize ),axis.title.y =element_text(margin =margin(r = margins),size = axissize ),plot.title =element_text(face ="bold",size = titlesize ),axis.title =element_text(face = axisface ),plot.caption =element_text(face ="italic" ),legend.text =element_text(family = fontfamily, size = legendSize),legend.title =element_text(family = fontfamily, size = legendTsize),strip.text =element_text(size = stripsize),panel.spacing =unit(panelDist, "cm", data =NULL),legend.background =element_rect(color ="lightgrey"),strip.background =element_rect(color ="lightgrey") )}```::: panel-tabset#### Kön - antal```{r}df.plot %>%filter(is.na(F63)) %>%group_by(ar) %>%count(Kön) %>%mutate(Andel =100* n /sum(n)) %>%ggplot(aes(x = ar, y = n, color = Kön)) +geom_point(size =2) +geom_line() +scale_color_viridis_d(begin =0.2, end =0.8) +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +ylab("Antal svar") +theme_minimal() +theme_rise()```#### Kön - andel```{r}df.plot %>%filter(is.na(F63)) %>%filter(!is.na(Kön)) %>%group_by(ar) %>%count(Kön) %>%mutate(Andel =100* n /sum(n)) %>%ggplot(aes(x = ar, y = Andel, color = Kön)) +geom_point(size =2) +geom_line() +scale_color_viridis_d(begin =0.2, end =0.8) +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +scale_y_continuous(limits =c(0,100)) +ylab("Andel svar") +theme_minimal() +theme_rise()```#### SkolSDO - antal```{r}df.plot %>%filter(is.na(F63)) %>%filter(!is.na(SkolSDO)) %>%group_by(ar) %>%count(SkolSDO) %>%mutate(Andel =100* n /sum(n)) %>%ggplot(aes(x = ar, y = n, color = SkolSDO)) +geom_point(size =2) +geom_line() +scale_color_viridis_d() +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +ylab("Antal svar") +theme_minimal() +theme_rise()```#### SkolSDO - andel```{r}df.plot %>%filter(is.na(F63)) %>%group_by(ar) %>%count(SkolSDO) %>%mutate(Andel =100* n /sum(n)) %>%ggplot(aes(x = ar, y = Andel, color = SkolSDO)) +geom_point(size =2) +geom_line() +scale_color_viridis_d(begin =0.2, end =0.8) +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +ylab("Andel svar") +theme_minimal() +theme_rise()```:::Inget tydligt mönster framgår.### StapeldiagramMotsvarar det som Länsstyrelsen får från Origo.```{r}# df.plot <- df %>% # filter(DIDkommun == "Vallentuna") %>% # select(starts_with("f60"),F63,ar,Kön,ARSKURS)RISEpalette1 <-colorRampPalette(colors =c("#009ca6", "#e83c63", "#ffe500"))(6)df.mobbad <- df.plot %>%mutate(mobbad =case_when(f60b ==1~"Jag har blivit hånad, förlöjligad, kallad öknamn eller blivit retad på ett obehagligt och sårande sätt", f60c ==1~"Jag har blivit utfrusen av andra elever", f60d ==1~"Jag har blivit slagen, sparkad, knuffad eller stängd inne", f60e ==1~"Någon elev har spritt lögner eller falska rykten om mig och försökt få andra att tycka illa om mig", f60f ==1~"Jag har blivit fråntagen pengar eller saker eller fått saker förstörda", f60g ==1~"Jag har blivit hotad eller tvingad att göra saker som jag inte ville göra", f60h ==1~"Lärare har psykat eller på annat sätt varit elaka mot mig", f60i ==1~"Jag har mobbats på annat sätt.", F63 ==1~"Har du blivit mobbad eller trakasserad via internet eller SMS/MMS det här läsåret?", f60a ==1~"Nej",TRUE~NA )) %>%mutate(mobbad =factor(mobbad))df.mobbadG <- df.mobbad %>%filter(ar ==2022,!is.na(Kön)) %>%group_by(Kön) %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%mutate(mobbad =fct_reorder(mobbad, desc(n)))df.mobbadAlla <- df.mobbad %>%filter(ar ==2022) %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%mutate(mobbad =fct_reorder(mobbad, desc(n)))nejMedel <- df.mobbadAlla %>%filter(mobbad =='Nej') %>%pull(Andel) %>%round(1)nejMedelÅk9 <- df.mobbad %>%filter(ar ==2022,!is.na(Kön), ARSKURS =="Åk 9") %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%filter(mobbad =='Nej') %>%pull(Andel) %>%round(1)nejMedelGy2 <- df.mobbad %>%filter(ar ==2022,!is.na(Kön), ARSKURS =="Gy 2") %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%filter(mobbad =='Nej') %>%pull(Andel) %>%round(1)```::: panel-tabset#### Uppdelat på kön```{r}#| fig-height: 7df.mobbadG %>%drop_na(mobbad) %>%ggplot(data = .,aes(x = mobbad, y = Andel, fill = Kön)) +# geom_col(data = df.mobbadAlla, # aes(x = mobbad, y = Andel),# fill = "grey",# width = 1) +geom_bar(position=position_dodge(), stat ='identity') +scale_y_continuous(limits =c(0,100)) +scale_x_discrete(labels =~ stringr::str_wrap(.x, width =8)) +scale_color_manual(values = RISEpalette1[c(1,5)],aesthetics =c("fill","color")) +theme_minimal() +theme_rise() +labs(title ="Har du känt dig mobbad eller trakasserad i skolan det här läsåret?",subtitle ="2020, både åk 9 och gy 2.") +ylab("Andel i %") +xlab("") +geom_text(aes(label =round(Andel,1)),position =position_dodge(width =0.9),hjust =-0.22, vjust =0.5, angle =90, size =2.7,color ="darkgrey") +annotate("text", y =95, x =3,label =paste0("Medelvärde ",nejMedel,"%"),color ="black") +geom_curve(x =3, y =91,xend =1, yend = nejMedel,color ="black",curvature =-0.4,arrow =arrow()) +update_geom_defaults("text", list(family ="Lato"))```#### Åk 9```{r}#| fig-height: 7df.mobbad %>%filter(ar ==2020,!is.na(Kön),!is.na(ARSKURS)) %>%drop_na(mobbad) %>%group_by(ARSKURS,Kön) %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%mutate(mobbad =fct_reorder(mobbad, desc(n))) %>%filter(ARSKURS =="Åk 9") %>%ggplot(aes(x = mobbad, y = Andel, fill = Kön)) +# geom_col(data = df.mobbadAlla, # aes(x = mobbad, y = Andel),# fill = "grey",# width = 1) +geom_bar(position=position_dodge(), stat ='identity') +scale_y_continuous(limits =c(0,100)) +scale_x_discrete(labels =~ stringr::str_wrap(.x, width =8)) +scale_color_manual(values = RISEpalette1[c(1,5)],aesthetics =c("fill","color")) +theme_minimal() +theme_rise() +labs(title ="Har du känt dig mobbad eller trakasserad i skolan det här läsåret?",subtitle ="2020, åk 9") +ylab("Andel i %") +xlab("") +geom_text(aes(label =round(Andel,1)),position =position_dodge(width =0.9),hjust =-0.22, vjust =0.5, angle =90, size =2.7,color ="darkgrey") +annotate("text", y =95, x =3,label =paste0("Medelvärde ",nejMedelÅk9,"%"),color ="black") +geom_curve(x =3, y =91,xend =1, yend = nejMedelÅk9,color ="black",curvature =-0.4,arrow =arrow())```#### Gy 2```{r}#| fig-height: 7df.mobbad %>%filter(ar ==2020,!is.na(Kön),!is.na(ARSKURS)) %>%drop_na(mobbad) %>%group_by(ARSKURS,Kön) %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%mutate(mobbad =fct_reorder(mobbad, desc(n))) %>%filter(ARSKURS =="Gy 2") %>%ggplot(aes(x = mobbad, y = Andel, fill = Kön)) +# geom_col(data = df.mobbadAlla, # aes(x = mobbad, y = Andel),# fill = "grey",# width = 1) +geom_bar(position=position_dodge(), stat ='identity') +scale_y_continuous(limits =c(0,100)) +scale_x_discrete(labels =~ stringr::str_wrap(.x, width =8)) +scale_color_manual(values = RISEpalette1[c(2,6)],aesthetics =c("fill","color")) +theme_minimal() +theme_rise() +labs(title ="Har du känt dig mobbad eller trakasserad i skolan det här läsåret?",subtitle ="2020, gy 2") +ylab("Andel i %") +xlab("") +geom_text(aes(label =round(Andel,1)),position =position_dodge(width =0.9),hjust =-0.22, vjust =0.5, angle =90, size =2.7,color ="darkgrey") +annotate("text", y =95, x =3,label =paste0("Medelvärde ",nejMedelGy2,"%"),color ="black") +geom_curve(x =3, y =91,xend =1, yend = nejMedelGy2,color ="black",curvature =-0.4,arrow =arrow())```#### Ej mobbad, över tid```{r}df.mobbad %>%filter(!is.na(Kön)) %>%drop_na(mobbad) %>%group_by(ar,Kön) %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%filter(mobbad =="Nej") %>%ggplot(aes(x = ar, y = Andel, color = Kön, group = Kön)) +geom_point(size =3) +geom_line(linewidth =1.3) +scale_color_manual(values = RISEpalette1[c(1,5)],aesthetics =c("fill","color")) +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +scale_y_continuous(limits =c(0,100)) +theme_minimal() +theme_rise() +labs(title ="Har du känt dig mobbad eller trakasserad i skolan det här läsåret?",subtitle ="Andel elever som svarat ''Nej', åk 9 och gy 2") +ylab("Andel i %") +xlab("")```#### Ej mobbad, årskurs```{r}df.mobbad %>%filter(!is.na(Kön),!is.na(ARSKURS) ) %>%drop_na(mobbad) %>%group_by(ar,ARSKURS,Kön) %>%count(mobbad, .drop = F) %>%mutate(Andel =100*n/sum(n)) %>%filter(mobbad =="Nej") %>%ggplot(aes(x = ar, y = Andel, color = Kön, group = Kön)) +geom_point(size =3) +geom_line(linewidth =1.3) +scale_color_manual(values = RISEpalette1[c(1,5)],aesthetics =c("fill","color")) +scale_x_continuous("Årtal", breaks =c(2006,2008,2010,2012,2014,2016,2018,2020)) +scale_y_continuous(limits =c(0,100)) +theme_minimal() +theme_rise() +labs(title ="Har du känt dig mobbad eller trakasserad i skolan det här läsåret?",subtitle ="Andel elever som svarat ''Nej'") +ylab("Andel i %") +xlab("") +facet_wrap(~ARSKURS)```:::## 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