tests/testthat/test-d2LL.R

context("d2LL")
load("cat_objects.Rdata")

d2LL_test <- function(cat, theta, usePrior) {
  answered_questions <- which(!is.na(cat@answers))
  prior_shift <- 1 / cat@priorParams[2]^2

  if(length(answered_questions) == 0) {
    L_theta <- prior_shift
  }

  sum_this <- rep(0, length(answered_questions))

  if(cat@model == "ltm" | cat@model == "tpm"){
    for(i in 1:length(answered_questions)){
      item <- answered_questions[i]
      P <- probability(cat, theta, item)
      Q <- 1 - P
      sum_this[i] <- cat@discrimination[i]^2 * ((P-cat@guessing[i]) /
                                               (1-cat@guessing[i]))^2 * (Q/P)
      }
    L_theta <- (-1 * sum(sum_this))
  }

  if(cat@model == "grm"){
    for(i in 1:length(answered_questions)){
      item <- answered_questions[i]
      answer_k <- cat@answers[item]
      probs <- probability(cat, theta, item)
      Pstar1 <- probs[answer_k+1]
      Qstar1 <- 1-Pstar1
      Pstar2 <- probs[answer_k]
      Qstar2 <- 1 - Pstar2
      P <- Pstar1 - Pstar2
      W2 <- Pstar2 * Qstar2
      W1 <- Pstar1 * Qstar1
      sum_this[i] <- cat@discrimination[i]^2 * ((-W2*(Qstar2-Pstar2)
                                                 + W1*(Qstar1-Pstar1)) /
                                                P - ((W1 - W2)^2/P^2))
    }
    L_theta <- sum(sum_this)
  }

  if(cat@model == "gpcm"){
    for(i in 1:length(answered_questions)){
      ## first and second derivatives of probability
      item <- answered_questions[i]
      discrimination = cat@discrimination[item]
      categoryparams = c(0, cat@difficulty[[item]])
      f <- f_prime <- f_primeprime <- rep(NA,length(categoryparams))
      for(ans in 1:length(categoryparams)){
        f[ans] <- exp(sum(discrimination * (theta - categoryparams[1:ans])))
        f_prime[ans] <- f[ans] * (discrimination * ans)
        f_primeprime[ans] <- f[ans] * (discrimination * ans)^2
      }
      g <- sum(f)
      g_prime <- sum(f * (discrimination * 1:length(categoryparams)))
      g_primeprime <- sum(f * (discrimination * 1:length(categoryparams))^2)
      p_prime <- (g * f_prime - f * g_prime) / g^2

      a <- (g * f_prime - f * g_prime)
      a_prime <- f_primeprime * g - g_primeprime * f
      b <- g^2
      b_prime <- (2 * g) * g_prime
      p_primeprime <- (b * a_prime - a * b_prime) / b^2

      answer_k <- cat@answers[item]
      p <- probability(cat, theta, item)
      sum_this[i] <- ((p_prime[answer_k]^2 / p[answer_k]^2)
                      - (p_primeprime[answer_k] / p[answer_k]))
      }
    L_theta <- - sum(sum_this)
  }

  if(usePrior == TRUE){
    L_theta <- L_theta - prior_shift
  }
  return(L_theta)
}

test_that("ltm d2LL calculates correctly", {
  ltm_cat@answers[1:5] <- c(0, 1, 0, 0, 1)
  package_d2LL <- d2LL(ltm_cat, 1, FALSE)
  test_d2LL <- d2LL_test(ltm_cat, 1, FALSE)

  expect_equal(package_d2LL, test_d2LL)
})

test_that("grm d2LL calculates correctly", {
  grm_cat@answers[1:5] <- c(4, 5, 2, 4, 4)
  package_d2LL <- d2LL(grm_cat, 1, FALSE)
  test_d2LL <- d2LL_test(grm_cat, 1, FALSE)

  expect_equal(package_d2LL, test_d2LL)
})

test_that("gpcm d2LL calculates correctly", {
  gpcm_cat@answers[1:5] <- c(4, 5, 2, 4, 4)
  package_d2LL <- d2LL(gpcm_cat, 1, FALSE)
  test_d2LL <- d2LL_test(gpcm_cat, 1, FALSE)

  expect_equal(package_d2LL, test_d2LL)
})
erossiter/catSurv documentation built on Dec. 11, 2022, 6:36 p.m.