2  Rasch analysis

Author
Affiliation

Magnus Johansson

Published

2024-02-08

Code
# one package below requires that you use devtools to install them manually:
# first install devtools by
# install.packages('devtools')

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(psychotree)
library(matrixStats)
library(reshape)
library(knitr)
library(patchwork)
library(formattable) 
library(glue)

### optional libraries
#library(TAM)
#library(skimr)

### some commands exist in multiple packages, here we define preferred ones that are frequently used
select <- dplyr::select
count <- dplyr::count
recode <- car::recode
rename <- dplyr::rename

source("RISE_theme.R")
Code
### other, bigger dataset from [@echeverría2017]
### read file
df.all <- read_excel("data/data_sMHCSF_Echeverria2017.xlsx")
df <- df.all
### create dif variables
dif.sex <- factor(df$Sex)
df$Sex <- NULL

### Load item information
# make sure that variable names in df match with itemlabels$itemnr
itemlabels <- read_excel("data/itemlabels_MHC_SF.xlsx") %>% 
  mutate(item = str_squish(item))

names(df) <- itemlabels$itemnr

df <- df %>%
  mutate(across(everything(), ~ car::recode(.x,"'Never'=0;'1 or 2 times a month'=1;'About 1 time a week'=2;'About 2 or 3 times a week'=3;'Almost daily'=4;'Daily'=5", as.factor = FALSE)))

For an overview of the different aspects, model metrics, and cutoff values reported in a Rasch analysis, please see Johansson et al. (2023).

2.1 Rasch analysis 1

The eRm package, which uses Conditional Maximum Likelihood (CML) estimation, will be used primarily. For this analysis of polytomous data, the Partial Credit Model will be used.

itemnr item
mhc1 Happy
mhc2 Interested in life
mhc3 Satisfied with your life
mhc4 That you had something important to contribute to society?
mhc5 That you belonged to a community?
mhc6 That our society is becoming a better place for people like you?
mhc7 That people are basically good?
mhc8 That the way our society works makes sense to you?
mhc9 That you liked most parts of your personality?
mhc10 Good at managing the responsibilities of your daily life?
mhc11 That you had warm and trusting relationships with others?
mhc12 That you had experiences that challenged you to grow and become a better person?
mhc13 Confident to think or express your own ideas and opinions?
mhc14 That your life has a sense of direction or meaning to it?
Code
RIitemfitPCM2(df, 250, 24)
OutfitMSQ InfitMSQ OutfitZSTD InfitZSTD
mhc1 0.894 0.889 -1.202 -1.172
mhc2 0.723 0.788 -2.499 -2.1
mhc3 0.784 0.802 -2.26 -1.882
mhc4 1.086 1.059 1.17 0.088
mhc5 1.612 1.44 4.028 4.278
mhc6 0.951 0.952 -0.206 -0.748
mhc7 1.153 1.138 1.337 1.518
mhc8 1.096 1.089 0.593 1.112
mhc9 0.815 0.815 -1.736 -2.163
mhc10 0.899 0.913 -1.033 -0.966
mhc11 0.806 0.818 -2.063 -1.769
mhc12 0.821 0.822 -1.832 -1.918
mhc13 0.921 0.934 -0.792 -0.787
mhc14 0.671 0.707 -3.011 -3.264
Code
RIpcmPCA(df)

PCA of Rasch model residuals

