Chapter 6 Theta

Calcular o theta ano a ano. Primeiro criar a função para isso.

calcula_theta <- function (prova, modelo, faculdade)
{
  # selecionar as pessoas do ano
  banco_ano <- dplyr::filter (banco_theta, anoTP == prova & grupo == faculdade) %>%
    select ('ID', 'ID2', 'ID3', 'anoTP', starts_with(paste0('Q', prova)))
  
  # calcular o theta
  banco_ano$theta <- data.frame (fscores(modelo[[paste0('mod_', prova)]], response.pattern = banco_ano[,5:ncol(banco_ano)]))$F1
  
  return(banco_ano)
}

Criar um modelo mirt para cada edição do teste

mod.ano_unesp <- list()

i <- 1
for(ano in 2019:2021)
{
  pars.ano_unesp <- pars_unesp [substr(rownames(pars_unesp), 2, 5) == ano,]
  pars.mirt_unesp <- data.frame(
    a1 = pars.ano_unesp$a,
    d = -pars.ano_unesp$a * pars.ano_unesp$b,
    g = 0
  )
  
  mod.ano_unesp[[i]] <- generate.mirt_object(pars.mirt_unesp, '2PL')
  
  i <- i + 1
}
names (mod.ano_unesp) <- paste0('mod_', 2019:2021)

mod.ano_unesp <- list()

i <- 1
for(ano in 2019:2021)
{
  pars.ano_unesp <- pars_unesp [substr(rownames(pars_unesp), 2, 5) == ano,]
  pars.mirt_unesp <- data.frame(
    a1 = pars.ano_unesp$a,
    d = -pars.ano_unesp$a * pars.ano_unesp$b,
    g = 0
  )
  
  mod.ano_unesp[[i]] <- generate.mirt_object(pars.mirt_unesp, '2PL')
  
  i <- i + 1
}
names (mod.ano_unesp) <- paste0('mod_', 2019:2021)

mod.ano_unicamp = list()
i = 1
for(ano in 2019:2021)
{
  pars.ano_unicamp <- pars_unicamp [substr(rownames(pars_unicamp), 2, 5) == ano,]
  pars.mirt_unicamp <- data.frame(
    a1 = pars.ano_unicamp$a,
    d = -pars.ano_unicamp$a * pars.ano_unicamp$b,
    g = 0
  )
  
  mod.ano_unicamp[[i]] <- generate.mirt_object(pars.mirt_unicamp, '2PL')
  
  i <- i + 1
}
names (mod.ano_unicamp) <- paste0('mod_', 2019:2021)

Agora calcular e armazenar no objeto.

# fazer cruzamento do banco das respostas com o banco inicial
banco_theta <- left_join(banco[, c('ID', 'ID2', 'ID3', 'anoTP')], banco_total, by = 'ID2')

nrow(banco_theta)
## [1] 3534
banco_theta_ano_unesp <- list()
banco_theta_ano_unicamp <- list()

for (prova in 2019:2021)
  banco_theta_ano_unesp[[paste0('theta_', prova)]] <- calcula_theta(prova, mod.ano_unesp, 'unesp')

for (prova in 2019:2021)
  banco_theta_ano_unicamp[[paste0('theta_', prova)]] <- calcula_theta(prova, mod.ano_unicamp, 'unicamp')

table (banco_theta_ano_unesp[[paste0('theta_', prova)]]$anoTP)
## 
## 2021 
##  525
table(banco$anoTP, banco$grupo)
##       
##        unesp unicamp
##   2019   522     676
##   2020   532     625
##   2021   525     654

Inserir o theta no objeto banco_final.

banco_final <- data.frame()

for (prova in 2019:2021)
{
  banco.ano <- filter (banco, anoTP == prova & grupo == 'unesp')
  banco.ano <- left_join(banco.ano, banco_theta_ano_unesp[[paste0('theta_', prova)]][,c('ID3', 'theta')], by = 'ID3')
  
  banco_final <- rbind (banco_final, banco.ano)
}


for (prova in 2019:2021)
{
  banco.ano <- filter (banco, anoTP == prova & grupo == 'unicamp')
  banco.ano <- left_join(banco.ano, banco_theta_ano_unicamp[[paste0('theta_', prova)]][,c('ID3', 'theta')], by = 'ID3')
  
  banco_final <- rbind (banco_final, banco.ano)
}

reactable (
  select (banco_final, ID, ID2, ID3, anoTP, ano_aluno, grupo, total, theta),
  filterable = TRUE,
  defaultColDef = colDef(align = "center"),
  highlight = TRUE,
  showPagination = TRUE,
  defaultPageSize = 10,
  compact = TRUE
)