Item/frågor har etiketter f66a-f66u i datafilen, och motsvaras av fråga 67 i PDF-filen med frågor.
“Hur väl stämmer följande påståenden in på dig som person?” följs av de ingående frågorna, alla med samma fyra svarskategorier:
‘Stämmer mycket dåligt’
‘Stämmer ganska dåligt’
‘Stämmer ganska bra’
‘Stämmer mycket bra’
Svarskategorierna ersätts med siffror från 0 till 3, och för f66h, m, p och u är siffrorna omvända/reverserade, d.v.s. att “Stämmer mycket bra” kodas som “0” i stället för “3” till analysen. Det innebär att höga poäng genomgående innebär hög risk.
Code
#RIcolorlistitems(c(8,13,16,21), RISEprimGreenMid)reverserade <-c(8,13,16,21)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 =14,fixed_thead = T) %>%# when there is a long list in the tablerow_spec(reverserade, bold = F, color ="white", background = RISEprimGreen) %>%column_spec(1, bold = T) %>%kable_classic(html_font ="Lato")
itemnr
item
f66a
Jag gör tvärt emot vad människor säger åt mig att göra, bara för att göra dem arga.
f66b
Jag gillar att göra spännande och farliga saker, även om det är förbjudet.
f66c
Jag tål inte att bli provocerad, då kan jag slå till någon.
f66d
Jag ljuger för att få fördelar eller slippa göra jobbiga saker.
f66e
Om jag blir arg på någon drar jag mig inte för att skada honom/henne.
f66f
Jag är ofta ute på natten tillsammans med kamrater.
f66g
Jag struntar i regler som hindrar mig från att göra det jag vill göra.
f66h
Jag tycker det är roligt att lösa svåra problem och uppgifter.
f66i
Jag ser mig själv som en ganska impulsiv person.
f66j
Jag vill gärna vara där det händer spännande saker.
f66k
Jag kan få andra att tro på nästan vad som helst.
f66l
Jag blir ofta osäker när jag ställs inför nya uppgifter.
f66m
Jag tänker oftast efter innan jag talar eller gör saker.
f66n
Jag gör dumma saker även om de är lite farliga.
f66o
Jag vill gärna se hur långt jag kan gå innan folk får nog.
f66p
Det är fel att fuska i skolan.
f66q
Jag tycker att det är OK att ta något utan att fråga, om man inte blir upptäckt.
f66r
Det händer att jag gör saker utan att tänka mig för.
f66s
Om jag ställs inför en svår uppgift så väljer jag att göra något annat.
f66t
Den som gör mig arg ger jag mig på, även om han/hon inte slagit mig först.
f66u
Det är viktigt att vara ärlig mot föräldrarna, även om de blir arga.
Relative cut-off value (highlighted in red) is 0.161, which is 0.2 above the average correlation.
Code
RItargeting(df.omit.na)
Code
RIitemHierarchy(df.omit.na)
Code
plot(mirt.rasch, type="trace")
Vi ser att PCA av residualer indikerar multidimensionalitet eftersom största eigenvalue är över 2.0. Figuren med “Loadings 1st contrast” visar att våra reverserade items, h m p och u, håller ihop i ett kluster, och även items s och l ligger nära dem.
Som ett första steg provar vi att plocka bort ovan nämnda sex items och köra analysen igen.
Relative cut-off value (highlighted in red) is 0.14, which is 0.2 above the average correlation.
Code
RItargeting(df.neg)
Code
RIitemHierarchy(df.neg)
Code
plot(mirt.rasch, type="trace")
Vi ser nu att f66e, som även tidigare hade hög MSQ, också sticker ut i loading-figuren. Det är också det enda item som har problem med svarskategorierna. Vi provar att slå samman svarskategorierna i mitten och tittar sedan på item fit igen.
Relative cut-off value (highlighted in red) is 0.13, which is 0.2 above the average correlation.
Code
RItargeting(df.neg)
Code
RIitemHierarchy(df.neg)
Vi har några residualkorrelationer som är strax över gränsvärden, men i stort fungerar denna uppsättning items acceptabelt.
2.6.1 Reliabilitet
Code
RItif(df.neg)
Reliabiliteten är god och det finns utrymme att minska på antalet items för att åtgärda de smärre brister som kvarstår.
2.7 Rasch-analys 4 negativa items
Två par av items har residualkorrelationer som överstiger gränsvärdet:
f66a med o (provocerar)
f66c med e (våldsutövning vid affekt)
Tittar man på innehållet i frågorna är det inte förvånande att se dessa korrelationer eftersom de är såpass likartade. Det gör också att det är rimligt att eliminera frågor utan att tappa innehållsvaliditet.
Här finns skillnader på två items, f66f och f66i, där flickor gy 2 och pojkar åk 9 skiljer sig åt över gränsvärdet 0.5. Ytterligare tre items går över 0.4.
Eftersom vi har relativt många items förefaller den enklaste åtgärden vara att ta bort de två items som når problematiska nivåer.
2.9 Rasch-analys 5 negativa items
Två items tas bort p.g.a. DIF, interaktion mellan kön och årskurs:
Denna uppsättning av items bildar ett fungerande index, men det är oklart vad indexet representerar och därmed hur det skulle kunna användas. De fem frågorna kommer från tre olika tänkta delskalor (se nästa avsnitt).
2.19 Analys av delskalor
De 21 frågor som ingår under rubriken “Individfaktorer” har delats in i sju delskalor med tre items vardera.
Trotsighet (f66a,f66g,f66o)
Spänningssökande - (f66b,f66j,f66n)
Aggressivitet - (f66c,f66e,f66t)
Antisocialt beteende - (f66d,f66f,f66k)
Problemlösning - (f66h,f66l,f66s)
Impulsivitet - (f66i,f66m,f66r)
Moral - (f66p,f66q,f66u)
Code
# create vectors with items for each subscaleTrotsighet <-as.character(expression(f66a,f66g,f66o))Spänningssökande <-as.character(expression(f66b,f66j,f66n))Aggressivitet <-as.character(expression(f66c,f66e,f66t))Antisocialt <-as.character(expression(f66d,f66f,f66k))Problemlösning <-as.character(expression(f66h,f66l,f66s))Impulsivitet <-as.character(expression(f66i,f66m,f66r))Moral <-as.character(expression(f66p,f66q,f66u))
2.19.1 Trotsighet
Code
# subset items to dataframedf.subskala <- df.omit.na %>%select(all_of(Trotsighet))
Code
RIlistItemsMargin(df.subskala, 13)
itemnr
item
f66a
Jag gör tvärt emot vad människor säger åt mig att göra, bara för att göra dem arga.
f66g
Jag struntar i regler som hindrar mig från att göra det jag vill göra.
f66o
Jag vill gärna se hur långt jag kan gå innan folk får nog.
Relative cut-off value (highlighted in red) is -0.002, which is 0.2 above the average correlation.
Code
RItargeting(df.subskala)
Code
RIitemHierarchy(df.subskala)
Code
plot(mirt.rasch, type="trace")
Code
RIlistitems(df.subskala)
itemnr
item
f66p
Det är fel att fuska i skolan.
f66q
Jag tycker att det är OK att ta något utan att fråga, om man inte blir upptäckt.
f66u
Det är viktigt att vara ärlig mot föräldrarna, även om de blir arga.
Code
RItif(df.subskala)
Code
RIpfit(df.subskala)
2.20 Delskalor - sammanfattande kommentar
Alla delskalor har flera items som uppvisar låg item fit, vilket innebär att svaren är för förutsägbara tillsammans med övriga frågor. Det vill säga att de tillför relativt lite information.
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: "Individfaktorer"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-title: "Innehållsförteckning" toc: true toc-depth: 3 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}#| label: recoderawdata#| include: false# ###### Individfaktorer# # koda om svaren för items som ingår i individfaktorer, F66a-F66u i data, fråga 67 i PDF# # variabler df[191:211]# # hög poäng = hög risk# # definiera svarskategorierna för att förenkla recode-koden# smd<-'Stämmer mycket dåligt'# sgd<-'Stämmer ganska dåligt'# sgb<-'Stämmer ganska bra'# smb<-'Stämmer mycket bra'# # ### New recode code below, using variable names instead of numbering# # positiva.items <- c("f66h", "f66m", "f66p", "f66u") # create vector with reverse scored items# itemlabels<-read_excel("C:/Users/magnuspjo/OneDrive - RISE/Dokument/Länsstyrelsen/Stockholmsenkäten2022/data/IF_itemlabels.xls")# df.if <- df %>%# select(any_of(itemlabels$itemnr))# negativa.items <- df.if %>% # vector with items that are not reversed# select(!any_of(positiva.items)) %>%# names()# # for (i in positiva.items) {# df[[i]]<-car::recode(df[[i]],"smb=0;sgb=1;sgd=2;smd=3",as.factor=FALSE)# }# # for (i in negativa.items) {# df[[i]]<-car::recode(df[[i]],"smb=3;sgb=2;sgd=1;smd=0",as.factor=FALSE)# }# # df.if <- df %>%# select(itemlabels$itemnr,ar,Kön,ARSKURS,SkolSDO)``````{r}#| label: setup#| include: false# two packages below require that you use devtools to install them manually:# first install devtools by# install.packages('devtools')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)### 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"# 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# import item informationitemlabels<-read_excel("../../data/IF_itemlabels.xls")# read recoded dataset# df <- read.csv("C:/Users/magnuspjo/OneDrive - RISE/Dokument/Länsstyrelsen/Stockholmsenkäten2022/data/IFalldata_2022-08-11.csv")df.all <-read_parquet("../../data/2022-08-22 sthlmsenkat data.parquet")df <- 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.SkolSDO <- 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()dif.year <- df.dif.years$ardf.dif.years$ar <-NULL# df.dif.years can later be used for DIF analysis of years```## Frågor i enkätenItem/frågor har etiketter f66a-f66u i datafilen, och motsvaras av fråga 67 i PDF-filen med frågor."Hur väl stämmer följande påståenden in på dig som person?" följs av de ingående frågorna, alla med samma fyra svarskategorier:* 'Stämmer mycket dåligt'* 'Stämmer ganska dåligt'* 'Stämmer ganska bra'* 'Stämmer mycket bra'Svarskategorierna ersätts med siffror från 0 till 3, och för f66h, m, p och u är siffrorna omvända/reverserade, d.v.s. att "Stämmer mycket bra" kodas som "0" i stället för "3" till analysen. Det innebär att höga poäng genomgående innebär hög risk.```{r}#RIcolorlistitems(c(8,13,16,21), RISEprimGreenMid)reverserade <-c(8,13,16,21)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 =14,fixed_thead = T) %>%# when there is a long list in the tablerow_spec(reverserade, bold = F, color ="white", background = RISEprimGreen) %>%column_spec(1, bold = T) %>%kable_classic(html_font ="Lato")```## Deskriptiva data### Demografi```{r}#| label: descriptives1#| layout-ncol: 2RIdemographics(dif.gender, "Kön")RIdemographics(dif.arskurs, "Årskurs")```### Item-data:::: column-page-inset-left::: panel-tabset#### Tile plot```{r}#| label: descriptives2RItileplot(df.omit.na)```#### Stacked bars```{r}#| label: stack1RIbarstack(df.omit.na)```#### Barplots```{r}#| label: alt-descriptives#| layout-ncol: 2RIbarplot(df.omit.na)```:::::::## Rasch-analys samtliga items```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.omit.na)```:::: 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: 9RItargeting(df.omit.na)```### Itemhierarki```{r}#| fig-height: 9RIitemHierarchy(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")```:::::::Vi ser att PCA av residualer indikerar multidimensionalitet eftersom största eigenvalue är över 2.0. Figuren med "Loadings 1st contrast" visar att våra reverserade items, h m p och u, håller ihop i ett kluster, och även items s och l ligger nära dem.Som ett första steg provar vi att plocka bort ovan nämnda sex items och köra analysen igen.## Rasch-analys 1 negativa itemsUtan items f66h m p u samt l och s.```{r}#| label: rasch2.fititems.pos <-c("f66h","f66l","f66m","f66p","f66s","f66u")df.neg <- df.omit.na %>%select(!any_of(items.pos))``````{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)```:::: column-page-inset-left::: panel-tabset### Item fit```{r}RIitemfitPCM2(df.neg, 300, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.neg)```### Loadings 1st contrast```{r}RIloadLoc(df.neg)```### Residualkorrelationer```{r}RIresidcorr(df.neg, cutoff =0.2)```### Targeting```{r}#| fig-height: 7RItargeting(df.neg)```### Itemhierarki```{r}#| fig-height: 7RIitemHierarchy(df.neg)```### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.neg, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```:::::::Vi ser nu att f66e, som även tidigare hade hög MSQ, också sticker ut i loading-figuren. Det är också det enda item som har problem med svarskategorierna. Vi provar att slå samman svarskategorierna i mitten och tittar sedan på item fit igen.### Omkodning av svarskategorier för f66e```{r}#recoded.items <- c("f66e","f66p","f66q","f66t")df.neg$f66e<-car::recode(df.neg$f66e,"2=1;3=2",as.factor=FALSE)df.erm <-PCM(df.neg)plotICC(df.erm, item.subset ="f66e")``````{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)```## Rasch-analys 2 negativa items:::: column-page-inset-left::: panel-tabset### Item fit {.smaller}```{r}RIitemfitPCM2(df.neg, 300, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.neg)```### Loadings 1st contrast```{r}RIloadLoc(df.neg)```### Residualkorrelationer```{r}RIresidcorr(df.neg, cutoff =0.2)```### Targeting```{r}#| fig-height: 7RItargeting(df.neg)```### Itemhierarki```{r}#| fig-height: 7RIitemHierarchy(df.neg)```:::::::Items f66b och n, samt c och t, har störst residualkorrelationer och behöver åtgärdas genom att en i varje par tas bort.- b har två korrelationer, samt lägre fit- t har sämst targeting## Rasch-analys 3 negativa items Utan items f66b och t.```{r}#| label: rasch4.recoderemoved.items <-c("f66b","f66t")df.neg <- df.neg %>%select(!any_of(removed.items))``````{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)```:::: column-page-inset-left::: panel-tabset### Item fit {.smaller}```{r}RIitemfitPCM2(df.neg, 300, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.neg)```### Loadings 1st contrast```{r}RIloadLoc(df.neg)```### Residualkorrelationer```{r}RIresidcorr(df.neg, cutoff =0.2)```### Targeting```{r}#| fig-height: 7RItargeting(df.neg)```### Itemhierarki```{r}#| fig-height: 7RIitemHierarchy(df.neg)```:::::::Vi har några residualkorrelationer som är strax över gränsvärden, men i stort fungerar denna uppsättning items acceptabelt.### Reliabilitet```{r}RItif(df.neg)```Reliabiliteten är god och det finns utrymme att minska på antalet items för att åtgärda de smärre brister som kvarstår.## Rasch-analys 4 negativa itemsTvå par av items har residualkorrelationer som överstiger gränsvärdet:- f66a med o (provocerar)- f66c med e (våldsutövning vid affekt)Tittar man på innehållet i frågorna är det inte förvånande att se dessa korrelationer eftersom de är såpass likartade. Det gör också att det är rimligt att eliminera frågor utan att tappa innehållsvaliditet.Vi tar bort:- f66a (o har marginellt bättre targeting)- f66e (hade problem med svarskategorier)```{r}#| label: rasch5.recoderemoved.items <-c("f66b","f66t","f66a","f66e")df.neg <- df.neg %>%select(!any_of(removed.items))``````{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)```:::: column-page-inset-left::: panel-tabset### Item fit {.smaller}```{r}RIitemfitPCM2(df.neg, 300, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.neg)```### Loadings 1st contrast```{r}RIloadLoc(df.neg)```### Residualkorrelationer```{r}RIresidcorr(df.neg, cutoff =0.2)```### Targeting```{r}#| fig-height: 6RItargeting(df.neg)```### Itemhierarki```{r}#| fig-height: 6RIitemHierarchy(df.neg)```### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.neg, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```### Items```{r}RIlistitems(df.neg)```:::::::Detta är en välfungerande uppsättning items utifrån analyserna så långt, även om f66g och n uppvisar något låg item fit ZSTD.## Invarians/DIF - negativa items### Kön```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)```:::: column-page-inset-left::: panel-tabset#### Tabell```{r}#| label: difgender#dif.gender<-recode(dif.gender,"'Pojke'=1;'Flicka'=2",as.factor=FALSE)RIdifTable(df.neg, dif.gender)```#### Figur```{r}#| label: difgender2RIdifFigure(df.neg, dif.gender)```:::::::Inga större problem. Två item går över 0.3 - f66r och f66i, men ingen över 0.5.### Årskurs```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)```:::: column-page-inset-left::: panel-tabset#### Tabell```{r}RIdifTable(df.neg, dif.arskurs)```#### Figur```{r}RIdifFigure(df.neg, dif.arskurs)```:::::::Inga problem. Item f66f är den som har högst nivå.### Årtal```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)```:::: column-page-inset-left::: panel-tabset#### Tabell```{r}#| cache: truefinal.items.neg <-names(df.neg)#write.csv(final.items, file = "2022-09-16 IFoptimalItems.csv")df.dif.years.neg <- df.dif.years %>%select(any_of(final.items.neg))# recoded.items <- c("f66e","f66p","f66q","f66t")# # for (i in recoded.items) {# df.omit.na[[i]]<-car::recode(df.omit.na[[i]],"2=1;3=2",as.factor=FALSE)# }RIdifTable(df.dif.years.neg, dif.year)```#### Figur```{r}RIdifFigure(df.dif.years.neg, dif.year)```#### Items över tid```{r}RIdifFigTime(df.dif.years.neg, dif.year)```:::::::Inget item är problematiskt.### Interaktion årskurs och kön```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg, 12)``````{r}dfin <- df.negdf.tree <-data.frame(matrix(ncol =0, nrow =nrow(dfin)))df.tree$difdata <-as.matrix(dfin)df.tree$dif.gender <- dif.genderdf.tree$dif.arskurs <- dif.arskurspctree.out <-pctree(difdata ~ dif.gender + dif.arskurs, data = df.tree)plot(pctree.out)``````{r}cutoff <-0.5diffig <-itempar(pctree.out) %>%as.data.frame() %>%t() %>%as.data.frame() %>%mutate(`Mean location`=rowMeans(.),StDev =rowSds(as.matrix(.)) ) %>%rowwise() %>%mutate(MaxDiff = (max(c_across(c(1:(ncol(.) -2))))) -min(c_across(c(1:(ncol(.) -2))))) %>%ungroup() %>%mutate(across(where(is.numeric), round, 3)) %>%rownames_to_column(var ="Item") %>%mutate(Item =names(dfin)) %>%relocate(MaxDiff, .after =last_col())nodecolsN <-ncol(diffig)-3formattable(diffig,list(MaxDiff =formatter("span",style =~style(color =ifelse(MaxDiff <-cutoff,"red", ifelse(MaxDiff > cutoff, "red", "black") )) ), formattable::area(col =2:nodecolsN) ~color_tile(RISEprimYellowLight, RISEprimGreen) ),table.attr ="class=\"table table-striped\" style=\"font-size: 15px; font-family: Lato\"" )```Här finns skillnader på två items, f66f och f66i, där flickor gy 2 och pojkar åk 9 skiljer sig åt över gränsvärdet 0.5. Ytterligare tre items går över 0.4.Eftersom vi har relativt många items förefaller den enklaste åtgärden vara att ta bort de två items som når problematiska nivåer.## Rasch-analys 5 negativa itemsTvå items tas bort p.g.a. DIF, interaktion mellan kön och årskurs:- f66f- f66i```{r}removed.items <-c("f66b","f66t","f66a","f66e","f66f","f66i")df.neg <- df.neg %>%select(!any_of(removed.items))``````{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)```:::: column-page-inset-left::: panel-tabset### Item fit {.smaller}```{r}RIitemfitPCM2(df.neg, 300, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.neg)```### Loadings 1st contrast```{r}RIloadLoc(df.neg)```### Residualkorrelationer```{r}RIresidcorr(df.neg, cutoff =0.2)```### Targeting```{r}#| label: fig-ifNegTargeting#| fig-cap: "TIF-kurva negativa items"#| fig-height: 6RItargeting(df.neg)```### Itemhierarki```{r}#| label: fig-ifNegHierarchy#| fig-cap: "TIF-kurva negativa items"#| fig-height: 6RIitemHierarchy(df.neg)```### Items```{r}RIlistitems(df.neg)```:::::::## Person fit negativa items```{r}RIpfit(df.neg)```### Reliabilitet negativa items```{r}#| label: fig-ifNegTIF#| fig-cap: "TIF-kurva negativa items"RItif(df.neg)```## Item-parametrar negativa items```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.neg)``````{r}df.dif.years.neg <- df.dif.years.neg %>%select(any_of(names(df.neg)))RIitemparams(df.dif.years.neg, "IFnegativaItems.csv")itemlabels %>%filter(itemnr %in%names(df.dif.years.neg)) %>%write_csv("IFnegItemnr.csv")```## Transformeringstabell```{r}RIscoreSE(df.dif.years.neg)```## Rasch-analys 1 positiva items```{r}#| label: setup2items.pos <-c("f66h","f66l","f66m","f66p","f66s","f66u")df.pos <- df.omit.na %>%select(any_of(items.pos))``````{r}#| column: marginRIlistItemsMargin(df.pos, 13)```:::: column-page-inset-left::: panel-tabset### Item fit {.smaller}```{r}RIitemfitPCM2(df.pos, 300, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.pos)```### Loadings 1st contrast```{r}RIloadLoc(df.pos)```### Residualkorrelationer```{r}RIresidcorr(df.pos, cutoff =0.2)```### Targeting```{r}#| fig-height: 5RItargeting(df.pos)```### Itemhierarki```{r}#| fig-height: 5RIitemHierarchy(df.pos)```### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.pos, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```:::::::Item f66s behöver tas bort p.g.a. residualkorrelation med f66l och klart sämre item fit än l.### Omkodning av svarskategorier för f66pEftersom svarskategorierna är oordnade slår vi samman de två mittersta. Test visade att de två översta inte kunde slås samman.```{r}#| label: posrecodedf.pos$f66p<-recode(df.pos$f66p,"2=1;3=2", as.factor = F)df.erm <-PCM(df.pos)plotICC(df.erm, item.subset ="f66p")```## Rasch-analys 2 positiva items (f66s borttagen, f66p omkodad)Item f66s behöver tas bort p.g.a. residualkorrelation med f66l och klart sämre item fit än l.```{r}#| column: margindf.pos$f66s <-NULLRIlistItemsMargin(df.pos, 13)```:::: column-page-inset-left::: panel-tabset### Item fit {.smaller}```{r}RIitemfitPCM2(df.pos, 300, 32, 8)```### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.pos)```### Loadings 1st contrast```{r}RIloadLoc(df.pos)```### Residualkorrelationer```{r}RIresidcorr(df.pos, cutoff =0.2)```### Targeting```{r}#| fig-height: 7RItargeting(df.pos)```### Itemhierarki```{r}#| fig-height: 7RIitemHierarchy(df.pos)```:::::::## Invarians/DIF - positiva items### Kön```{r}#| column: marginRIlistItemsMargin(df.pos)```:::: column-page-inset-left::: panel-tabset#### Tabell```{r}#dif.gender<-recode(dif.gender,"'Pojke'=1;'Flicka'=2",as.factor=FALSE)RIdifTable(df.pos, dif.gender)```#### Figur```{r}RIdifFigure(df.pos, dif.gender)```:::::::Items f66l och p har något hög DIF, men ej över gränsvärde 0.5.### Årskurs```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.pos)```:::: column-page-inset-left::: panel-tabset#### Tabell```{r}RIdifTable(df.pos, dif.arskurs)```#### Figur```{r}RIdifFigure(df.pos, dif.arskurs)```:::::::Inga problem.### Årtal```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.pos)```:::: column-page-inset-left::: panel-tabset#### Tabell```{r}final.items.pos <-names(df.pos)#write.csv(final.items, file = "2022-09-16 IFoptimalItems.csv")df.dif.years.pos <- df.dif.years %>%select(any_of(final.items.pos))df.dif.years.pos$f66p<-recode(df.dif.years.pos$f66p,"2=1;3=2", as.factor = F)RIdifTable(df.dif.years.pos, dif.year)```#### Figur 1```{r}RIdifFigure(df.dif.years.pos, dif.year)```#### Figur 2```{r}RIdifFigTime(df.dif.years.pos, dif.year)```:::::::Inget item uppvisar problematisk nivå av DIF.### Interaktion årskurs och kön```{r}#| column: margin#| echo: falseRIlistItemsMargin(df.pos, 12)``````{r}dfin <- df.posdf.tree <-data.frame(matrix(ncol =0, nrow =nrow(dfin)))df.tree$difdata <-as.matrix(dfin)df.tree$dif.gender <- dif.genderdf.tree$dif.arskurs <- dif.arskurspctree.out <-pctree(difdata ~ dif.gender + dif.arskurs, data = df.tree)plot(pctree.out)``````{r}cutoff <-0.5diffig <-itempar(pctree.out) %>%as.data.frame() %>%t() %>%as.data.frame() %>%mutate(`Mean location`=rowMeans(.),StDev =rowSds(as.matrix(.)) ) %>%rowwise() %>%mutate(MaxDiff = (max(c_across(c(1:(ncol(.) -2))))) -min(c_across(c(1:(ncol(.) -2))))) %>%ungroup() %>%mutate(across(where(is.numeric), round, 3)) %>%rownames_to_column(var ="Item") %>%mutate(Item =names(dfin)) %>%relocate(MaxDiff, .after =last_col())nodecolsN <-ncol(diffig)-3formattable(diffig,list(MaxDiff =formatter("span",style =~style(color =ifelse(MaxDiff <-cutoff,"red", ifelse(MaxDiff > cutoff, "red", "black") )) ), formattable::area(col =2:nodecolsN) ~color_tile(RISEprimYellowLight, RISEprimGreen) ),table.attr ="class=\"table table-striped\" style=\"font-size: 15px; font-family: Lato\"" )```## Person fit positiva items```{r}RIpfit(df.pos)```## Reliabilitet positiva items```{r}RItif(df.pos)```## Item-parametrar positiva items```{r}RIitemparams(df.dif.years.pos, "IFpositivaItems.csv")itemlabels %>%filter(itemnr %in%names(df.dif.years.pos)) %>%write_csv("IFposItemnr.csv")``````{r}RIscoreSE(df.dif.years.pos)```Denna uppsättning av items bildar ett fungerande index, men det är oklart vad indexet representerar och därmed hur det skulle kunna användas. De fem frågorna kommer från tre olika tänkta delskalor (se nästa avsnitt).## Analys av delskalor {#sec-ifDelskalor}De 21 frågor som ingår under rubriken "Individfaktorer" har delats in i sju delskalor med tre items vardera.- Trotsighet (f66a,f66g,f66o)- Spänningssökande - (f66b,f66j,f66n)- Aggressivitet - (f66c,f66e,f66t)- Antisocialt beteende - (f66d,f66f,f66k)- Problemlösning - (f66h,f66l,f66s)- Impulsivitet - (f66i,f66m,f66r)- Moral - (f66p,f66q,f66u)```{r}# create vectors with items for each subscaleTrotsighet <-as.character(expression(f66a,f66g,f66o))Spänningssökande <-as.character(expression(f66b,f66j,f66n))Aggressivitet <-as.character(expression(f66c,f66e,f66t))Antisocialt <-as.character(expression(f66d,f66f,f66k))Problemlösning <-as.character(expression(f66h,f66l,f66s))Impulsivitet <-as.character(expression(f66i,f66m,f66r))Moral <-as.character(expression(f66p,f66q,f66u))```### Trotsighet```{r}# subset items to dataframedf.subskala <- df.omit.na %>%select(all_of(Trotsighet))``````{r}#| column: marginRIlistItemsMargin(df.subskala, 13)```:::: column-page-inset-left::: panel-tabset#### Item fit {.smaller}```{r}RIitemfitPCM2(df.subskala, 350, 32, 8)```#### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.subskala)```#### Loadings 1st contrast```{r}RIloadLoc(df.subskala)```#### Residualkorrelationer```{r}RIresidcorr(df.subskala, cutoff =0.2)```#### Targeting```{r}#| fig-height: 4RItargeting(df.subskala)```#### Itemhierarki```{r}#| fig-height: 4RIitemHierarchy(df.subskala)```#### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.subskala, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```#### Items```{r}RIlistitems(df.subskala)```#### Reliabilitet```{r}RItif(df.subskala)```#### Person fit```{r}RIpfit(df.subskala)```:::::::### Spänningssökande```{r}# subset items to dataframedf.subskala <- df.omit.na %>%select(all_of(Spänningssökande))``````{r}#| column: marginRIlistItemsMargin(df.subskala, 13)```:::: column-page-inset-left::: panel-tabset#### Item fit {.smaller}```{r}RIitemfitPCM2(df.subskala, 300, 32, 8)```#### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.subskala)```#### Loadings 1st contrast```{r}RIloadLoc(df.subskala)```#### Residualkorrelationer```{r}RIresidcorr(df.subskala, cutoff =0.2)```#### Targeting```{r}#| fig-height: 4RItargeting(df.subskala)```#### Itemhierarki```{r}#| fig-height: 4RIitemHierarchy(df.subskala)```#### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.subskala, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```#### Items```{r}RIlistitems(df.subskala)```#### Reliabilitet```{r}RItif(df.subskala)```#### Person fit```{r}RIpfit(df.subskala)```:::::::### Aggressivitet```{r}# subset items to dataframedf.subskala <- df.omit.na %>%select(all_of(Aggressivitet))``````{r}#| column: marginRIlistItemsMargin(df.subskala, 13)```:::: column-page-inset-left::: panel-tabset#### Item fit {.smaller}```{r}RIitemfitPCM2(df.subskala, 400, 32, 8)```#### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.subskala)```#### Loadings 1st contrast```{r}RIloadLoc(df.subskala)```#### Residualkorrelationer```{r}RIresidcorr(df.subskala, cutoff =0.2)```#### Targeting```{r}#| fig-height: 4RItargeting(df.subskala)```#### Itemhierarki```{r}#| fig-height: 4RIitemHierarchy(df.subskala)```#### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.subskala, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```#### Items```{r}RIlistitems(df.subskala)```#### Reliabilitet```{r}RItif(df.subskala)```#### Person fit```{r}RIpfit(df.subskala)```:::::::### Antisocialt beteende```{r}# subset items to dataframedf.subskala <- df.omit.na %>%select(all_of(Antisocialt))``````{r}#| column: marginRIlistItemsMargin(df.subskala, 13)```:::: column-page-inset-left::: panel-tabset#### Item fit {.smaller}```{r}RIitemfitPCM2(df.subskala, 300, 32, 8)```#### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.subskala)```#### Loadings 1st contrast```{r}RIloadLoc(df.subskala)```#### Residualkorrelationer```{r}RIresidcorr(df.subskala, cutoff =0.2)```#### Targeting```{r}#| fig-height: 4RItargeting(df.subskala)```#### Itemhierarki```{r}#| fig-height: 4RIitemHierarchy(df.subskala)```#### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.subskala, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```#### Items```{r}RIlistitems(df.subskala)```#### Reliabilitet```{r}RItif(df.subskala)```#### Person fit```{r}RIpfit(df.subskala)```:::::::### Problemlösning```{r}# subset items to dataframedf.subskala <- df.omit.na %>%select(all_of(Problemlösning))``````{r}#| column: marginRIlistItemsMargin(df.subskala, 13)```:::: column-page-inset-left::: panel-tabset#### Item fit {.smaller}```{r}RIitemfitPCM2(df.subskala, 300, 32, 8)```#### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.subskala)```#### Loadings 1st contrast```{r}RIloadLoc(df.subskala)```#### Residualkorrelationer```{r}RIresidcorr(df.subskala, cutoff =0.2)```#### Targeting```{r}#| fig-height: 4RItargeting(df.subskala)```#### Itemhierarki```{r}#| fig-height: 4RIitemHierarchy(df.subskala)```#### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.subskala, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```#### Items```{r}RIlistitems(df.subskala)```#### Reliabilitet```{r}RItif(df.subskala)```#### Person fit```{r}RIpfit(df.subskala)```:::::::### Impulsivitet```{r}# subset items to dataframedf.subskala <- df.omit.na %>%select(all_of(Impulsivitet))``````{r}#| column: marginRIlistItemsMargin(df.subskala, 13)```:::: column-page-inset-left::: panel-tabset#### Item fit {.smaller}```{r}RIitemfitPCM2(df.subskala, 300, 32, 8)```#### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.subskala)```#### Loadings 1st contrast```{r}RIloadLoc(df.subskala)```#### Residualkorrelationer```{r}RIresidcorr(df.subskala, cutoff =0.2)```#### Targeting```{r}#| fig-height: 4RItargeting(df.subskala)```#### Itemhierarki```{r}#| fig-height: 4RIitemHierarchy(df.subskala)```#### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.subskala, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```#### Items```{r}RIlistitems(df.subskala)```#### Reliabilitet```{r}RItif(df.subskala)```#### Person fit```{r}RIpfit(df.subskala)```:::::::### Moral```{r}# subset items to dataframedf.subskala <- df.omit.na %>%select(all_of(Moral))``````{r}#| column: marginRIlistItemsMargin(df.subskala, 13)```:::: column-page-inset-left::: panel-tabset#### Item fit {.smaller}```{r}RIitemfitPCM2(df.subskala, 300, 32, 8)```#### PCA```{r}#| tbl-cap: "PCA of Rasch model residuals"RIpcmPCA(df.subskala)```#### Loadings 1st contrast```{r}RIloadLoc(df.subskala)```#### Residualkorrelationer```{r}RIresidcorr(df.subskala, cutoff =0.2)```#### Targeting```{r}#| fig-height: 4RItargeting(df.subskala)```#### Itemhierarki```{r}#| fig-height: 4RIitemHierarchy(df.subskala)```#### Svarskategorier```{r}#| include: falsemirt.rasch <-mirt(df.subskala, model=1, itemtype='Rasch') # unidimensional Rasch model``````{r}plot(mirt.rasch, type="trace")```#### Items```{r}RIlistitems(df.subskala)```#### Reliabilitet```{r}RItif(df.subskala)```#### Person fit```{r}RIpfit(df.subskala)```:::::::## Delskalor - sammanfattande kommentarAlla delskalor har flera items som uppvisar låg item fit, vilket innebär att svaren är för förutsägbara tillsammans med övriga frågor. Det vill säga att de tillför relativt lite information.All delskalor uppvisar också låg reliabilitet.## 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: 15px; font-family: Lato; width: 80%"')```## Referenser