Eigenvalues
2.51
1.67
1.40
1.15
1.02
Code
RIresidcorr(df, cutoff = 0.2)
mhc1 mhc2 mhc3 mhc4 mhc5 mhc6 mhc7 mhc8 mhc9 mhc10 mhc11 mhc12 mhc13 mhc14
mhc1
mhc2 0.2
mhc3 0.27 0.3
mhc4 -0.13 -0.07 -0.13
mhc5 -0.14 -0.14 -0.2 0.07
mhc6 -0.17 -0.13 -0.17 -0.02 0.04
mhc7 -0.13 -0.13 -0.15 -0.14 -0.05 0.22
mhc8 -0.17 -0.14 -0.13 -0.14 -0.1 0.34 0.3
mhc9 -0.03 -0.09 -0.09 -0.13 -0.23 -0.23 -0.17 -0.18
mhc10 -0.07 -0.1 0 -0.14 -0.26 -0.22 -0.19 -0.15 0.15
mhc11 0 -0.1 -0.08 -0.19 -0.09 -0.23 -0.13 -0.21 0.06 0.07
mhc12 -0.04 -0.11 -0.11 -0.03 -0.17 -0.21 -0.23 -0.23 0.04 0.01 0.17
mhc13 -0.1 -0.12 -0.14 -0.14 -0.2 -0.27 -0.22 -0.26 0.24 0.11 0.09 0.12
mhc14 -0.06 0.08 0.06 -0.06 -0.22 -0.24 -0.28 -0.21 0.02 0.09 0 0.09 0.15
Note:
Relative cut-off value (highlighted in red) is 0.132, which is 0.2 above the average correlation.
Code
RIloadLoc(df)

Code
mirt(df, model=1, itemtype='Rasch', verbose = FALSE) %>% 
  plot(type="trace", as.table = TRUE, 
       theta_lim = c(-6,6))

Code
# increase fig-height above as needed, if you have many items
RItargeting(df)

Code
RIitemHierarchy(df)

Code
RIdifTable(df,dif.sex)

Item 2 3 Mean location StDev MaxDiff
mhc1 -0.389 -0.464 -0.426 0.053 0.076
mhc2 -0.850 -0.984 -0.917 0.095 0.134
mhc3 -0.245 -0.334 -0.290 0.063 0.090
mhc4 0.350 0.387 0.369 0.026 0.037
mhc5 0.590 0.595 0.592 0.004 0.006
mhc6 1.025 1.121 1.073 0.067 0.095
mhc7 0.435 0.454 0.445 0.013 0.019
mhc8 0.823 0.882 0.852 0.042 0.059
mhc9 -0.133 -0.079 -0.106 0.039 0.055
mhc10 -0.293 -0.302 -0.297 0.006 0.009
mhc11 -0.394 -0.464 -0.429 0.050 0.071
mhc12 -0.175 -0.278 -0.227 0.073 0.103
mhc13 -0.452 -0.264 -0.358 0.133 0.188
mhc14 -0.292 -0.269 -0.280 0.017 0.024

Multidimensionality is indicated by PCA of residuals and residual correlations. Also, item 5 shows high item fit (above MSQ 1.3). Loadings on first residual contrast indicates that items 5-8 form a separate cluster, which is largely in agreement with the residual correlation matrix (items 6-8 are correlated, but not item 5). Items 1-3 are also correlated.

All items have disordered thresholds except 1 and 2, and both of those have very small distances between thresholds.

We’ll remove one item from each cluster, based on the level of correlations, which results in the removal of items 3 and 8.

Aspects to consider when choosing between two items with strong residual correlations include:

  • item fit
  • item targeting properties
  • ordering of thresholds
  • DIF

Also, we’ll merge the two middle response categories:

  • ‘About 1 time a week’,
  • ‘About 2 or 3 times a week’,

2.2 Rasch 2

Code
removed.items <- c("mhc3","mhc8")

df2 <- df %>% 
  select(!any_of(removed.items)) %>% 
  mutate(across(everything(), ~ car::recode(.x,"3=2;4=3;5=4")))
RIbarstack(df2)

