Init

library(kirkegaard)
## Loading required package: tidyverse
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0      ✔ purrr   0.3.5 
## ✔ tibble  3.1.8      ✔ dplyr   1.0.10
## ✔ tidyr   1.2.1      ✔ stringr 1.4.1 
## ✔ readr   2.1.3      ✔ forcats 0.5.2 
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## Loading required package: magrittr
## 
## 
## Attaching package: 'magrittr'
## 
## 
## The following object is masked from 'package:purrr':
## 
##     set_names
## 
## 
## The following object is masked from 'package:tidyr':
## 
##     extract
## 
## 
## Loading required package: weights
## 
## Loading required package: Hmisc
## 
## Loading required package: lattice
## 
## Loading required package: survival
## 
## Loading required package: Formula
## 
## 
## Attaching package: 'Hmisc'
## 
## 
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## 
## 
## The following objects are masked from 'package:base':
## 
##     format.pval, units
## 
## 
## Loading required package: assertthat
## 
## 
## Attaching package: 'assertthat'
## 
## 
## The following object is masked from 'package:tibble':
## 
##     has_name
## 
## 
## Loading required package: psych
## 
## 
## Attaching package: 'psych'
## 
## 
## The following object is masked from 'package:Hmisc':
## 
##     describe
## 
## 
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## 
## 
## 
## Attaching package: 'kirkegaard'
## 
## 
## The following object is masked from 'package:psych':
## 
##     rescale
## 
## 
## The following object is masked from 'package:assertthat':
## 
##     are_equal
## 
## 
## The following objects are masked from 'package:purrr':
## 
##     is_logical, is_numeric
## 
## 
## The following object is masked from 'package:base':
## 
##     +
load_packages(
  mirt
)
## Loading required package: stats4
theme_set(theme_bw())

options(
    digits = 3
)

Simple example items

n = 100000
n_items = 8

#slopes
set.seed(1)
a1 = c(
  seq(0.5, 2, length.out = n_items/2),
  rep(1, n_items/2)
)

#intercepts
i1 = c(
  rep(0, n_items/2),
  seq(-2, 2, length.out = n_items/2)
)

#simulate data twice
d = simdata(
  a1,
  i1,
  N = n,
  itemtype = "2PL",
  mu = 0
)

#fit mirt
mirt_fit = mirt(
  d,
  model = 1,
  itemtype = "2PL"
)
## 
Iteration: 1, Log-Lik: -471634.578, Max-Change: 0.36383
Iteration: 2, Log-Lik: -468612.052, Max-Change: 0.25731
Iteration: 3, Log-Lik: -467523.180, Max-Change: 0.17549
Iteration: 4, Log-Lik: -467152.843, Max-Change: 0.11856
Iteration: 5, Log-Lik: -467021.995, Max-Change: 0.08045
Iteration: 6, Log-Lik: -466972.436, Max-Change: 0.05455
Iteration: 7, Log-Lik: -466952.399, Max-Change: 0.03764
Iteration: 8, Log-Lik: -466943.700, Max-Change: 0.02651
Iteration: 9, Log-Lik: -466939.670, Max-Change: 0.01880
Iteration: 10, Log-Lik: -466936.209, Max-Change: 0.00623
Iteration: 11, Log-Lik: -466935.981, Max-Change: 0.00609
Iteration: 12, Log-Lik: -466935.826, Max-Change: 0.00275
Iteration: 13, Log-Lik: -466935.783, Max-Change: 0.00179
Iteration: 14, Log-Lik: -466935.756, Max-Change: 0.00162
Iteration: 15, Log-Lik: -466935.737, Max-Change: 0.00154
Iteration: 16, Log-Lik: -466935.713, Max-Change: 0.00076
Iteration: 17, Log-Lik: -466935.705, Max-Change: 0.00024
Iteration: 18, Log-Lik: -466935.704, Max-Change: 0.00022
Iteration: 19, Log-Lik: -466935.703, Max-Change: 0.00019
Iteration: 20, Log-Lik: -466935.702, Max-Change: 0.00017
Iteration: 21, Log-Lik: -466935.702, Max-Change: 0.00016
Iteration: 22, Log-Lik: -466935.700, Max-Change: 0.00009
#scores
mirt_fit_scores = fscores(mirt_fit, full.scores = T, full.scores.SE = T)

d_mirt_scores = mirt_fit_scores %>% as_tibble() %>% bind_cols(
  total_score = rowSums(d)
) %>% rename(IRT = F1)

#plot items
mirt_fit %>% plot(type = "trace")

#empirical item data
item_stats = tibble(
  item = 1:8,
  difficulty = coef(mirt_fit, simplify = T) %>% .$items %>% .[, 2],
  slope = coef(mirt_fit, simplify = T) %>% .$items %>% .[, 1],
  loading = mirt_fit %>% summary() %>% .$rotF %>% as.vector()
)
##           F1     h2
## Item_1 0.281 0.0787
## Item_2 0.509 0.2596
## Item_3 0.663 0.4391
## Item_4 0.767 0.5881
## Item_5 0.499 0.2489
## Item_6 0.512 0.2618
## Item_7 0.500 0.2502
## Item_8 0.509 0.2589
## 
## SS loadings:  2.38 
## Proportion Var:  0.298 
## 
## Factor correlations: 
## 
##    F1
## F1  1
item_stats %>% df_round(2)

Simulate DIF items

n = 10000
n_items = 54

#slopes
set.seed(1)
a1 = runif(n_items, min = .5, max = 2)
a2 = a1
a2[25]
## [1] 0.901
a2[25] = 0 #item doesnt work for this group

#intercepts
i1 = rnorm(n_items, mean = -0.5, sd = 2)
i2 = i1
i2[10]
## [1] -1.29
i2[10] = 1 #item much harder for this group

#simulate data twice
d1 = simdata(
  a1,
  i1,
  N = n,
  itemtype = "2PL",
  mu = 0
)

d2 = simdata(
  a2,
  i2,
  N = n,
  itemtype = "2PL",
  mu = 1
)

#combine
d = bind_rows(
  d1 %>% set_names("item_" + 1:50),
  d2 %>% set_names("item_" + 1:50)
)

