## ---- include = FALSE--------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", # tidy = TRUE, # tidy.opts=list(arrow=TRUE,width.cutoff = 50), eval=F ) ## ----------------------------------------------------------------------------- # h_1PLvs2PL <- list(res = function(altpars, nullpars = NULL) { # # n.items <- length(altpars[[1]]) # # re <- list(n.items = n.items, itemtype = "2PL", # Amat = c(1, 0, -1, 0, rep(0, (n.items - 1) * # 2)) |> # (function(x) rep(x, n.items - 2))() |> # c(1, 0, -1, 0) |> # matrix(ncol = n.items * 2, byrow = TRUE), # cvec = 0, model = mirt::mirt.model(paste("F = 1-", # n.items, " # CONSTRAIN = (1-", # n.items, ", a1)"))) # return(re) # }, unres = function(altpars) { # # re <- list(parsets = altpars, model = 1, itemtype = "2PL", # longpars = pars.long(pars = altpars, itemtype = "2PL")) # # return(re) # }, maximizeL = function(hyp) { # # Hypothesis-specific algorithm to find the # # maximum likelihood restricted parameter set # # # maxlpreload <- function(pars, funs) { # # returns the density for each response # # pattern under the model parameters pars # # patterns <- as.matrix(expand.grid(lapply(seq_len(length(pars$a)), # function(x) c(0, 1)))) # # pre <- c() # for (i in seq_len(nrow(patterns))) { # pre[i] <- funs$g(patterns[i, ], pars) # } # # return(pre) # } # # # maxl <- function(x, pars, pre, funs) { # # calculates the likelihood of parameters # # x given model 'pars' # # patterns <- as.matrix(expand.grid(lapply(seq_len(length(pars$a)), # function(x) c(0, 1)))) # x <- list(a = rep(x[1], length(pars$a)), d = x[2:length(x)]) # # res <- c() # for (i in seq_len(nrow(patterns))) { # px <- pre[i] # qx <- funs$g(patterns[i, ], x) # res[i] <- { # px * log(qx) # } # } # re <- -sum(res) # } # resmod <- hyp$resmod # unresmod <- hyp$unresmod # # pars <- unresmod$parsets # # funs <- load.functions(unresmod$itemtype) # # startval <- c(mean(pars$a), as.numeric(pars$d)) # # maxlpre <- maxlpreload(pars, funs) # optpar <- stats::optim(startval, function(x) { # maxl(x, pars, maxlpre, funs) # }, method = "BFGS") # re <- pars # re$a <- rep(optpar$par[1], length(pars$a)) # re$d <- optpar$par[2:length(optpar$par)] # # return(re) # }) ## ----------------------------------------------------------------------------- # h_DIF2PL <- list(res = function(altpars, nullpars = NULL) { # # n.items <- length(altpars[[1]][[1]]) # # reA <- altpars[[1]] # reB <- altpars[[2]] # # hyp_a <- which(reA$a != reB$a) # hyp_d <- which(reA$d != reB$d) # # Amat <- matrix(0, nrow = length(c(hyp_a, hyp_d)), # ncol = n.items * 2) # # i <- 1 # for (j in hyp_a) { # Amat[i, j * 2 - 1] <- 1 # i <- i + 1 # } # for (j in hyp_d) { # Amat[i, j * 2] <- 1 # i <- i + 1 # } # Amat <- cbind(Amat, -Amat) # # delcols <- (colSums(Amat) == 0) & (1:(n.items * # 2 * 2)) > 2 * n.items # relpars <- colSums(Amat[, 1:(2 * n.items)]) == # 1 # Amat <- Amat[, !delcols] # # re <- list(n.items = n.items, itemtype = "2PL", # Amat = Amat, cvec = 0, model = mirt::mirt.model(paste("F = 1-", # n.items, " # CONSTRAINB = (1-", # n.items, ", d), (1-", n.items, ", a1)")), # multigroup = TRUE, delcols = delcols, relpars = relpars) # # return(re) # }, unres = function(altpars) { # # n.items <- length(altpars[[1]][[1]]) # # reA <- altpars[[1]] # reB <- altpars[[2]] # # reA$itemtype <- reB$itemtype <- "2PL" # # reA$longpars <- pars.long(pars = reA, itemtype = "2PL") # reB$longpars <- pars.long(pars = reB, itemtype = "2PL") # # constrain_a <- which(reA$a == reB$a) # constrain_d <- which(reA$d == reB$d) # # hyp_a <- which(reA$a != reB$a) # hyp_d <- which(reA$d != reB$d) # # Amat <- matrix(0, nrow = length(c(hyp_a, hyp_d)), # ncol = n.items * 2) # # i <- 1 # for (j in hyp_a) { # Amat[i, j * 2 - 1] <- 1 # i <- i + 1 # } # for (j in hyp_d) { # Amat[i, j * 2] <- 1 # i <- i + 1 # } # Amat <- cbind(Amat, -Amat) # # delcols <- (colSums(Amat) == 0) & (1:(n.items * # 2 * 2)) > 2 * n.items # # longpars <- c(reA$longpars, reB$longpars)[!delcols] # # re <- list(parsets = list(reA, reB), model = mirt::mirt.model(paste("F = 1-", # n.items, " # CONSTRAINB = (", # paste(constrain_d, collapse = ","), ", d), (", # paste(constrain_a, collapse = ","), ", a1)")), # longpars = longpars, multigroup = TRUE, itemtype = "2PL", # delcols = delcols) # # return(re) # }, maximizeL = function(hyp) { # # Hypothesis-specific algorithm to find the # # maximum likelihood restricted parameter set # # L Optimizer # # maxl <- function(x, pars1, pars2, i) { # # px1 <- function(th) { # funs$f(th, pars1$a[i], pars1$d[i], 1) # } # px2 <- function(th) { # funs$f(th, pars2$a[i], pars2$d[i], 1) # } # qx <- function(th) { # funs$f(th, x[1], x[2], 1) # } # kl <- function(th) { # px1(th) * log(qx(th)) + (1 - px1(th)) * # log(1 - qx(th)) + px2(th) * log(qx(th)) + # (1 - px2(th)) * log((1 - qx(th))) # } # re <- -spatstat.random::gauss.hermite(kl, order = 20) # } # # resmod <- hyp$resmod # unresmod <- hyp$unresmod # # pars <- unresmod$parsets # # pars1 <- pars[[1]] # pars2 <- pars[[2]] # # funs <- load.functions(pars1$itemtype) # re <- pars1 # # for (i in seq_len(length(pars1$a))) { # startval <- c(re$a[i], re$d[i]) # optpar <- stats::optim(startval, function(x) { # maxl(x, pars1, pars2, i) # }, method = "BFGS") # re$a[i] <- optpar$par[1] # re$d[i] <- optpar$par[2] # } # return(re) # }) ## ----------------------------------------------------------------------------- # h_PCMvsGPCM <- list(res = function(altpars, nullpars = NULL) { # # n.items <- length(altpars[[1]]) # nkat <- ncol(altpars$d) # # re <- list(n.items = n.items, itemtype = "gpcm", # Amat = c(1, rep(0, nkat - 1), -1, rep(0, nkat - # 1), rep(0, (n.items - 1) * nkat)) |> # (function(x) rep(x, n.items - 2))() |> # c(1, rep(0, nkat - 1), -1, rep(0, nkat - # 1)) |> # matrix(ncol = n.items * nkat, byrow = TRUE), # cvec = 0, model = mirt::mirt.model(paste("F = 1-", # n.items, " # CONSTRAIN = (1-", # n.items, ", a1)"))) # return(re) # }, unres = function(altpars) { # # re <- list(parsets = altpars, model = 1, itemtype = "gpcm", # longpars = pars.long(pars = altpars, itemtype = "gpcm")) # # return(re) # }, maximizeL = function(hyp) { # # Hypothesis-specific algorithm to find the # # maximum likelihood restricted parameter set # # # maxlpreload <- function(pars) { # # returns the density for each response # # pattern under the model parameters pars # # # n.items <- length(pars$a) # n.kat <- max(ncol(pars$d), 2) # patterns <- as.matrix(expand.grid(lapply(1:n.items, # function(x) 0:(n.kat - 1)))) # # pre <- c() # for (i in seq_len(nrow(patterns))) { # pre[i] <- funs$g(patterns[i, ], pars) # } # # return(pre) # } # # maxl <- function(x, pars, pre) { # # calculates the likelihood of parameters # # x given model 'pars' # n.items <- length(pars$a) # n.kat <- max(ncol(pars$d), 2) # patterns <- as.matrix(expand.grid(lapply(1:n.items, # function(x) 0:(n.kat - 1)))) # x <- list(a = rep(x[1], n.items), d = matrix(c(rep(0, # n.items), x[2:length(x)]), ncol = ncol(pars$d))) # # res <- c() # for (i in seq_len(nrow(patterns))) { # px <- pre[i] # qx <- funs$g(patterns[i, ], x) # res[i] <- { # px * log(qx) # } # } # re <- -sum(res) # } # # resmod <- hyp$resmod # unresmod <- hyp$unresmod # # pars <- unresmod$parsets # funs <- load.functions(unresmod$itemtype) # # n.kat <- max(ncol(pars$d), 2) # n.items <- length(pars$a) # startval <- c(mean(pars$a), as.numeric(pars$d[, # 2:n.kat])) # # # maxlpre <- maxlpreload(pars) # # optpar <- stats::optim(startval, function(x) { # maxl(x, pars, maxlpre) # }, method = "BFGS") # re <- pars # re$a <- rep(optpar$par[1], n.items) # re$d <- matrix(c(rep(0, n.items), optpar$par[2:length(optpar$par)]), # ncol = ncol(pars$d)) # # return(re) # }) ## ----------------------------------------------------------------------------- # h_2PL_basic <- list(res = function(altpars, nullpars = NULL) { # # n.items <- length(altpars[[1]]) # # re <- list(n.items = n.items, itemtype = "2PL", # Amat = c(0, 1, rep(0, (n.items - 1) * 2)) |> # (function(x) matrix(x, ncol = n.items * # 2, byrow = TRUE))(), cvec = 0, model = mirt::mirt.model(paste("F = 1-", # n.items, " # FIXED = (1, d) # START = (1,d,0)"))) # return(re) # }, unres = function(altpars) { # # re <- list(parsets = altpars, model = 1, itemtype = "2PL", # longpars = pars.long(pars = altpars, itemtype = "2PL")) # # return(re) # }, maximizeL = function(hyp) { # # Hypothesis-specific algorithm to find the # # maximum likelihood restricted parameter set # # # maxlpreload <- function(pars) { # # returns the density for each response # # pattern under the model parameters pars # # patterns <- as.matrix(expand.grid(lapply(seq_len(length(pars$a)), # function(x) c(0, 1)))) # # pre <- c() # for (i in seq_len(nrow(patterns))) { # pre[i] <- funs$g(patterns[i, ], pars) # } # # return(pre) # } # # # maxl <- function(x, pars, pre) { # # calculates the likelihood of parameters # # x given model 'pars' # patterns <- as.matrix(expand.grid(lapply(seq_len(length(pars$a)), # function(x) c(0, 1)))) # # x <- list(a = c(x, pars$a[2:length(pars$a)]), # d = c(0, pars$d[2:length(pars$d)])) # # res <- c() # for (i in seq_len(nrow(patterns))) { # px <- pre[i] # qx <- funs$g(patterns[i, ], x) # res[i] <- { # px * log(qx) # } # } # re <- -sum(res) # } # resmod <- hyp$resmod # unresmod <- hyp$unresmod # # pars <- unresmod$parsets # funs <- load.functions(unresmod$itemtype) # # startval <- pars$a[1] # # maxlpre <- maxlpreload(pars) # # optpar <- stats::optim(startval, function(x) { # maxl(x, pars, maxlpre) # }, method = "BFGS") # re <- pars # re$a <- c(optpar$par[1], pars$a[2:length(pars$a)]) # re$d <- c(0, pars$d[2:length(pars$d)]) # # return(re) # }) ## ----------------------------------------------------------------------------- # h_3PL_basic <- list(res = function(altpars, nullpars = NULL) { # n.items <- length(altpars[[2]]) # # re <- list(n.items = n.items, itemtype = "3PL", # Amat = c(1, 0, 0, rep(0, (n.items - 1) * 3), # 0, 1, 0, rep(0, (n.items - 1) * 3), 0, # 0, 1, rep(0, (n.items - 1) * 3)) |> # matrix(ncol = n.items * 3, byrow = TRUE), # cvec = c(1, 0, 0.2), model = mirt::mirt.model(paste("F = 1-", # n.items, " # FIXED = (1, d), (1,a1), (1,g) # START = (1,d,0),(1,a1,1),(1,g,.2)"))) # return(re) # }, unres = function(altpars) { # n.items <- length(altpars[[2]]) # # re <- list(parsets = altpars, model = 1, itemtype = "3PL", # longpars = pars.long(pars = altpars, itemtype = "3PL")) # # return(re) # }, maximizeL = function(hyp) { # # Hypothesis-specific algorithm to find the # # maximum likelihood restricted parameter set # # # maxlpreload <- function(pars) { # # returns the density for each response # # pattern under the model parameters pars # # patterns <- as.matrix(expand.grid(lapply(seq_len(length(pars$a)), # function(x) c(0, 1)))) # # pre <- c() # for (i in seq_len(nrow(patterns))) { # pre[i] <- funs$g(patterns[i, ], pars) # } # # return(pre) # } # # # maxl <- function(x, pars, pre) { # # calculates the likelihood of parameters # # x given model 'pars' # patterns <- as.matrix(expand.grid(lapply(seq_len(length(pars$a)), # function(x) c(0, 1)))) # # x <- list(a = c(x, pars$a[2:length(pars$a)]), # d = c(0, pars$d[2:length(pars$d)])) # # res <- c() # for (i in seq_len(nrow(patterns))) { # px <- pre[i] # qx <- funs$g(patterns[i, ], x) # res[i] <- { # px * log(qx) # } # } # re <- -sum(res) # } # resmod <- hyp$resmod # unresmod <- hyp$unresmod # # pars <- unresmod$parsets # funs <- load.functions(unresmod$itemtype) # # startval <- pars$a[1] # # maxlpre <- maxlpreload(pars) # # optpar <- stats::optim(startval, function(x) { # maxl(x, pars, maxlpre) # }, method = "BFGS") # re <- pars # re$a <- c(optpar$par[1], pars$a[2:length(pars$a)]) # re$d <- c(0, pars$d[2:length(pars$d)]) # # return(re) # }) ## ----------------------------------------------------------------------------- # h_multi_basic <- list(res = function(altpars, nullpars = NULL) { # n.items <- length(altpars[[2]]) # # re <- list(n.items = n.items, itemtype = "2PL", # Amat = c(0, 0, 1, 0, 0, -1, rep(0, (n.items - # 3) * 3 + 2)) |> # matrix(ncol = n.items * 3 - 1, byrow = TRUE), # cvec = 0, model = mirt::mirt.model(paste("F1 = 1-", # n.items, " # F2 = 1-", # n.items - 1, " # CONSTRAIN = (1-2, d"))) # return(re) # }, unres = function(altpars) { # n.items <- length(altpars[[2]]) # # re <- list(parsets = altpars, model = mirt::mirt.model(paste("F1 = 1-", # n.items, " # F2 = 1-", # n.items - 1, "")), itemtype = "2PL", longpars = pars.long(pars = altpars, # itemtype = "2PL")) # # return(re) # }, maximizeL = function(hyp) { # # Hypothesis-specific algorithm to find the # # maximum likelihood restricted parameter set # # # not written yet, only sampling-based # # available for now # }) ## ----------------------------------------------------------------------------- # h_multi_basic2 <- list(res = function(altpars, nullpars = NULL) { # n.items <- length(altpars[[2]]) # # re <- list(n.items = n.items, itemtype = "2PL", # Amat = c(0, 0, 1, rep(0, (n.items - 2) * 3 + # 2)) |> # matrix(ncol = n.items * 3 - 1, byrow = TRUE), # cvec = 2, model = mirt::mirt.model(paste("F1 = 1-", # n.items, " # F2 = 1-", # n.items - 1, " # FIXED = (1, d) # START = (1,d,2)"))) # return(re) # }, unres = function(altpars) { # n.items <- length(altpars[[2]]) # # re <- list(parsets = altpars, model = mirt::mirt.model(paste("F1 = 1-", # n.items, " # F2 = 1-", # n.items - 1, "")), itemtype = "2PL", longpars = pars.long(pars = altpars, # itemtype = "2PL")) # # return(re) # }, maximizeL = function(hyp) { # # Hypothesis-specific algorithm to find the # # maximum likelihood restricted parameter set # # # not written yet, only sampling-based # # available for now # })