itemnr item
mhc1 Happy
mhc2 Interested in life
mhc4 That you had something important to contribute to society?
mhc5 That you belonged to a community?
mhc6 That our society is becoming a better place for people like you?
mhc7 That people are basically good?
mhc9 That you liked most parts of your personality?
mhc10 Good at managing the responsibilities of your daily life?
mhc11 That you had warm and trusting relationships with others?
mhc12 That you had experiences that challenged you to grow and become a better person?
mhc13 Confident to think or express your own ideas and opinions?
mhc14 That your life has a sense of direction or meaning to it?
Code
RIitemfitPCM2(df2, 250, 24)
OutfitMSQ InfitMSQ OutfitZSTD InfitZSTD
mhc1 0.887 0.886 -1.041 -1.41
mhc2 0.769 0.82 -2.018 -2.234
mhc4 1.023 1.019 -0.075 0.244
mhc5 1.448 1.381 3.173 3.411
mhc6 1.041 1.049 0.324 0.659
mhc7 1.184 1.171 2.218 1.896
mhc9 0.809 0.8 -2.448 -2.642
mhc10 0.908 0.901 -0.991 -0.967
mhc11 0.772 0.783 -2.461 -2.51
mhc12 0.781 0.782 -2.523 -2.555
mhc13 0.871 0.88 -1.455 -1.485
mhc14 0.667 0.691 -3.134 -3.536
Code
RIpcmPCA(df2)

PCA of Rasch model residuals

Eigenvalues
2.18
1.36
1.29
1.18
1.03
Code
RIresidcorr(df2, cutoff = 0.2)
mhc1 mhc2 mhc4 mhc5 mhc6 mhc7 mhc9 mhc10 mhc11 mhc12 mhc13 mhc14
mhc1
mhc2 0.18
mhc4 -0.14 -0.08
mhc5 -0.16 -0.15 0.04
mhc6 -0.14 -0.11 0.01 0.06
mhc7 -0.1 -0.1 -0.13 -0.04 0.26
mhc9 -0.02 -0.08 -0.16 -0.28 -0.21 -0.16
mhc10 -0.07 -0.07 -0.18 -0.29 -0.2 -0.17 0.11
mhc11 0 -0.08 -0.22 -0.14 -0.24 -0.13 0.02 0.03
mhc12 -0.03 -0.1 -0.08 -0.22 -0.21 -0.22 0 -0.01 0.14
mhc13 -0.1 -0.11 -0.2 -0.25 -0.29 -0.21 0.19 0.09 0.04 0.06
mhc14 -0.03 0.09 -0.08 -0.25 -0.23 -0.25 0.01 0.07 -0.02 0.05 0.09
Note:
Relative cut-off value (highlighted in red) is 0.121, which is 0.2 above the average correlation.
Code
RIloadLoc(df2)

Code
mirt(df2, model=1, itemtype='Rasch', verbose = FALSE) %>% 
  plot(type="trace", as.table = TRUE, 
       theta_lim = c(-6,6))

Code
# increase fig-height above as needed, if you have many items
RItargeting(df2)

Code
RIitemHierarchy(df2)

Code
RIdifTable(df2,dif.sex)

Item 2 3 Mean location StDev MaxDiff
mhc1 -0.411 -0.500 -0.455 0.063 0.089
mhc2 -0.991 -1.149 -1.070 0.112 0.158
mhc4 0.491 0.534 0.513 0.030 0.043
mhc5 0.778 0.796 0.787 0.013 0.018
mhc6 1.313 1.412 1.362 0.070 0.099
mhc7 0.594 0.602 0.598 0.005 0.008
mhc9 -0.097 -0.035 -0.066 0.044 0.062
mhc10 -0.300 -0.303 -0.302 0.002 0.003
mhc11 -0.420 -0.508 -0.464 0.062 0.088
mhc12 -0.156 -0.292 -0.224 0.096 0.136
mhc13 -0.502 -0.269 -0.385 0.165 0.233
mhc14 -0.300 -0.288 -0.294 0.008 0.012

Item 5 still has high levels of item fit, and disordered response categories. Most items have less issues with disordered response categories, but the two lowest are very close together for several items.

Some residual correlations remain problematic, particularly between items 6 and 7, and the PCA of residuals is above 2.0.

We’ll remove items 5 and 6 (the latter due to issues with disordered response categories compared to item 7),

2.3 Rasch 3

Code
removed.items <- c("mhc3","mhc8","mhc5","mhc6")

