Chapter 4 Avaliar a equalização

Para comparar o teste de um ano com o teste do ano seguinte, adotamos o procedimento adaptado do artigo de Yu & Popp (2005). Para cada ano, adotamos o seguinde procedimento:

  1. Excluir os itens com DIF
  2. Selecionar as pessoas que responderam todos os itens dos dois anos
  3. Calibrar cada ano em separado somente com essas pessoas
  4. Calcular o theta das pessoas em cada ano
  5. Plotar as notas em um gráfico
  6. No mesmo gráfico plotar os limites inferior e superior

Para isso, criamos duas funções para facilitar o procedimento. A primeira função é para calcular os limites inferior e superior.

lim.func <- function(theta1, theta2, erro1, erro2)
{
  lim.inf <- (theta1 + theta2)/2 - sqrt(erro1^2 + erro2^2)
  lim.sup <- (theta1 + theta2)/2 + sqrt(erro1^2 + erro2^2)
  
  return (data.frame(lim.inf, lim.sup))
}

A segunda função é para fazer todo o resto do procedimento

gera_grafico <- function(banco_total, ano1, ano2)
{
  
  # selecionar os itens dos dois anos
  resp <- data.frame(
    ID = banco_total$ID,
    banco_total[,substr(names (banco_total), 2, 5) %in% c(ano1, ano2)]
  )
  
  # selecionar as pessoas que responderam todos os itens dos dois anos
  resp <- resp [which (rowSums(is.na(resp)) == 0),]
  
  # selecionar os itens do ano1
  resp1 <- data.frame(
    ID = resp$ID,
    resp[,substr(names (resp), 2, 5) == ano1]
  )
  
  # calibrar
  calib1 <- mirt (
    resp1[,-c(1)],
    1,
    itemtype = 'Rasch',
    TOL = .01
  )
  
  # calcular o theta
  theta1 <- data.frame (
    ID = resp1$ID,
    fscores(calib1, full.scores.SE = TRUE)
  )
  
  # fazer o mesmo para o ano2
  resp2 <- data.frame(
    ID = resp$ID,
    resp[,substr(names (resp), 2, 5) == ano2]
  )
  
  calib2 <- mirt (
    resp2[,-c(1)],
    1,
    itemtype = 'Rasch',
    TOL = .01
  )
  
  theta2 <- data.frame (
    ID = resp2$ID,
    fscores(calib2, full.scores.SE = TRUE)
  )
  
  # verificar diferença entre as médias
  dif_media <- mean(theta1$F1) - mean (theta2$F1)
  
  # criar tabela do theta2 com o theta deslocado
  pad2 <- data.frame (
    ID = theta2$ID,
    F2 = theta2$F1 + dif_media,
    erro2 = theta2$SE_F1
  )
  
  # juntar as duas tabelas
  comp <- inner_join(
    theta1,
    pad2,
    by = 'ID'
  )
  names (comp)[3] <- 'erro1'
  
  # calcular os limites
  limites <- lim.func (comp$F1, comp$F2, comp$erro1, comp$erro2)
  
  # juntar com a tabela anterior
  comp <- cbind(comp, limites)
  
  # gerar o gráfico
  plot <- ggplot(comp) +
    geom_point(aes(x = F1, y = F2)) +
    geom_point(aes(x = lim.inf, y = lim.sup, colour = 'red')) +
    geom_point(aes(x = lim.sup, y = lim.inf, colour = 'red'))
  
  ggplotly(plot)
}

Agora gerar os gráficos

gera_grafico(dplyr::select (banco19_20, !(c(dif19, dif20))), 2019, 2020)
## 
Iteration: 1, Log-Lik: -12427.364, Max-Change: 0.65275
Iteration: 2, Log-Lik: -12368.260, Max-Change: 0.06345
Iteration: 3, Log-Lik: -12365.649, Max-Change: 0.01533
Iteration: 4, Log-Lik: -12365.247, Max-Change: 0.00855
## 
Iteration: 1, Log-Lik: -10829.536, Max-Change: 0.25387
Iteration: 2, Log-Lik: -10825.410, Max-Change: 0.01987
Iteration: 3, Log-Lik: -10825.326, Max-Change: 0.00588
gera_grafico(dplyr::select (banco20_21, !(c(dif20, dif21))), 2020, 2021)
## 
Iteration: 1, Log-Lik: -11061.416, Max-Change: 0.48784
Iteration: 2, Log-Lik: -11031.849, Max-Change: 0.06605
Iteration: 3, Log-Lik: -11030.666, Max-Change: 0.01471
Iteration: 4, Log-Lik: -11030.580, Max-Change: 0.00920
## 
Iteration: 1, Log-Lik: -10175.993, Max-Change: 0.40155
Iteration: 2, Log-Lik: -10161.746, Max-Change: 0.05062
Iteration: 3, Log-Lik: -10161.159, Max-Change: 0.01086
Iteration: 4, Log-Lik: -10161.029, Max-Change: 0.00638