#fit mirt
mirt_fit = mirt(
  d,
  model = 1,
  itemtype = "2PL"
)
## 
Iteration: 1, Log-Lik: -494740.685, Max-Change: 1.30845
Iteration: 2, Log-Lik: -484418.365, Max-Change: 0.38969
Iteration: 3, Log-Lik: -483266.028, Max-Change: 0.18194
Iteration: 4, Log-Lik: -482848.923, Max-Change: 0.10302
Iteration: 5, Log-Lik: -482622.124, Max-Change: 0.07127
Iteration: 6, Log-Lik: -482489.343, Max-Change: 0.05099
Iteration: 7, Log-Lik: -482397.786, Max-Change: 0.04259
Iteration: 8, Log-Lik: -482334.772, Max-Change: 0.03186
Iteration: 9, Log-Lik: -482290.130, Max-Change: 0.02535
Iteration: 10, Log-Lik: -482260.315, Max-Change: 0.02149
Iteration: 11, Log-Lik: -482239.467, Max-Change: 0.01822
Iteration: 12, Log-Lik: -482224.719, Max-Change: 0.01526
Iteration: 13, Log-Lik: -482214.177, Max-Change: 0.01320
Iteration: 14, Log-Lik: -482206.600, Max-Change: 0.01124
Iteration: 15, Log-Lik: -482201.154, Max-Change: 0.00951
Iteration: 16, Log-Lik: -482197.231, Max-Change: 0.00808
Iteration: 17, Log-Lik: -482194.379, Max-Change: 0.00697
Iteration: 18, Log-Lik: -482192.277, Max-Change: 0.00598
Iteration: 19, Log-Lik: -482186.709, Max-Change: 0.00131
Iteration: 20, Log-Lik: -482186.586, Max-Change: 0.00106
Iteration: 21, Log-Lik: -482186.495, Max-Change: 0.00090
Iteration: 22, Log-Lik: -482186.139, Max-Change: 0.00093
Iteration: 23, Log-Lik: -482186.106, Max-Change: 0.00061
Iteration: 24, Log-Lik: -482186.082, Max-Change: 0.00054
Iteration: 25, Log-Lik: -482185.977, Max-Change: 0.00034
Iteration: 26, Log-Lik: -482185.968, Max-Change: 0.00033
Iteration: 27, Log-Lik: -482185.961, Max-Change: 0.00030
Iteration: 28, Log-Lik: -482185.933, Max-Change: 0.00034
Iteration: 29, Log-Lik: -482185.929, Max-Change: 0.00020
Iteration: 30, Log-Lik: -482185.926, Max-Change: 0.00019
Iteration: 31, Log-Lik: -482185.915, Max-Change: 0.00021
Iteration: 32, Log-Lik: -482185.913, Max-Change: 0.00016
Iteration: 33, Log-Lik: -482185.912, Max-Change: 0.00015
Iteration: 34, Log-Lik: -482185.907, Max-Change: 0.00024
Iteration: 35, Log-Lik: -482185.905, Max-Change: 0.00014
Iteration: 36, Log-Lik: -482185.904, Max-Change: 0.00013
Iteration: 37, Log-Lik: -482185.901, Max-Change: 0.00014
Iteration: 38, Log-Lik: -482185.901, Max-Change: 0.00012
Iteration: 39, Log-Lik: -482185.900, Max-Change: 0.00011
Iteration: 40, Log-Lik: -482185.898, Max-Change: 0.00015
Iteration: 41, Log-Lik: -482185.898, Max-Change: 0.00010
Iteration: 42, Log-Lik: -482185.897, Max-Change: 0.00010
#scores
mirt_fit_scores = fscores(mirt_fit, full.scores = T, full.scores.SE = T)
d_mirt_scores = mirt_fit_scores %>% as_tibble() %>% mutate(group = rep(c("A", "B"), each = n)) %>% bind_cols(
  total_score = rowSums(d)
) %>% rename(IRT = F1)

#distributions
GG_denhist(d_mirt_scores, "total_score", "group", histogram_pars = list(binwidth = 1))

GG_save("total_scores_dist.png")

GG_denhist(d_mirt_scores, "IRT", "group")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