df2 <- df %>% 
  select(!any_of(removed.items)) %>% 
  mutate(across(everything(), ~ car::recode(.x,"3=2;4=3;5=4")))
#RIbarstack(df2)
itemnr item
mhc1 Happy
mhc2 Interested in life
mhc4 That you had something important to contribute to society?
mhc7 That people are basically good?
mhc9 That you liked most parts of your personality?
mhc10 Good at managing the responsibilities of your daily life?
mhc11 That you had warm and trusting relationships with others?
mhc12 That you had experiences that challenged you to grow and become a better person?
mhc13 Confident to think or express your own ideas and opinions?
mhc14 That your life has a sense of direction or meaning to it?
Code
RIitemfitPCM2(df2, 250, 24)
OutfitMSQ InfitMSQ OutfitZSTD InfitZSTD
mhc1 0.91 0.912 -0.858 -1.111
mhc2 0.797 0.858 -1.657 -1.916
mhc4 1.202 1.193 2.086 1.828
mhc7 1.396 1.379 4.182 4.48
mhc9 0.793 0.783 -2.609 -2.566
mhc10 0.888 0.888 -1.203 -1.28
mhc11 0.788 0.798 -2.791 -2.527
mhc12 0.777 0.783 -2.363 -2.647
mhc13 0.847 0.859 -1.416 -1.646
mhc14 0.647 0.679 -3.349 -3.881
Code
RIpcmPCA(df2)

PCA of Rasch model residuals

Eigenvalues
1.61
1.30
1.26
1.23
1.05
Code
RIresidcorr(df2, cutoff = 0.2)
mhc1 mhc2 mhc4 mhc7 mhc9 mhc10 mhc11 mhc12 mhc13 mhc14
mhc1
mhc2 0.15
mhc4 -0.15 -0.08
mhc7 -0.09 -0.08 -0.06
mhc9 -0.09 -0.16 -0.19 -0.16
mhc10 -0.14 -0.14 -0.21 -0.18 0.02
mhc11 -0.06 -0.14 -0.23 -0.11 -0.06 -0.05
mhc12 -0.1 -0.16 -0.09 -0.22 -0.1 -0.11 0.07
mhc13 -0.19 -0.19 -0.23 -0.22 0.1 -0.01 -0.05 -0.03
mhc14 -0.1 0.03 -0.1 -0.25 -0.1 -0.03 -0.11 -0.04 -0.02
Note:
Relative cut-off value (highlighted in red) is 0.101, which is 0.2 above the average correlation.
Code
RIloadLoc(df2)

Code
mirt(df2, model=1, itemtype='Rasch', verbose = FALSE) %>% 
  plot(type="trace", as.table = TRUE, 
       theta_lim = c(-6,6))

Code
# increase fig-height above as needed, if you have many items
RItargeting(df2)

Code
RIitemHierarchy(df2)

Code
RIdifTable(df2,dif.sex)

Item 2 3 Mean location StDev MaxDiff
mhc1 -0.190 -0.281 -0.235 0.064 0.091
mhc2 -0.826 -0.984 -0.905 0.112 0.158
mhc4 0.739 0.808 0.774 0.049 0.070
mhc7 0.858 0.883 0.871 0.018 0.025
mhc9 0.117 0.195 0.156 0.055 0.078
mhc10 -0.098 -0.092 -0.095 0.005 0.007
mhc11 -0.223 -0.307 -0.265 0.059 0.083
mhc12 0.054 -0.078 -0.012 0.093 0.131
mhc13 -0.315 -0.059 -0.187 0.181 0.256
mhc14 -0.115 -0.087 -0.101 0.020 0.028

PCA is now under 2.0. The residual correlation between items 1 and 2 remains at a relatively high level (we’ll remove item 2, since item 1 has better targeting). Item 7 has high item fit and loadings/locations plot also shows it being deviant in terms of loading.

Item 4 has disordered response categories for the two lowest.

Item 14 is somewhat low in item fit.

2.4 Rasch 4

removed.items <- c("mhc3","mhc8","mhc5","mhc6","mhc7","mhc2")

