library(foreign)library(readxl)library(RISEkbmRasch) # devtools::install_github("pgmj/RISEkbmRasch")library(grateful)library(ggrepel)library(car)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(glue)library(hexbin)library(skimr)### some commands exist in multiple packages, here we define preferred ones that are frequently usedselect <- dplyr::selectcount <- dplyr::countrecode <- car::recoderename <- dplyr::rename# file paths will need to have "../" added at the beginning to be able to render documentspssDatafil <-"../data/2023-04-26 Prevent OSA-enkat.sav"# get itemlabelsitemlabels <-read_excel("../data/Itemlabels.xlsx") %>%filter(str_detect(itemnr, pattern ="ao")) %>%select(!Dimension)# read SurveyMonkey datadf <-read.spss(spssDatafil, to.data.frame =TRUE) %>%select(starts_with("q0005"),q0001,q0002,q0003,q0004) %>%rename(Kön = q0002, Ålder = q0001,Bransch = q0003,Hemarbete = q0004)# SPSS format provides itemlabels too, we can save them in a dataframespssLabels <- df %>%attr('variable.labels') %>%as.data.frame()dif.kön <- df$Köndif.ålder <- df$Ålderdif.bransch <- df$Branschdif.hemarbete <- df$Hemarbetedf <- df %>%select(starts_with("q0005"))names(df) <- itemlabels$itemnr
2.1 Items
Code
kbl_rise(itemlabels, options ="hover", width =45)
itemnr
item
ao1
Jag vet vilka arbetsuppgifter jag har.
ao2
Jag vet hur mitt arbete ska utföras.
ao3
Jag vet vilka resultat som jag ska uppnå med mitt arbete.
RIdemographics(dif.ålder,"Ålder") # kanske även fixa en figur?
Ålder
n
Percent
18-29
22
3.8
30-39
103
17.8
40-49
175
30.2
50-59
215
37.1
60+
64
11.1
Code
RIdemographics(dif.bransch,"Bransch")
Bransch
n
Percent
Kontorsarbete (oavsett bransch)
284
49.1
Industri
26
4.5
Hotell, restaurang, service
8
1.4
Handel
16
2.8
Skola, utbildning
67
11.6
Vård, omsorg
99
17.1
Byggverksamhet
7
1.2
Annat
71
12.3
Code
RIdemographics(dif.hemarbete,"Antal dagar med arbete hemifrån")
Antal dagar med arbete hemifrån
n
Percent
En dag
136
23.5
Två dagar
105
18.1
Tre dagar
35
6.0
Fyra dagar
10
1.7
Fem dagar
2
0.3
Jag arbetar aldrig eller sällan hemifrån
291
50.3
2.2.1 Svarsbortfall items
Vi filtrerar bort respondenter som har färre än två svar på frågorna i delskalan.
Code
# If you want to include participants with missing data, input the minimum number of items responses that a participant should have to be included in the analysis:min.responses <-2scale.items <- itemlabels$itemnr# Select the variables we will work with, and filter out respondents with a lot of missing datadf.omit.na <- df %>%filter(length(scale.items)-rowSums(is.na(.[scale.items])) >= min.responses)RImissing(df.omit.na,"ao")
Vi har extremt få saknade svar, och tar därför bort respondenterna som inte har kompletta svar.
# koda om svarskategorier till siffrordf.omit.na <- df.omit.na %>%mutate(across(everything(), ~ car::recode(.x,"'Instämmer inte alls'=0; 'Instämmer till viss del' =1; 'Instämmer till stor del'=2; 'Instämmer helt och hållet'=3",as.factor =FALSE)))
Vi har väldigt få svar i de lägsta svarskategorierna för items 1-3, men det kan bero på underlaget. Tillsvidare slår vi ihop de två lägsta svarskategorierna för dessa items för att kunna utföra analyserna.
Code
#Temporärt slå ihop svarskategorier så att analyserna funkardf.omit.na$ao1<-recode(df.omit.na$ao1,"0=0;1=0;2=1;3=2",as.factor=FALSE)df.omit.na$ao2<-recode(df.omit.na$ao2,"0=0;1=0;2=1;3=2",as.factor=FALSE)df.omit.na$ao3<-recode(df.omit.na$ao3,"0=0;1=0;2=1;3=2",as.factor=FALSE)
2.3 Rasch-analys 1
itemnr
item
ao1
Jag vet vilka arbetsuppgifter jag har.
ao2
Jag vet hur mitt arbete ska utföras.
ao3
Jag vet vilka resultat som jag ska uppnå med mitt arbete.
Relative cut-off value (highlighted in red) is -0.081, which is 0.2 above the average correlation.
2.4.3 1st contrast loadings
Code
RIloadLoc(df2)
2.4.4 Targeting
Code
# increase fig-height above as needed, if you have many itemsRItargeting(df2)
2.4.5 Item hierarchy
Code
RIitemHierarchy(df2)
2.4.6 Person fit
Code
RIpfit(df2)
Det finns inte längre något problem med residualkorrelationer. Dock finns det fortfarande en något låg item fit för ao4 och en bristfällig matchning mellan items och respondenter. Vi går vidare och undersöker DIF och reliabilitet.
2.5 DIF-analysis
En DIF-analys bör inte inkludera svarskategorier med för få svar. Därför har svarskategorier med färre än 50 svar antingen exkluderas eller slagits ihop med andra svarskategorier (se avsnittet om bakgrundsdata för exakt antal svar per ordinarie kategori). DIF-variablerna omkodades till att innehålla följande kategorier:
Kön: man, kvinna
Ålder: 30-39, 40-49, 50-59, 60+
Bransch: kontorsarbete, ej kontorsarbete
Hemarbete: aldrig eller sällan, en dag, minst två dagar
Koden nedan specificerar exakt hur omkodningen gick till.
Code
# Omkodning för köndif.kön <-recode(dif.kön,"'Annat'=NA;'Vill ej uppge'=NA")# Omkodning för ålderdif.ålder <-recode(dif.ålder,"'18-29'=NA")# Omkodning för branschdif.bransch <-recode(dif.bransch,"'Industri'='Ej kontorsarbete';'Hotell, restaurang, service'='Ej kontorsarbete';'Handel'='Ej kontorsarbete';'Skola, utbildning'='Ej kontorsarbete';'Vård, omsorg'='Ej kontorsarbete';'Byggverksamhet'='Ej kontorsarbete';'Annat'='Ej kontorsarbete'")#Omkodning för hemarbetedif.hemarbete <-recode(dif.hemarbete,"'Fem dagar'='Minst två dagar';'Fyra dagar'='Minst två dagar';'Tre dagar'='Minst två dagar';'Två dagar'='Minst två dagar'")
Ingen DIF baserat på kön, ålder, bransch eller hemarbete.
2.6 Reliability
Code
RItif(df2, lo =-5, hi =5)
Reliabiliteten är låg och kommer inte upp i önskvärda nivåer någonstans på skalan. Vi går därför inte vidare och tar fram mätvärden. Frågorna i detta område bör enbart redovisas med svarsfördelning för frågorna enskilt och ej summeras på något vis.