GG_save("IRT_dist.png")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#gap sizes
describe2(d_mirt_scores %>% select(IRT, total_score), d_mirt_scores$group)
cohen.d(
  d_mirt_scores %>% select(IRT, total_score),
  d_mirt_scores$group
)
## Call: cohen.d(x = d_mirt_scores %>% select(IRT, total_score), group = d_mirt_scores$group)
## Cohen d statistic of difference between two means
##             lower effect upper
## IRT          0.97   1.00  1.03
## total_score  0.98   1.01  1.04
## 
## Multivariate (Mahalanobis) distance between groups
## [1] 1
## r equivalent of difference between two means
##         IRT total_score 
##        0.45        0.45
#reliability
empirical_rxx(mirt_fit_scores)
##    F1 
## 0.936
#find the DIF
DIF_fit = DIF_test(
  d,
  model = 1,
  group = d_mirt_scores$group
)
## There are 8 steps
## Step 1: Initial joint fit
## 
Iteration: 1, Log-Lik: -494740.685, Max-Change: 1.30845
Iteration: 2, Log-Lik: -484418.365, Max-Change: 0.38969
Iteration: 3, Log-Lik: -483266.028, Max-Change: 0.18194
Iteration: 4, Log-Lik: -482848.923, Max-Change: 0.10302
Iteration: 5, Log-Lik: -482622.124, Max-Change: 0.07127
Iteration: 6, Log-Lik: -482489.343, Max-Change: 0.05099
Iteration: 7, Log-Lik: -482397.786, Max-Change: 0.04259
Iteration: 8, Log-Lik: -482334.772, Max-Change: 0.03186
Iteration: 9, Log-Lik: -482290.130, Max-Change: 0.02535
Iteration: 10, Log-Lik: -482260.315, Max-Change: 0.02149
Iteration: 11, Log-Lik: -482239.467, Max-Change: 0.01822
Iteration: 12, Log-Lik: -482224.719, Max-Change: 0.01526
Iteration: 13, Log-Lik: -482214.177, Max-Change: 0.01320
Iteration: 14, Log-Lik: -482206.600, Max-Change: 0.01124
Iteration: 15, Log-Lik: -482201.154, Max-Change: 0.00951
Iteration: 16, Log-Lik: -482197.231, Max-Change: 0.00808
Iteration: 17, Log-Lik: -482194.379, Max-Change: 0.00697
Iteration: 18, Log-Lik: -482192.277, Max-Change: 0.00598
Iteration: 19, Log-Lik: -482186.709, Max-Change: 0.00131
Iteration: 20, Log-Lik: -482186.586, Max-Change: 0.00106
Iteration: 21, Log-Lik: -482186.495, Max-Change: 0.00090
Iteration: 22, Log-Lik: -482186.139, Max-Change: 0.00093
Iteration: 23, Log-Lik: -482186.106, Max-Change: 0.00061
Iteration: 24, Log-Lik: -482186.082, Max-Change: 0.00054
Iteration: 25, Log-Lik: -482185.977, Max-Change: 0.00034
Iteration: 26, Log-Lik: -482185.968, Max-Change: 0.00033
Iteration: 27, Log-Lik: -482185.961, Max-Change: 0.00030
Iteration: 28, Log-Lik: -482185.933, Max-Change: 0.00034
Iteration: 29, Log-Lik: -482185.929, Max-Change: 0.00020
Iteration: 30, Log-Lik: -482185.926, Max-Change: 0.00019
Iteration: 31, Log-Lik: -482185.915, Max-Change: 0.00021
Iteration: 32, Log-Lik: -482185.913, Max-Change: 0.00016
Iteration: 33, Log-Lik: -482185.912, Max-Change: 0.00015
Iteration: 34, Log-Lik: -482185.907, Max-Change: 0.00024
Iteration: 35, Log-Lik: -482185.905, Max-Change: 0.00014
Iteration: 36, Log-Lik: -482185.904, Max-Change: 0.00013
Iteration: 37, Log-Lik: -482185.901, Max-Change: 0.00014
Iteration: 38, Log-Lik: -482185.901, Max-Change: 0.00012
Iteration: 39, Log-Lik: -482185.900, Max-Change: 0.00011
Iteration: 40, Log-Lik: -482185.898, Max-Change: 0.00015
Iteration: 41, Log-Lik: -482185.898, Max-Change: 0.00010
Iteration: 42, Log-Lik: -482185.897, Max-Change: 0.00010
## 
## Step 2: Initial MI fit
## 
Iteration: 1, Log-Lik: -494740.685, Max-Change: 1.08641
Iteration: 2, Log-Lik: -482581.251, Max-Change: 0.15328
Iteration: 3, Log-Lik: -481906.983, Max-Change: 0.07289
Iteration: 4, Log-Lik: -481596.757, Max-Change: 0.05158
Iteration: 5, Log-Lik: -481367.514, Max-Change: 0.05390
Iteration: 6, Log-Lik: -481181.857, Max-Change: 0.04967
Iteration: 7, Log-Lik: -481027.786, Max-Change: 0.04406
Iteration: 8, Log-Lik: -480898.543, Max-Change: 0.03871
Iteration: 9, Log-Lik: -480789.305, Max-Change: 0.03390
Iteration: 10, Log-Lik: -480696.403, Max-Change: 0.03008
Iteration: 11, Log-Lik: -480616.938, Max-Change: 0.02857
Iteration: 12, Log-Lik: -480548.589, Max-Change: 0.02709
Iteration: 13, Log-Lik: -480489.536, Max-Change: 0.02539
Iteration: 14, Log-Lik: -480438.220, Max-Change: 0.02394
Iteration: 15, Log-Lik: -480393.443, Max-Change: 0.02277
Iteration: 16, Log-Lik: -480354.189, Max-Change: 0.02168
Iteration: 17, Log-Lik: -480319.649, Max-Change: 0.02068
Iteration: 18, Log-Lik: -480289.125, Max-Change: 0.01978
Iteration: 19, Log-Lik: -480262.038, Max-Change: 0.01878
Iteration: 20, Log-Lik: -480237.941, Max-Change: 0.01800
Iteration: 21, Log-Lik: -480216.396, Max-Change: 0.01713
Iteration: 22, Log-Lik: -480197.083, Max-Change: 0.01635
Iteration: 23, Log-Lik: -480179.712, Max-Change: 0.01564
Iteration: 24, Log-Lik: -480164.052, Max-Change: 0.01505
Iteration: 25, Log-Lik: -480149.870, Max-Change: 0.01434
Iteration: 26, Log-Lik: -480136.999, Max-Change: 0.01369
Iteration: 27, Log-Lik: -480125.292, Max-Change: 0.01314
Iteration: 28, Log-Lik: -480114.611, Max-Change: 0.01259
Iteration: 29, Log-Lik: -480104.843, Max-Change: 0.01205
Iteration: 30, Log-Lik: -480095.891, Max-Change: 0.01158
Iteration: 31, Log-Lik: -480087.668, Max-Change: 0.01109
Iteration: 32, Log-Lik: -480080.099, Max-Change: 0.01061
Iteration: 33, Log-Lik: -480073.116, Max-Change: 0.01021
Iteration: 34, Log-Lik: -480066.663, Max-Change: 0.00981
Iteration: 35, Log-Lik: -480060.689, Max-Change: 0.00943
Iteration: 36, Log-Lik: -480055.148, Max-Change: 0.00907
Iteration: 37, Log-Lik: -480050.001, Max-Change: 0.00871
Iteration: 38, Log-Lik: -480045.211, Max-Change: 0.00838
Iteration: 39, Log-Lik: -480040.752, Max-Change: 0.00805
Iteration: 40, Log-Lik: -480020.524, Max-Change: 0.02043
Iteration: 41, Log-Lik: -480015.977, Max-Change: 0.00587
Iteration: 42, Log-Lik: -480013.438, Max-Change: 0.00575
Iteration: 43, Log-Lik: -480001.955, Max-Change: 0.01677
Iteration: 44, Log-Lik: -479999.089, Max-Change: 0.00431
Iteration: 45, Log-Lik: -479997.552, Max-Change: 0.00423
Iteration: 46, Log-Lik: -479990.684, Max-Change: 0.01367
Iteration: 47, Log-Lik: -479988.823, Max-Change: 0.00324
Iteration: 48, Log-Lik: -479987.868, Max-Change: 0.00318
Iteration: 49, Log-Lik: -479983.652, Max-Change: 0.01109
Iteration: 50, Log-Lik: -479982.441, Max-Change: 0.00246
Iteration: 51, Log-Lik: -479981.842, Max-Change: 0.00241
Iteration: 52, Log-Lik: -479979.228, Max-Change: 0.00892
Iteration: 53, Log-Lik: -479978.446, Max-Change: 0.00189
Iteration: 54, Log-Lik: -479978.069, Max-Change: 0.00186
Iteration: 55, Log-Lik: -479976.440, Max-Change: 0.00715
Iteration: 56, Log-Lik: -479975.940, Max-Change: 0.00147
Iteration: 57, Log-Lik: -479975.702, Max-Change: 0.00144
Iteration: 58, Log-Lik: -479974.686, Max-Change: 0.00570
Iteration: 59, Log-Lik: -479974.367, Max-Change: 0.00115
Iteration: 60, Log-Lik: -479974.219, Max-Change: 0.00112
Iteration: 61, Log-Lik: -479973.584, Max-Change: 0.00454
Iteration: 62, Log-Lik: -479973.383, Max-Change: 0.00090
Iteration: 63, Log-Lik: -479973.289, Max-Change: 0.00087
Iteration: 64, Log-Lik: -479972.894, Max-Change: 0.00360
Iteration: 65, Log-Lik: -479972.767, Max-Change: 0.00071
Iteration: 66, Log-Lik: -479972.709, Max-Change: 0.00069
Iteration: 67, Log-Lik: -479972.462, Max-Change: 0.00286
Iteration: 68, Log-Lik: -479972.382, Max-Change: 0.00056
Iteration: 69, Log-Lik: -479972.346, Max-Change: 0.00054
Iteration: 70, Log-Lik: -479972.192, Max-Change: 0.00226
Iteration: 71, Log-Lik: -479972.143, Max-Change: 0.00044
Iteration: 72, Log-Lik: -479972.120, Max-Change: 0.00042
Iteration: 73, Log-Lik: -479972.024, Max-Change: 0.00179
Iteration: 74, Log-Lik: -479971.993, Max-Change: 0.00034
Iteration: 75, Log-Lik: -479971.979, Max-Change: 0.00033
Iteration: 76, Log-Lik: -479971.920, Max-Change: 0.00141
Iteration: 77, Log-Lik: -479971.900, Max-Change: 0.00027
Iteration: 78, Log-Lik: -479971.891, Max-Change: 0.00026
Iteration: 79, Log-Lik: -479971.854, Max-Change: 0.00111
Iteration: 80, Log-Lik: -479971.842, Max-Change: 0.00021
Iteration: 81, Log-Lik: -479971.837, Max-Change: 0.00021
Iteration: 82, Log-Lik: -479971.814, Max-Change: 0.00088
Iteration: 83, Log-Lik: -479971.806, Max-Change: 0.00017
Iteration: 84, Log-Lik: -479971.803, Max-Change: 0.00016
Iteration: 85, Log-Lik: -479971.789, Max-Change: 0.00069
Iteration: 86, Log-Lik: -479971.784, Max-Change: 0.00013
Iteration: 87, Log-Lik: -479971.782, Max-Change: 0.00013
Iteration: 88, Log-Lik: -479971.773, Max-Change: 0.00055
Iteration: 89, Log-Lik: -479971.770, Max-Change: 0.00010
Iteration: 90, Log-Lik: -479971.769, Max-Change: 0.00010
Iteration: 91, Log-Lik: -479971.763, Max-Change: 0.00043
Iteration: 92, Log-Lik: -479971.761, Max-Change: 0.00008
## 
## Step 3: Leave one out MI testing
## 
## Step 4: Fit without DIF items, liberal threshold
## 
Iteration: 1, Log-Lik: -528499.281, Max-Change: 0.87819
Iteration: 2, Log-Lik: -520841.598, Max-Change: 0.28575
Iteration: 3, Log-Lik: -519927.119, Max-Change: 0.16636
Iteration: 4, Log-Lik: -519579.469, Max-Change: 0.10728
Iteration: 5, Log-Lik: -519397.465, Max-Change: 0.08166
Iteration: 6, Log-Lik: -519288.300, Max-Change: 0.05549
Iteration: 7, Log-Lik: -519220.480, Max-Change: 0.04367
Iteration: 8, Log-Lik: -519178.050, Max-Change: 0.03091
Iteration: 9, Log-Lik: -519151.794, Max-Change: 0.02322
Iteration: 10, Log-Lik: -519135.180, Max-Change: 0.01859
Iteration: 11, Log-Lik: -519124.429, Max-Change: 0.01533
Iteration: 12, Log-Lik: -519117.414, Max-Change: 0.01245
Iteration: 13, Log-Lik: -519112.829, Max-Change: 0.00995
Iteration: 14, Log-Lik: -519109.815, Max-Change: 0.00815
Iteration: 15, Log-Lik: -519107.816, Max-Change: 0.00676
Iteration: 16, Log-Lik: -519103.893, Max-Change: 0.00131
Iteration: 17, Log-Lik: -519103.800, Max-Change: 0.00124
Iteration: 18, Log-Lik: -519103.736, Max-Change: 0.00088
Iteration: 19, Log-Lik: -519103.558, Max-Change: 0.00074
Iteration: 20, Log-Lik: -519103.535, Max-Change: 0.00058
Iteration: 21, Log-Lik: -519103.517, Max-Change: 0.00072
Iteration: 22, Log-Lik: -519103.494, Max-Change: 0.00074
Iteration: 23, Log-Lik: -519103.480, Max-Change: 0.00033
Iteration: 24, Log-Lik: -519103.472, Max-Change: 0.00035
Iteration: 25, Log-Lik: -519103.450, Max-Change: 0.00024
Iteration: 26, Log-Lik: -519103.446, Max-Change: 0.00023
Iteration: 27, Log-Lik: -519103.443, Max-Change: 0.00021
Iteration: 28, Log-Lik: -519103.435, Max-Change: 0.00036
Iteration: 29, Log-Lik: -519103.434, Max-Change: 0.00021
Iteration: 30, Log-Lik: -519103.432, Max-Change: 0.00016
Iteration: 31, Log-Lik: -519103.430, Max-Change: 0.00022
Iteration: 32, Log-Lik: -519103.429, Max-Change: 0.00014
Iteration: 33, Log-Lik: -519103.428, Max-Change: 0.00013
Iteration: 34, Log-Lik: -519103.426, Max-Change: 0.00020
Iteration: 35, Log-Lik: -519103.426, Max-Change: 0.00012
Iteration: 36, Log-Lik: -519103.425, Max-Change: 0.00011
Iteration: 37, Log-Lik: -519103.424, Max-Change: 0.00015
Iteration: 38, Log-Lik: -519103.424, Max-Change: 0.00010
## 
## Step 5: Fit without DIF items, conservative threshold
## 
Iteration: 1, Log-Lik: -498417.174, Max-Change: 1.24429
Iteration: 2, Log-Lik: -488881.053, Max-Change: 0.35709
Iteration: 3, Log-Lik: -487742.038, Max-Change: 0.16558
Iteration: 4, Log-Lik: -487336.721, Max-Change: 0.09914
Iteration: 5, Log-Lik: -487106.369, Max-Change: 0.07016
Iteration: 6, Log-Lik: -486969.267, Max-Change: 0.05040
Iteration: 7, Log-Lik: -486876.580, Max-Change: 0.04035
Iteration: 8, Log-Lik: -486813.380, Max-Change: 0.03418
Iteration: 9, Log-Lik: -486769.387, Max-Change: 0.02634
Iteration: 10, Log-Lik: -486739.510, Max-Change: 0.02207
Iteration: 11, Log-Lik: -486718.799, Max-Change: 0.01856
Iteration: 12, Log-Lik: -486704.309, Max-Change: 0.01543
Iteration: 13, Log-Lik: -486694.041, Max-Change: 0.01326
Iteration: 14, Log-Lik: -486686.725, Max-Change: 0.01129
Iteration: 15, Log-Lik: -486681.508, Max-Change: 0.00948
Iteration: 16, Log-Lik: -486677.776, Max-Change: 0.00804
Iteration: 17, Log-Lik: -486675.079, Max-Change: 0.00684
Iteration: 18, Log-Lik: -486673.103, Max-Change: 0.00588
Iteration: 19, Log-Lik: -486667.981, Max-Change: 0.00134
Iteration: 20, Log-Lik: -486667.850, Max-Change: 0.00106
Iteration: 21, Log-Lik: -486667.749, Max-Change: 0.00091
Iteration: 22, Log-Lik: -486667.350, Max-Change: 0.00095
Iteration: 23, Log-Lik: -486667.313, Max-Change: 0.00067
Iteration: 24, Log-Lik: -486667.285, Max-Change: 0.00059
Iteration: 25, Log-Lik: -486667.167, Max-Change: 0.00036
Iteration: 26, Log-Lik: -486667.157, Max-Change: 0.00035
Iteration: 27, Log-Lik: -486667.148, Max-Change: 0.00031
Iteration: 28, Log-Lik: -486667.117, Max-Change: 0.00033
Iteration: 29, Log-Lik: -486667.113, Max-Change: 0.00021
Iteration: 30, Log-Lik: -486667.109, Max-Change: 0.00020
Iteration: 31, Log-Lik: -486667.098, Max-Change: 0.00021
Iteration: 32, Log-Lik: -486667.096, Max-Change: 0.00016
Iteration: 33, Log-Lik: -486667.094, Max-Change: 0.00016
Iteration: 34, Log-Lik: -486667.089, Max-Change: 0.00024
Iteration: 35, Log-Lik: -486667.088, Max-Change: 0.00014
Iteration: 36, Log-Lik: -486667.087, Max-Change: 0.00014
Iteration: 37, Log-Lik: -486667.084, Max-Change: 0.00014
Iteration: 38, Log-Lik: -486667.083, Max-Change: 0.00012
Iteration: 39, Log-Lik: -486667.082, Max-Change: 0.00012
Iteration: 40, Log-Lik: -486667.081, Max-Change: 0.00015
Iteration: 41, Log-Lik: -486667.080, Max-Change: 0.00011
Iteration: 42, Log-Lik: -486667.080, Max-Change: 0.00010
Iteration: 43, Log-Lik: -486667.079, Max-Change: 0.00009
## 
## Step 6: Fit with anchor items, liberal threshold
## 
Iteration: 1, Log-Lik: -494740.685, Max-Change: 1.19768
Iteration: 2, Log-Lik: -479963.397, Max-Change: 0.15953
Iteration: 3, Log-Lik: -479254.391, Max-Change: 0.07793
Iteration: 4, Log-Lik: -478943.215, Max-Change: 0.04834
Iteration: 5, Log-Lik: -478724.646, Max-Change: 0.04941
Iteration: 6, Log-Lik: -478550.394, Max-Change: 0.04811
Iteration: 7, Log-Lik: -478405.729, Max-Change: 0.04422
Iteration: 8, Log-Lik: -478283.708, Max-Change: 0.03963
Iteration: 9, Log-Lik: -478179.872, Max-Change: 0.03525
Iteration: 10, Log-Lik: -478091.003, Max-Change: 0.03126
Iteration: 11, Log-Lik: -478014.566, Max-Change: 0.02845
Iteration: 12, Log-Lik: -477948.474, Max-Change: 0.02685
Iteration: 13, Log-Lik: -477891.093, Max-Change: 0.02556
Iteration: 14, Log-Lik: -477841.055, Max-Change: 0.02438
Iteration: 15, Log-Lik: -477797.232, Max-Change: 0.02322
Iteration: 16, Log-Lik: -477758.733, Max-Change: 0.02214
Iteration: 17, Log-Lik: -477724.760, Max-Change: 0.02111
Iteration: 18, Log-Lik: -477694.692, Max-Change: 0.02015
Iteration: 19, Log-Lik: -477667.974, Max-Change: 0.01929
Iteration: 20, Log-Lik: -477644.157, Max-Change: 0.01840
Iteration: 21, Log-Lik: -477622.861, Max-Change: 0.01760
Iteration: 22, Log-Lik: -477603.767, Max-Change: 0.01683
Iteration: 23, Log-Lik: -477586.581, Max-Change: 0.01607
Iteration: 24, Log-Lik: -477571.081, Max-Change: 0.01538
Iteration: 25, Log-Lik: -477557.058, Max-Change: 0.01474
Iteration: 26, Log-Lik: -477544.345, Max-Change: 0.01402
Iteration: 27, Log-Lik: -477532.788, Max-Change: 0.01349
Iteration: 28, Log-Lik: -477522.255, Max-Change: 0.01292
Iteration: 29, Log-Lik: -477512.633, Max-Change: 0.01239
Iteration: 30, Log-Lik: -477503.823, Max-Change: 0.01188
Iteration: 31, Log-Lik: -477495.739, Max-Change: 0.01140
Iteration: 32, Log-Lik: -477488.308, Max-Change: 0.01093
Iteration: 33, Log-Lik: -477481.462, Max-Change: 0.01050
Iteration: 34, Log-Lik: -477475.145, Max-Change: 0.01009
Iteration: 35, Log-Lik: -477469.305, Max-Change: 0.00969
Iteration: 36, Log-Lik: -477463.900, Max-Change: 0.00932
Iteration: 37, Log-Lik: -477458.885, Max-Change: 0.00890
Iteration: 38, Log-Lik: -477454.236, Max-Change: 0.00858
Iteration: 39, Log-Lik: -477449.911, Max-Change: 0.00826
Iteration: 40, Log-Lik: -477430.299, Max-Change: 0.01990
Iteration: 41, Log-Lik: -477425.959, Max-Change: 0.00708
Iteration: 42, Log-Lik: -477423.508, Max-Change: 0.00633
Iteration: 43, Log-Lik: -477412.477, Max-Change: 0.01651
Iteration: 44, Log-Lik: -477409.732, Max-Change: 0.00477
Iteration: 45, Log-Lik: -477408.263, Max-Change: 0.00446
Iteration: 46, Log-Lik: -477401.690, Max-Change: 0.01348
Iteration: 47, Log-Lik: -477399.921, Max-Change: 0.00372
Iteration: 48, Log-Lik: -477399.008, Max-Change: 0.00340
Iteration: 49, Log-Lik: -477394.976, Max-Change: 0.01094
Iteration: 50, Log-Lik: -477393.821, Max-Change: 0.00276
Iteration: 51, Log-Lik: -477393.246, Max-Change: 0.00254
Iteration: 52, Log-Lik: -477390.740, Max-Change: 0.00884
Iteration: 53, Log-Lik: -477389.987, Max-Change: 0.00215
Iteration: 54, Log-Lik: -477389.624, Max-Change: 0.00195
Iteration: 55, Log-Lik: -477388.056, Max-Change: 0.00712
Iteration: 56, Log-Lik: -477387.570, Max-Change: 0.00166
Iteration: 57, Log-Lik: -477387.339, Max-Change: 0.00150
Iteration: 58, Log-Lik: -477386.356, Max-Change: 0.00571
Iteration: 59, Log-Lik: -477386.043, Max-Change: 0.00130
Iteration: 60, Log-Lik: -477385.898, Max-Change: 0.00117
Iteration: 61, Log-Lik: -477385.280, Max-Change: 0.00456
Iteration: 62, Log-Lik: -477385.080, Max-Change: 0.00101
Iteration: 63, Log-Lik: -477384.988, Max-Change: 0.00092
Iteration: 64, Log-Lik: -477384.600, Max-Change: 0.00364
Iteration: 65, Log-Lik: -477384.473, Max-Change: 0.00079
Iteration: 66, Log-Lik: -477384.415, Max-Change: 0.00072
Iteration: 67, Log-Lik: -477384.172, Max-Change: 0.00290
Iteration: 68, Log-Lik: -477384.091, Max-Change: 0.00062
Iteration: 69, Log-Lik: -477384.055, Max-Change: 0.00056
Iteration: 70, Log-Lik: -477383.902, Max-Change: 0.00230
Iteration: 71, Log-Lik: -477383.851, Max-Change: 0.00049
Iteration: 72, Log-Lik: -477383.828, Max-Change: 0.00045
Iteration: 73, Log-Lik: -477383.732, Max-Change: 0.00183
Iteration: 74, Log-Lik: -477383.700, Max-Change: 0.00039
Iteration: 75, Log-Lik: -477383.685, Max-Change: 0.00035
Iteration: 76, Log-Lik: -477383.625, Max-Change: 0.00145
Iteration: 77, Log-Lik: -477383.605, Max-Change: 0.00031
Iteration: 78, Log-Lik: -477383.596, Max-Change: 0.00028
Iteration: 79, Log-Lik: -477383.558, Max-Change: 0.00115
Iteration: 80, Log-Lik: -477383.545, Max-Change: 0.00024
Iteration: 81, Log-Lik: -477383.540, Max-Change: 0.00022
Iteration: 82, Log-Lik: -477383.516, Max-Change: 0.00091
Iteration: 83, Log-Lik: -477383.508, Max-Change: 0.00019
Iteration: 84, Log-Lik: -477383.504, Max-Change: 0.00017
Iteration: 85, Log-Lik: -477383.490, Max-Change: 0.00072
Iteration: 86, Log-Lik: -477383.484, Max-Change: 0.00015
Iteration: 87, Log-Lik: -477383.482, Max-Change: 0.00014
Iteration: 88, Log-Lik: -477383.473, Max-Change: 0.00057
Iteration: 89, Log-Lik: -477383.470, Max-Change: 0.00012
Iteration: 90, Log-Lik: -477383.468, Max-Change: 0.00011
Iteration: 91, Log-Lik: -477383.463, Max-Change: 0.00045
Iteration: 92, Log-Lik: -477383.461, Max-Change: 0.00009
## 
## Step 7: Fit with anchor items, conservative threshold
## 
Iteration: 1, Log-Lik: -494740.685, Max-Change: 1.19754
Iteration: 2, Log-Lik: -479973.186, Max-Change: 0.15514
Iteration: 3, Log-Lik: -479292.809, Max-Change: 0.07494
Iteration: 4, Log-Lik: -478987.907, Max-Change: 0.05168
Iteration: 5, Log-Lik: -478764.534, Max-Change: 0.05452
Iteration: 6, Log-Lik: -478584.051, Max-Change: 0.05052
Iteration: 7, Log-Lik: -478434.377, Max-Change: 0.04473
Iteration: 8, Log-Lik: -478308.894, Max-Change: 0.03961
Iteration: 9, Log-Lik: -478202.858, Max-Change: 0.03461
Iteration: 10, Log-Lik: -478112.739, Max-Change: 0.03045
Iteration: 11, Log-Lik: -478035.667, Max-Change: 0.02830
Iteration: 12, Log-Lik: -477969.423, Max-Change: 0.02642
Iteration: 13, Log-Lik: -477912.198, Max-Change: 0.02455
Iteration: 14, Log-Lik: -477862.531, Max-Change: 0.02328
Iteration: 15, Log-Lik: -477819.232, Max-Change: 0.02218
Iteration: 16, Log-Lik: -477781.313, Max-Change: 0.02116
Iteration: 17, Log-Lik: -477747.983, Max-Change: 0.02011
Iteration: 18, Log-Lik: -477718.554, Max-Change: 0.01931
Iteration: 19, Log-Lik: -477692.470, Max-Change: 0.01829
Iteration: 20, Log-Lik: -477669.278, Max-Change: 0.01749
Iteration: 21, Log-Lik: -477648.583, Max-Change: 0.01677
Iteration: 22, Log-Lik: -477630.051, Max-Change: 0.01593
Iteration: 23, Log-Lik: -477613.410, Max-Change: 0.01511
Iteration: 24, Log-Lik: -477598.429, Max-Change: 0.01478
Iteration: 25, Log-Lik: -477584.872, Max-Change: 0.01400
Iteration: 26, Log-Lik: -477572.581, Max-Change: 0.01336
Iteration: 27, Log-Lik: -477561.421, Max-Change: 0.01281
Iteration: 28, Log-Lik: -477551.256, Max-Change: 0.01228
Iteration: 29, Log-Lik: -477541.964, Max-Change: 0.01177
Iteration: 30, Log-Lik: -477533.464, Max-Change: 0.01129
Iteration: 31, Log-Lik: -477525.660, Max-Change: 0.01084
Iteration: 32, Log-Lik: -477518.484, Max-Change: 0.01039
Iteration: 33, Log-Lik: -477511.873, Max-Change: 0.00997
Iteration: 34, Log-Lik: -477505.772, Max-Change: 0.00951
Iteration: 35, Log-Lik: -477500.136, Max-Change: 0.00920
Iteration: 36, Log-Lik: -477494.916, Max-Change: 0.00884
Iteration: 37, Log-Lik: -477490.075, Max-Change: 0.00850
Iteration: 38, Log-Lik: -477485.579, Max-Change: 0.00817
Iteration: 39, Log-Lik: -477481.397, Max-Change: 0.00784
Iteration: 40, Log-Lik: -477462.407, Max-Change: 0.01952
Iteration: 41, Log-Lik: -477458.211, Max-Change: 0.00576
Iteration: 42, Log-Lik: -477455.849, Max-Change: 0.00563
Iteration: 43, Log-Lik: -477445.139, Max-Change: 0.01603
Iteration: 44, Log-Lik: -477442.517, Max-Change: 0.00422
Iteration: 45, Log-Lik: -477441.096, Max-Change: 0.00413
Iteration: 46, Log-Lik: -477434.721, Max-Change: 0.01299
Iteration: 47, Log-Lik: -477433.037, Max-Change: 0.00318
Iteration: 48, Log-Lik: -477432.160, Max-Change: 0.00311
Iteration: 49, Log-Lik: -477428.272, Max-Change: 0.01054
Iteration: 50, Log-Lik: -477427.180, Max-Change: 0.00242
Iteration: 51, Log-Lik: -477426.632, Max-Change: 0.00235
Iteration: 52, Log-Lik: -477424.235, Max-Change: 0.00846
Iteration: 53, Log-Lik: -477423.533, Max-Change: 0.00186
Iteration: 54, Log-Lik: -477423.190, Max-Change: 0.00181
Iteration: 55, Log-Lik: -477421.703, Max-Change: 0.00677
Iteration: 56, Log-Lik: -477421.255, Max-Change: 0.00143
Iteration: 57, Log-Lik: -477421.040, Max-Change: 0.00140
Iteration: 58, Log-Lik: -477420.116, Max-Change: 0.00539
Iteration: 59, Log-Lik: -477419.832, Max-Change: 0.00112
Iteration: 60, Log-Lik: -477419.698, Max-Change: 0.00109
Iteration: 61, Log-Lik: -477419.124, Max-Change: 0.00429
Iteration: 62, Log-Lik: -477418.945, Max-Change: 0.00087
Iteration: 63, Log-Lik: -477418.861, Max-Change: 0.00085
Iteration: 64, Log-Lik: -477418.504, Max-Change: 0.00339
Iteration: 65, Log-Lik: -477418.392, Max-Change: 0.00068
Iteration: 66, Log-Lik: -477418.340, Max-Change: 0.00066
Iteration: 67, Log-Lik: -477418.119, Max-Change: 0.00268
Iteration: 68, Log-Lik: -477418.049, Max-Change: 0.00054
Iteration: 69, Log-Lik: -477418.016, Max-Change: 0.00052
Iteration: 70, Log-Lik: -477417.879, Max-Change: 0.00212
Iteration: 71, Log-Lik: -477417.835, Max-Change: 0.00042
Iteration: 72, Log-Lik: -477417.815, Max-Change: 0.00041
Iteration: 73, Log-Lik: -477417.730, Max-Change: 0.00167
Iteration: 74, Log-Lik: -477417.702, Max-Change: 0.00033
Iteration: 75, Log-Lik: -477417.690, Max-Change: 0.00032
Iteration: 76, Log-Lik: -477417.637, Max-Change: 0.00132
Iteration: 77, Log-Lik: -477417.620, Max-Change: 0.00026
Iteration: 78, Log-Lik: -477417.612, Max-Change: 0.00025
Iteration: 79, Log-Lik: -477417.580, Max-Change: 0.00104
Iteration: 80, Log-Lik: -477417.569, Max-Change: 0.00020
Iteration: 81, Log-Lik: -477417.564, Max-Change: 0.00020
Iteration: 82, Log-Lik: -477417.544, Max-Change: 0.00082
Iteration: 83, Log-Lik: -477417.538, Max-Change: 0.00016
Iteration: 84, Log-Lik: -477417.535, Max-Change: 0.00016
Iteration: 85, Log-Lik: -477417.522, Max-Change: 0.00064
Iteration: 86, Log-Lik: -477417.518, Max-Change: 0.00013
Iteration: 87, Log-Lik: -477417.516, Max-Change: 0.00012
Iteration: 88, Log-Lik: -477417.508, Max-Change: 0.00051
Iteration: 89, Log-Lik: -477417.506, Max-Change: 0.00010
## 
## Step 8: Get scores
#DIF size on test
DIF_fit$effect_size_test
## $liberal
##           Effect Size   Value
## 1                STDS  0.1734
## 2                UTDS  0.8447
## 3              UETSDS  0.2443
## 4               ETSSD  0.0202
## 5         Starks.DTFR  0.1699
## 6               UDTFR  0.8456
## 7              UETSDN  0.2537
## 8 theta.of.max.test.D -1.7708
## 9           Test.Dmax  0.5436
## 
## $conservative
##           Effect Size   Value
## 1                STDS  0.2937
## 2                UTDS  0.6913
## 3              UETSDS  0.3212
## 4               ETSSD  0.0341
## 5         Starks.DTFR  0.2881
## 6               UDTFR  0.6925
## 7              UETSDN  0.3264
## 8 theta.of.max.test.D -0.8338
## 9           Test.Dmax  0.5656
#DIF test results
DIF_fit$DIF_stats
#plot bias for test
DIF_fit$fits$anchor_conservative %>% plot(type = "score")