df2 <- df %>% 
  select(!any_of(removed.items)) %>% 
  mutate(across(everything(), ~ car::recode(.x,"3=2;4=3;5=4"))) %>% 
  mutate(mhc4 = car::recode(mhc4,"1=0;2=1;3=2;4=3"))
RIbarstack(df2)

itemnr item
mhc1 Happy
mhc4 That you had something important to contribute to society?
mhc9 That you liked most parts of your personality?
mhc10 Good at managing the responsibilities of your daily life?
mhc11 That you had warm and trusting relationships with others?
mhc12 That you had experiences that challenged you to grow and become a better person?
mhc13 Confident to think or express your own ideas and opinions?
mhc14 That your life has a sense of direction or meaning to it?
Code
RIitemfitPCM2(df2, 250, 24)
OutfitMSQ InfitMSQ OutfitZSTD InfitZSTD
mhc1 1.029 1.027 0.643 0.314
mhc4 1.207 1.194 1.818 1.822
mhc9 0.814 0.807 -2.285 -2.537
mhc10 0.919 0.92 -0.971 -1.016
mhc11 0.829 0.842 -1.912 -1.793
mhc12 0.789 0.799 -2.099 -2.107
mhc13 0.85 0.856 -1.809 -1.515
mhc14 0.7 0.727 -2.819 -3.209
Code
RIpcmPCA(df2)

PCA of Rasch model residuals

Eigenvalues
1.43
1.28
1.18
1.14
1.07
Code
RIresidcorr(df2, cutoff = 0.2)
mhc1 mhc4 mhc9 mhc10 mhc11 mhc12 mhc13 mhc14
mhc1
mhc4 -0.11
mhc9 -0.11 -0.19
mhc10 -0.17 -0.21 -0.05
mhc11 -0.07 -0.23 -0.13 -0.12
mhc12 -0.13 -0.1 -0.19 -0.2 0.01
mhc13 -0.22 -0.23 0.02 -0.1 -0.13 -0.14
mhc14 -0.1 -0.09 -0.18 -0.09 -0.17 -0.12 -0.11
Note:
Relative cut-off value (highlighted in red) is 0.069, which is 0.2 above the average correlation.
Code
RIloadLoc(df2)

Code
mirt(df2, model=1, itemtype='Rasch', verbose = FALSE) %>% 
  plot(type="trace", as.table = TRUE, 
       theta_lim = c(-6,6))

Code
# increase fig-height above as needed, if you have many items
RItargeting(df2)

Code
RIitemHierarchy(df2)

2.5 DIF-analysis

2.5.1 Gender

itemnr item
mhc1 Happy
mhc4 That you had something important to contribute to society?
mhc9 That you liked most parts of your personality?
mhc10 Good at managing the responsibilities of your daily life?
mhc11 That you had warm and trusting relationships with others?
mhc12 That you had experiences that challenged you to grow and become a better person?
mhc13 Confident to think or express your own ideas and opinions?
mhc14 That your life has a sense of direction or meaning to it?
Code
RIdifTable(df2, dif.sex)

Item 2 3 Mean location StDev MaxDiff
mhc1 -0.256 -0.391 -0.324 0.095 0.135
mhc4 1.274 1.412 1.343 0.097 0.138
mhc9 0.065 0.120 0.093 0.039 0.055
mhc10 -0.169 -0.195 -0.182 0.018 0.026
mhc11 -0.307 -0.428 -0.367 0.085 0.120
mhc12 -0.002 -0.174 -0.088 0.122 0.172
mhc13 -0.410 -0.159 -0.285 0.178 0.251
mhc14 -0.195 -0.186 -0.191 0.006 0.009
Code
RIdifFigure(df2, dif.sex)

Code
RIdifFigThresh(df2, dif.sex)

2.6 Reliability

Code
RItif(df2)

2.7 Person infit ZSTD

Code
RIpfit(df2)

2.8 Item parameters

