13Psykologisk trygghet, stöd och möjlighet att påverka
Explorativ analys
Code
library(foreign)library(readxl)library(RISEkbmRasch) # devtools::install_github("pgmj/RISEkbmRasch")library(grateful) # devtools::install_github("Pakillo/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 document# get itemlabelsitemlabels <-read_excel("../data/Itemlabels.xlsx") %>%filter(str_detect(itemnr, pattern ="st|pt|mp")) %>%select(!Dimension)spssDatafil <-"../data/2023-04-26 Prevent OSA-enkat.sav"# read SurveyMonkey datadf <-read.spss(spssDatafil, to.data.frame =TRUE) %>%select(starts_with("q0008"), starts_with("q0013"), starts_with("q0007"),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("q0008"), starts_with("q0013"), starts_with("q0007"))names(df) <- itemlabels$itemnr
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
13.1.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, c("st", "mp", "pt"))
Vi har relativt få saknade svar, och tar därför bort respondenterna som inte har kompletta svar.
Vi har väldigt få svar i lägsta kategorierna genomgående. Vi slår ihop de två lägsta svarskategorierna för samtliga items utom st2.
Code
#Temporärt slå ihop svarskategorier så att analyserna funkardf.omit.na$st1<-recode(df.omit.na$st1,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)#df.omit.na$st2<-recode(df.omit.na$st2,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$st3<-recode(df.omit.na$st3,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$st4<-recode(df.omit.na$st4,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$st5<-recode(df.omit.na$st5,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$st6<-recode(df.omit.na$st6,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$st7<-recode(df.omit.na$st7,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$pt1<-recode(df.omit.na$pt1,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$pt2<-recode(df.omit.na$pt2,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$pt3<-recode(df.omit.na$pt3,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$pt4<-recode(df.omit.na$pt4,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$pt5<-recode(df.omit.na$pt5,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$pt6<-recode(df.omit.na$pt6,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$pt7<-recode(df.omit.na$pt7,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$mp1<-recode(df.omit.na$mp1,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$mp2<-recode(df.omit.na$mp2,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$mp3<-recode(df.omit.na$mp3,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$mp4<-recode(df.omit.na$mp4,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)df.omit.na$mp5<-recode(df.omit.na$mp5,"0=0;1=0;2=1;3=2;4=3;5=4",as.factor=FALSE)
13.2 Rasch-analys 1
itemnr
item
mp1
Jag har de resurser som behövs för att kunna utföra mina arbetsuppgifter.
mp2
Jag kan prioritera i vilken ordning mina arbetsuppgifter ska utföras.
mp3
Jag har tillräckligt med befogenheter för att kunna utföra mina arbetsuppgifter.
mp4
Jag kan påverka beslut som rör mina arbetsuppgifter.
mp5
Jag kan själv bestämma min arbetstakt.
st1
Jag vet vem jag ska vända mig till för att få stöd och hjälp med att utföra arbetet.
st2
Det finns personer på mitt arbete som jag kan prata förtroligt med.
st3
Vi samarbetar bra på min arbetsplats.
st4
Jag visar uppskattning till mina kollegor för deras arbetsinsatser.
st5
Mina kollegor visar uppskattning för mina arbetsinsatser.
st6
Jag får tekniskt stöd vid behov.
st7
Jag kan få handledning i mitt arbete om jag behöver det.
pt1
Jag har en positiv känsla när jag kommer till jobbet.
pt2
Jag känner mig delaktig i gemenskapen på min arbetsplats.
pt3
Jag kan begå misstag utan att det hålls emot mig.
pt4
Jag kan öppet diskutera olika typer av svårigheter.
pt5
Jag blir inkluderad även om jag tycker annorlunda.
RIitemfitPCM2(df.omit.na, samplesize =250, nsamples =32, cpu =8)
OutfitMSQ
InfitMSQ
OutfitZSTD
InfitZSTD
mp1
0.889
0.933
-0.883
-0.65
mp2
1.059
1.048
0.501
0.321
mp3
0.749
0.738
-2.529
-3.176
mp4
1.148
1.215
1.415
2.054
mp5
1.14
1.083
1.377
0.884
st1
1.358
1.239
3.482
2.542
st2
1.348
1.291
3.051
2.987
st3
0.776
0.764
-2.261
-2.642
st4
0.826
0.812
-1.412
-1.932
st5
0.961
0.877
-0.391
-1.152
st6
0.787
0.777
-2.132
-2.567
st7
0.668
0.703
-3.349
-3.351
pt1
0.702
0.717
-2.9
-3.239
pt2
0.637
0.635
-4.085
-4.399
pt3
0.961
0.96
-0.652
-0.293
pt4
1.117
1.132
1.231
1.259
pt5
0.947
0.952
-0.496
-0.369
pt6
0.961
0.944
-0.288
-0.498
pt7
1.351
1.299
3.443
2.971
Code
RIpcmPCA(na.omit(df.omit.na))
PCA of Rasch model residuals
Eigenvalues
3.18
2.07
1.72
1.45
1.30
Code
RIresidcorr(df.omit.na, cutoff =0.2)
mp1
mp2
mp3
mp4
mp5
st1
st2
st3
st4
st5
st6
st7
pt1
pt2
pt3
pt4
pt5
pt6
pt7
mp1
mp2
0.03
mp3
-0.08
0.16
mp4
-0.19
0.04
0.12
mp5
-0.17
0.08
0.05
0.46
st1
0.14
-0.11
-0.16
-0.11
-0.08
st2
0.3
-0.07
-0.11
-0.05
-0.1
0.16
st3
-0.1
-0.12
0
-0.16
-0.19
-0.11
-0.16
st4
-0.22
-0.03
0.07
-0.09
-0.03
-0.19
-0.25
0.31
st5
-0.14
-0.06
-0.04
-0.16
-0.13
-0.11
-0.22
0.03
0.2
st6
-0.12
0.04
0.06
-0.13
-0.16
-0.18
-0.24
0.06
0.16
0.35
st7
-0.14
0.04
0.08
-0.14
-0.08
-0.24
-0.26
0.02
0.31
0.38
0.44
pt1
-0.11
-0.06
-0.11
-0.08
0.14
-0.27
-0.23
0.04
0.11
0.05
0.16
0.25
pt2
-0.14
-0.12
-0.09
-0.12
-0.02
-0.23
-0.2
0.07
0.13
0
0.12
0.23
0.48
pt3
0.07
-0.11
-0.08
-0.14
-0.18
0.08
0.01
-0.08
-0.27
-0.16
-0.22
-0.23
-0.12
-0.04
pt4
-0.16
-0.18
-0.05
0.04
-0.07
-0.03
-0.08
-0.11
-0.22
-0.12
-0.24
-0.32
-0.23
-0.18
0.14
pt5
-0.07
-0.21
-0.07
-0.06
-0.15
-0.01
-0.1
0.02
-0.04
-0.16
-0.24
-0.14
-0.12
-0.04
0.02
0.13
pt6
-0.02
-0.24
-0.14
-0.13
-0.23
-0.07
-0.06
0
-0.18
-0.22
-0.15
-0.19
-0.12
0
0.05
0.13
0.37
pt7
-0.03
-0.14
-0.22
-0.15
-0.16
0.02
0
-0.1
-0.28
-0.15
-0.25
-0.34
-0.22
-0.23
0.22
0.35
-0.01
0.22
Note:
Relative cut-off value (highlighted in red) is 0.15, which is 0.2 above the average correlation.
Code
RIloadLoc(df.omit.na)
Code
RIitemCats(df.omit.na, items ="all")
Code
# increase fig-height above as needed, if you have many itemsRItargeting(df.omit.na, xlim =c(-5,5))
Code
RIitemHierarchy(df.omit.na)
Analysens utfall indikerar flertalet psykometriska problem, vi börjar med att ta bort st7, pt1 och pt2 som visar låg item fit och residualkorrelationer.
Code
# create vector with eliminated itemsremoved_items <-c("st7", "pt1", "pt2")# select all items except those removeddf2 <- df.omit.na %>%select(!all_of(removed_items))
13.3 Rasch-analys 2
itemnr
item
mp1
Jag har de resurser som behövs för att kunna utföra mina arbetsuppgifter.
mp2
Jag kan prioritera i vilken ordning mina arbetsuppgifter ska utföras.
mp3
Jag har tillräckligt med befogenheter för att kunna utföra mina arbetsuppgifter.
mp4
Jag kan påverka beslut som rör mina arbetsuppgifter.
mp5
Jag kan själv bestämma min arbetstakt.
st1
Jag vet vem jag ska vända mig till för att få stöd och hjälp med att utföra arbetet.
st2
Det finns personer på mitt arbete som jag kan prata förtroligt med.
st3
Vi samarbetar bra på min arbetsplats.
st4
Jag visar uppskattning till mina kollegor för deras arbetsinsatser.
st5
Mina kollegor visar uppskattning för mina arbetsinsatser.
st6
Jag får tekniskt stöd vid behov.
pt3
Jag kan begå misstag utan att det hålls emot mig.
pt4
Jag kan öppet diskutera olika typer av svårigheter.
pt5
Jag blir inkluderad även om jag tycker annorlunda.
RIitemfitPCM2(df2, samplesize =250, nsamples =32, cpu =8)
OutfitMSQ
InfitMSQ
OutfitZSTD
InfitZSTD
mp3
0.718
0.706
-3.23
-3.512
mp4
1.073
1.083
0.898
0.819
st1
0.957
0.933
-0.539
-0.888
st2
0.954
0.95
-0.423
-0.597
st5
0.971
0.927
-0.14
-0.676
pt3
0.796
0.795
-2.469
-2.29
pt4
0.945
0.902
-0.445
-0.998
pt5
0.849
0.824
-1.733
-1.85
Code
RIpcmPCA(na.omit(df2))
PCA of Rasch model residuals
Eigenvalues
1.55
1.42
1.19
1.04
1.02
Code
RIresidcorr(df2, cutoff =0.2)
mp3
mp4
st1
st2
st5
pt3
pt4
pt5
mp3
mp4
0.1
st1
-0.25
-0.24
st2
-0.18
-0.16
-0.02
st5
0.06
-0.15
-0.15
-0.25
pt3
-0.1
-0.22
-0.05
-0.13
-0.14
pt4
-0.12
-0.06
-0.21
-0.27
-0.15
0.04
pt5
-0.07
-0.13
-0.12
-0.23
-0.12
-0.05
0.04
Note:
Relative cut-off value (highlighted in red) is 0.081, which is 0.2 above the average correlation.
Code
RIloadLoc(df2)
Code
# increase fig-height above as needed, if you have many itemsRItargeting(df2)
Code
RIitemHierarchy(df2)
Det ser generellt bra ut. mp3 och mp4 har en något hög residualkorrelation, men eftersom denna ligger strax över tröskelvärdet är det oklart om ytterligare en item-exkludering är motiverad. Till att börja med går vi vidare och undersöker hur DIF och reliabilitet ser ut när mp3 och mp4 inkluderas.
13.6.0.1 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'")
Det finns en signifikant och hyfsat substatiell DIF för hemarbete (mp4). Vi går vidare och undersöker reliabiliteten.
13.6.0.2 Reliability
Code
RItif(df2, lo =-5, hi =5)
Reliabiliteten ser mycket bra ut. Dock har mp4 både en substantiell DIF-effekt samt en något hög residualkorrelation med mp3. Vi testar därför att exkludera mp4.
Code
# create vector with eliminated items OBS testa att byt till pt7removed_items <-c("st6", "st7", "mp5", "mp2", "st4", "pt7", "pt1", "pt6", "pt2", "st3", "mp1", "mp4")# select all items except those removeddf2 <- df.omit.na %>%select(!all_of(removed_items))
13.7 Rasch-analys 6
itemnr
item
mp3
Jag har tillräckligt med befogenheter för att kunna utföra mina arbetsuppgifter.
st1
Jag vet vem jag ska vända mig till för att få stöd och hjälp med att utföra arbetet.
st2
Det finns personer på mitt arbete som jag kan prata förtroligt med.
st5
Mina kollegor visar uppskattning för mina arbetsinsatser.
pt3
Jag kan begå misstag utan att det hålls emot mig.
pt4
Jag kan öppet diskutera olika typer av svårigheter.
pt5
Jag blir inkluderad även om jag tycker annorlunda.
RIitemfitPCM2(df2, samplesize =250, nsamples =32, cpu =8)
OutfitMSQ
InfitMSQ
OutfitZSTD
InfitZSTD
mp3
0.779
0.762
-2.362
-2.683
st1
0.943
0.918
-0.637
-0.953
st2
0.962
0.954
-0.401
-0.447
st5
0.984
0.938
-0.161
-0.609
pt3
0.775
0.782
-2.524
-2.582
pt4
0.963
0.93
-0.43
-0.717
pt5
0.849
0.838
-1.581
-1.813
Code
RIpcmPCA(na.omit(df2))
PCA of Rasch model residuals
Eigenvalues
1.52
1.36
1.13
1.08
0.96
Code
RIresidcorr(df2, cutoff =0.2)
mp3
st1
st2
st5
pt3
pt4
pt5
mp3
st1
-0.25
st2
-0.17
-0.06
st5
0.06
-0.19
-0.28
pt3
-0.11
-0.1
-0.17
-0.18
pt4
-0.11
-0.24
-0.28
-0.16
0.02
pt5
-0.07
-0.16
-0.25
-0.14
-0.08
0.03
Note:
Relative cut-off value (highlighted in red) is 0.062, which is 0.2 above the average correlation.
Code
RIloadLoc(df2)
Code
# increase fig-height above as needed, if you have many itemsRItargeting(df2)
Code
RIitemHierarchy(df2)
Analysernas utfall ser bra ut - det finns inte längre någon residualkorrelation över det rekommenderade tröskelvärdet. Vi går vidare och undersöker DIF och reliabilitet utan mp4.
13.7.0.1 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'")