#plot bias for items
DIF_fit$fits$anchor_conservative %>% plot(type = "trace")

#only 2 bad items
DIF_fit$fits$anchor_conservative %>% plot(type = "trace", which.items = c(10, 25))

Meta

#versions
write_sessioninfo()
## R version 4.2.2 Patched (2022-11-10 r83330)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Linux Mint 21
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_DK.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_DK.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_DK.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] mirt_1.37.1           kirkegaard_2023-02-17 psych_2.2.9          
##  [4] assertthat_0.2.1      weights_1.0.4         Hmisc_4.7-1          
##  [7] Formula_1.2-4         survival_3.4-0        lattice_0.20-45      
## [10] magrittr_2.0.3        forcats_0.5.2         stringr_1.4.1        
## [13] dplyr_1.0.10          purrr_0.3.5           readr_2.1.3          
## [16] tidyr_1.2.1           tibble_3.1.8          ggplot2_3.4.0        
## [19] tidyverse_1.3.2      
## 
## loaded via a namespace (and not attached):
##   [1] googledrive_2.0.0     minqa_1.2.5           colorspace_2.0-3     
##   [4] deldir_1.0-6          ellipsis_0.3.2        htmlTable_2.4.1      
##   [7] base64enc_0.1-3       fs_1.5.2              rstudioapi_0.14      
##  [10] mice_3.14.0           farver_2.1.1          Deriv_4.1.3          
##  [13] fansi_1.0.3           lubridate_1.9.0       xml2_1.3.3           
##  [16] splines_4.2.2         mnormt_2.1.1          cachem_1.0.6         
##  [19] knitr_1.40            jsonlite_1.8.3        nloptr_2.0.3         
##  [22] broom_1.0.1           cluster_2.1.4         dbplyr_2.2.1         
##  [25] png_0.1-7             compiler_4.2.2        httr_1.4.4           
##  [28] backports_1.4.1       Matrix_1.5-3          fastmap_1.1.0        
##  [31] gargle_1.2.1          cli_3.4.1             htmltools_0.5.4      
##  [34] tools_4.2.2           gtable_0.3.1          glue_1.6.2           
##  [37] Rcpp_1.0.9            cellranger_1.1.0      jquerylib_0.1.4      
##  [40] vctrs_0.5.1           gdata_2.18.0.1        nlme_3.1-160         
##  [43] xfun_0.35             lme4_1.1-31           rvest_1.0.3          
##  [46] timechange_0.1.1      lifecycle_1.0.3       dcurver_0.9.2        
##  [49] gtools_3.9.3          googlesheets4_1.0.1   MASS_7.3-58          
##  [52] scales_1.2.1          ragg_1.2.4            hms_1.1.2            
##  [55] parallel_4.2.2        RColorBrewer_1.1-3    yaml_2.3.6           
##  [58] pbapply_1.6-0         gridExtra_2.3         sass_0.4.2           
##  [61] rpart_4.1.19          latticeExtra_0.6-30   stringi_1.7.8        
##  [64] highr_0.9             checkmate_2.1.0       permute_0.9-7        
##  [67] boot_1.3-28           systemfonts_1.0.4     rlang_1.0.6          
##  [70] pkgconfig_2.0.3       evaluate_0.18         labeling_0.4.2       
##  [73] htmlwidgets_1.6.1     tidyselect_1.2.0      plyr_1.8.8           
##  [76] R6_2.5.1              generics_0.1.3        DBI_1.1.3            
##  [79] pillar_1.8.1          haven_2.5.1           foreign_0.8-82       
##  [82] withr_2.5.0           mgcv_1.8-41           nnet_7.3-18          
##  [85] modelr_0.1.10         crayon_1.5.2          interp_1.1-3         
##  [88] utf8_1.2.2            tzdb_0.3.0            rmarkdown_2.18       
##  [91] jpeg_0.1-9            grid_4.2.2            readxl_1.4.1         
##  [94] data.table_1.14.6     vegan_2.6-4           reprex_2.0.2         
##  [97] digest_0.6.30         GPArotation_2022.10-2 textshaping_0.3.6    
## [100] munsell_0.5.0         bslib_0.4.1