Code
RIitemparams(df)
Threshold 1 Threshold 2 Threshold 3 Threshold 4 Threshold 5 Item location
mhc1 -2.40 -0.52 -0.15 0.37 2.36 -0.07
mhc2 -2.24 -0.62 -0.44 -0.16 0.58 -0.58
mhc3 -1.22 -0.11 -0.09 0.07 1.66 0.06
mhc4 -0.03 0.63 0.42 0.73 1.98 0.75
mhc5 0.98 0.87 0.62 0.88 1.47 0.96
mhc6 0.58 1.17 0.97 1.52 3.06 1.46
mhc7 -0.81 0.75 0.48 0.92 2.75 0.82
mhc8 0.18 1.13 0.74 1.35 2.77 1.23
mhc9 -1.17 0.17 0.00 0.31 2.08 0.28
mhc10 -1.30 0.04 -0.22 0.24 1.59 0.07
mhc11 -1.60 -0.13 -0.24 0.20 1.42 -0.07
mhc12 -1.25 0.05 0.03 0.41 1.38 0.12
mhc13 -1.08 -0.02 -0.07 0.23 1.23 0.06
mhc14 -0.85 0.42 0.02 0.07 0.82 0.1
Note:
Item location is the average of the thresholds for each item.

2.9 Transformation table

Code
RIscoreSE(df2, score_range = c(-4,5))
Ordinal sum score Logit score Logit std.error
0 -4.000 1.348
1 -3.034 0.878
2 -2.456 0.698
3 -2.055 0.606
4 -1.738 0.550
5 -1.470 0.514
6 -1.231 0.489
7 -1.011 0.472
8 -0.803 0.461
9 -0.602 0.454
10 -0.405 0.450
11 -0.208 0.448
12 -0.009 0.448
13 0.191 0.448
14 0.393 0.449
15 0.596 0.449
16 0.798 0.449
17 0.999 0.448
18 1.198 0.447
19 1.396 0.448
20 1.593 0.450
21 1.791 0.453
22 1.994 0.460
23 2.203 0.470
24 2.422 0.484
25 2.657 0.504
26 2.914 0.531
27 3.205 0.570
28 3.547 0.627
29 3.976 0.719
30 4.581 0.900
31 5.000 1.068

2.10 Ordinal/interval figure

Code
RIscoreSE(df2, score_range = c(-4,5),
          output = "figure")

2.11 Software used

Code
pkgs <- cite_packages(cite.tidyverse = TRUE, 
                      output = "table",
                      bib.file = "grateful-refs.bib",
                      include.RStudio = TRUE,
                      out.dir = getwd())
formattable(pkgs, 
            table.attr = 'class=\"table table-striped\" style="font-size: 15px; font-family: Lato; width: 80%"')
Package Version Citation
base 4.3.2 R Core Team (2023)
car 3.1.2 Fox and Weisberg (2019)
cowplot 1.1.2 Wilke (2023)
eRm 1.0.4 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)
formattable 0.2.1 Ren and Russell (2021)
ggrepel 0.9.5 Slowikowski (2024)
glue 1.7.0 Hester and Bryan (2024)
kableExtra 1.3.4 Zhu (2021)
knitr 1.45 Xie (2014); Xie (2015); Xie (2023)
lavaan 0.6.17 Rosseel (2012)
lavaanExtra 0.2.0 Thériault (2023)
lavaanPlot 0.6.2 Lishinski (2021)
matrixStats 1.2.0 Bengtsson (2023)
mirt 1.41 Chalmers (2012)
mokken 3.1.0 Van der Ark (2007); Van der Ark (2012)
patchwork 1.2.0 Pedersen (2024)
psych 2.3.12 William Revelle (2023)
psychotree 0.16.0 Trepte and Verbeet (2010); Strobl, Wickelmaier, and Zeileis (2011); Strobl, Kopf, and Zeileis (2015); Komboz, Zeileis, and Strobl (2018); Wickelmaier and Zeileis (2018)
reshape 0.8.9 Wickham (2007)
RISEkbmRasch 0.1.31.0 Johansson (2024)
rmarkdown 2.25 Xie, Allaire, and Grolemund (2018); Xie, Dervieux, and Riederer (2020); Allaire et al. (2023)
tidyverse 2.0.0 Wickham et al. (2019)

2.12 References

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.
Bengtsson, Henrik. 2023. matrixStats: Functions That Apply to Rows and Columns of Matrices (and to Vectors). https://CRAN.R-project.org/package=matrixStats.
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 44. https://doi.org/10.1177/0146621619835501.
Fox, John, and Sanford Weisberg. 2019. An R Companion to Applied Regression. Third. Thousand Oaks CA: Sage. https://socialsciences.mcmaster.ca/jfox/Books/Companion/.
Hatzinger, Reinhold, and Thomas Rusch. 2009. “IRT Models with Relaxed Assumptions in eRm: A Manual-Like Instruction.” Psychology Science Quarterly 51.
Hester, Jim, and Jennifer Bryan. 2024. glue: Interpreted String Literals. https://CRAN.R-project.org/package=glue.
Johansson, Magnus. 2024. RISEkbmRasch: Psychometric Analysis in r with Rasch Measurement Theory. https://github.com/pgmj/RISEkbmRasch.
Johansson, Magnus, Marit Preuter, Simon Karlsson, Marie-Louise Möllerberg, Hanna Svensson, and Jeanette Melin. 2023. “Valid and Reliable? Basic and Expanded Recommendations for Psychometric Reporting and Quality Assessment.” https://doi.org/10.31219/osf.io/3htzc.
Koller, Ingrid, Marco 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.
Lishinski, Alex. 2021. lavaanPlot: Path Diagrams for Lavaan Models via DiagrammeR. https://CRAN.R-project.org/package=lavaanPlot.
Mair, Patrick, and Reinhold Hatzinger. 2007a. “CML Based Estimation of Extended Rasch Models with the eRm Package in r.” Psychology Science 49. https://doi.org/10.18637/jss.v020.i09.
———. 2007b. “Extended Rasch Modeling: The eRm Package for the Application of IRT Models in r.” Journal of Statistical Software 20. https://doi.org/10.18637/jss.v020.i09.
Pedersen, Thomas Lin. 2024. patchwork: The Composer of Plots. https://CRAN.R-project.org/package=patchwork.
R Core Team. 2023. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Ren, Kun, and Kenton Russell. 2021. formattable: Create Formattable Data Structures. https://CRAN.R-project.org/package=formattable.
Rosseel, Yves. 2012. lavaan: An R Package for Structural Equation Modeling.” Journal of Statistical Software 48 (2): 1–36. https://doi.org/10.18637/jss.v048.i02.
Rusch, Thomas, Marco 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.
Slowikowski, Kamil. 2024. ggrepel: Automatically Position Non-Overlapping Text Labels with ggplot2. https://CRAN.R-project.org/package=ggrepel.
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.
Thériault, Rémi. 2023. lavaanExtra: Convenience Functions for Lavaan.” Journal of Open Source Software 8 (90): 5701. https://doi.org/10.21105/joss.05701.
Trepte, Sabine, and Markus Verbeet, eds. 2010. Allgemeinbildung in Deutschland – Erkenntnisse Aus Dem SPIEGEL Studentenpisa-Test. Wiesbaden: VS Verlag.
Van der Ark, L. Andries. 2007. “Mokken Scale Analysis in R.” Journal of Statistical Software 20 (11): 1–19. https://doi.org/10.18637/jss.v020.i11.
———. 2012. “New Developments in Mokken Scale Analysis in R.” Journal of Statistical Software 48 (5): 1–27. https://doi.org/10.18637/jss.v048.i05.
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.
Wilke, Claus O. 2023. cowplot: Streamlined Plot Theme and Plot Annotations for ggplot2. https://CRAN.R-project.org/package=cowplot.
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.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.
Zhu, Hao. 2021. kableExtra: Construct Complex Table with kable and Pipe Syntax. https://CRAN.R-project.org/package=kableExtra.