1 Introdução

A Teoria de Resposta ao Item (TRI) modela a probabilidade de uma pessoa acertar um item a partir de dois componentes: a habilidade de quem responde, representada por \(\theta\), e as características do item. Nos modelos mais conhecidos, essas características são a dificuldade e a discriminação, e a probabilidade de acerto toma a forma de uma curva logística:

\[ P(X_{ij}=1 \mid \theta_i) = \dfrac{1}{1 + e^{-a_j(\theta_i - b_j)}} , \]

em que \(a_j\) controla a inclinação e \(b_j\) a posição da curva ao longo do eixo da habilidade. Esse é o modelo de dois parâmetros (2PL). A construção dos modelos de um e de dois parâmetros, com a derivação detalhada, está em uma publicação anterior.

A curva logística carrega uma suposição incompatível com itens de múltipla escolha. Quando a habilidade tende a \(-\infty\), a probabilidade de acerto tende a zero. Em uma questão de cinco alternativas, porém, mesmo um respondente que não domina o conteúdo pode marcar a alternativa correta por acaso. Para esse respondente, a probabilidade de acerto não é nula: ela se aproxima da chance de acerto ao acaso. O modelo de três parâmetros incorpora exatamente essa possibilidade.

2 O modelo logístico de 3 parâmetros (3PL)

O 3PL acrescenta um terceiro parâmetro, \(c_j\), que representa a probabilidade de acerto ao acaso, o chamado acerto casual:

\[ P(X_{ij}=1 \mid \theta_i) = c_j + (1 - c_j)\,\dfrac{1}{1 + e^{-a_j(\theta_i - b_j)}} . \]

Os parâmetros do modelo são interpretados da seguinte forma:

  • \(a_j\) é a discriminação, associada à inclinação da curva.
  • \(b_j\) é a dificuldade, associada à posição da curva no eixo da habilidade.
  • \(c_j\) é a assíntota inferior: a curva não parte de zero, e sim de \(c_j\).

2.1 A reinterpretação de \(b\) no 3PL

No 1PL e no 2PL, a dificuldade \(b_j\) é o ponto em que a probabilidade de acerto vale exatamente \(0{,}5\). No 3PL essa relação deixa de valer. Substituindo \(\theta_i = b_j\) na fórmula, o termo logístico vale \(0{,}5\), e a probabilidade no ponto de inflexão passa a ser:

\[ P(\theta_i = b_j) = c_j + \dfrac{1 - c_j}{2} = \dfrac{1 + c_j}{2} . \]

Assim, em um item com \(c_j = 0{,}2\), a probabilidade de acerto no ponto de dificuldade é \(0{,}6\), e não \(0{,}5\). O \(b_j\) passa a marcar o ponto de inflexão da curva, e não mais o ponto de probabilidade \(0{,}5\).

A inclinação máxima da curva também muda. Ela ocorre em \(\theta_i = b_j\) e vale:

\[ \left.\dfrac{\partial P}{\partial \theta}\right|_{\theta = b_j} = \dfrac{a_j (1 - c_j)}{4} . \]

O acerto casual, portanto, reduz a inclinação máxima: quanto maior \(c_j\), menor a inclinação possível para um mesmo \(a_j\).

3 Por que o ENEM usa o 3PL

O ENEM é composto por itens de múltipla escolha com cinco alternativas. A probabilidade teórica de acerto ao acaso é \(1/5 = 0{,}2\), o que torna o acerto casual um componente real da prova. Por esse motivo, o exame adota o modelo de 3 parâmetros desde 2009.

Uma ressalva é necessária. O \(c_j\) estimado raramente coincide com \(0{,}2\). Distratores atraentes reduzem o valor estimado, enquanto alternativas implausíveis o elevam. O \(c_j\) é uma quantidade empírica de cada item, e não a fração \(1/k\) definida pelo número de alternativas.

4 Simulando dados com acerto casual

Geramos as respostas de 20 itens dicotômicos segundo o 3PL, com 3000 respondentes. A amostra grande é intencional, e o motivo dessa escolha aparece na seção sobre estimação.

A função simdata do pacote mirt opera na parametrização inclinação-intercepto, em que o preditor linear é \(a_j \theta_i + d_j\). Para definir a dificuldade \(b_j\) diretamente, usamos a relação \(d_j = -a_j b_j\). O acerto casual é informado pelo argumento guess.

set.seed(2024)

n_itens <- 20
N <- 3000

a_v <- round(runif(n_itens, 1.0, 2.2), 2)                       # discriminação verdadeira
b_v <- round(pmin(pmax(rnorm(n_itens, 0, 0.9), -2.2), 2.2), 2)  # dificuldade verdadeira
c_v <- round(runif(n_itens, 0.12, 0.20), 2)                     # acerto casual verdadeiro

dados <- simdata(
  a = matrix(a_v),
  d = matrix(-a_v * b_v),
  guess = c_v,
  N = N,
  itemtype = "3PL"
)
colnames(dados) <- paste0("Item ", 1:n_itens)

verdadeiros <- data.frame(
  Item = paste0("Item ", 1:n_itens),
  a = a_v,
  b = b_v,
  c = c_v
)

tabela(verdadeiros, "Parâmetros verdadeiros usados na simulação")

5 Ajustando o 3PL

O ajuste usa a função mirt com itemtype = "3PL", e exige um cuidado adicional. O acerto casual é o parâmetro mais difícil de estimar, pois depende dos respondentes de habilidade baixa, faixa em que muitos itens têm poucas observações. Sem nenhuma restrição, o \(c\) de alguns itens assume valores irreais, como será mostrado na próxima seção. Para evitar esse comportamento, adotamos uma distribuição a priori sobre o acerto casual.

No mirt, essa distribuição a priori é declarada dentro do objeto de modelo, pela palavra-chave PRIOR. O tipo expbeta corresponde a uma distribuição Beta aplicada a um parâmetro restrito ao intervalo de 0 a 1, como é o caso do acerto casual. Uma Beta de parâmetros \((\alpha, \beta)\) tem média \(\alpha / (\alpha + \beta)\), de modo que expbeta(4, 16) centra a priori em \(4/20 = 0{,}2\), valor que corresponde à probabilidade de acerto ao acaso em uma questão de cinco alternativas. O modelo permanece livre para afastar o \(c\) de \(0{,}2\) quando os dados assim indicam, mas a priori evita que a estimativa dispare em itens com pouca informação.

Os parâmetros são apresentados na métrica clássica da TRI com IRTpars = TRUE, em que a coluna g corresponde ao acerto casual \(c_j\) e a coluna u à assíntota superior, fixa em 1.

modelo_prior <- mirt.model(paste0("F = 1-", n_itens, "\n",
                                  "PRIOR = (1-", n_itens, ", g, expbeta, 4, 16)"))

mod3 <- mirt(dados, modelo_prior, itemtype = "3PL",
             technical = list(NCYCLES = 2000), verbose = FALSE)

est3 <- as.data.frame(coef(mod3, IRTpars = TRUE, simplify = TRUE)$items)

est3_tab <- data.frame(
  Item = rownames(est3),
  a = est3$a,
  b = est3$b,
  g = est3$g
)
names(est3_tab) <- c("Item", "a (discriminação)", "b (dificuldade)", "g (acerto casual)")

tabela(est3_tab, "Parâmetros estimados pelo modelo 3PL")

Comparadas à tabela dos parâmetros verdadeiros, as estimativas estão próximas dos valores reais. O item com maior acerto casual estimado foi o Item 7, com \(g \approx\) 0.18.

5.1 As curvas características do item

A função plot com type = "trace" desenha todas as curvas características. Nenhuma delas tende a zero à esquerda: cada curva se estabiliza no valor do respectivo \(c_j\).

plot(mod3, type = "trace", facet_items = TRUE, main = "")
Curvas características dos 20 itens no modelo 3PL

Curvas características dos 20 itens no modelo 3PL

Para destacar o papel do acerto casual, isolamos o item de maior \(c_j\) e marcamos a assíntota inferior.

p3 <- function(theta, a, b, c) c + (1 - c) / (1 + exp(-a * (theta - b)))

i <- which.max(est3$g)
item_label <- paste0("Item ", i)
theta <- seq(-4, 4, length.out = 300)

df_item <- data.frame(
  theta = theta,
  P = p3(theta, est3$a[i], est3$b[i], est3$g[i])
)

ggplot(df_item, aes(theta, P)) +
  geom_line(color = "#2C7FB8", linewidth = 0.8) +
  geom_hline(yintercept = est3$g[i], linetype = "dotted", color = "gray30") +
  annotate("text", x = -3.6, y = est3$g[i] + 0.08,
           label = paste0("c = ", round(est3$g[i], 2)),
           hjust = 0, color = "gray30") +
  labs(
    title = paste0("Curva característica do ", item_label),
    x = expression(theta ~ "(habilidade)"),
    y = "Probabilidade de acerto"
  ) +
  ylim(0, 1)
O acerto casual como assíntota inferior da curva

O acerto casual como assíntota inferior da curva

6 O custo de ignorar o acerto casual

O que ocorre ao ajustar um 2PL a dados que contêm acerto casual? Para responder, ajustamos esse modelo e comparamos as estimativas com as do 3PL.

mod2 <- mirt(dados, model = 1, itemtype = "2PL", verbose = FALSE)
est2 <- as.data.frame(coef(mod2, IRTpars = TRUE, simplify = TRUE)$items)

comparacao <- data.frame(
  Item = paste0("Item ", 1:n_itens),
  a_verdadeiro = a_v,
  a_2PL = round(est2$a, 2),
  a_3PL = round(est3$a, 2),
  b_verdadeiro = b_v,
  b_2PL = round(est2$b, 2),
  b_3PL = round(est3$b, 2)
)
names(comparacao) <- c("Item", "a verdadeiro", "a 2PL", "a 3PL",
                       "b verdadeiro", "b 2PL", "b 3PL")

tabela(comparacao, "Discriminação e dificuldade: valor verdadeiro contra 2PL e 3PL")

O 2PL não dispõe de um parâmetro para o platô inferior, de modo que acomoda o acerto casual distorcendo os outros dois. Na prática, a dificuldade estimada pelo 2PL tende a se afastar do valor verdadeiro, em geral para baixo, e a discriminação é subestimada nos itens mais difíceis. O 3PL, por reservar um parâmetro ao acerto casual, recupera \(a\) e \(b\) mais próximos dos valores verdadeiros.

A sobreposição das duas curvas para um mesmo item torna o efeito evidente.

P_3pl <- p3(theta, est3$a[i], est3$b[i], est3$g[i])
P_2pl <- 1 / (1 + exp(-est2$a[i] * (theta - est2$b[i])))

df_overlay <- data.frame(
  theta = rep(theta, 2),
  P = c(P_3pl, P_2pl),
  Modelo = rep(c("3PL", "2PL"), each = length(theta))
)

ggplot(df_overlay, aes(theta, P, color = Modelo, linetype = Modelo)) +
  geom_line(linewidth = 0.8) +
  geom_hline(yintercept = est3$g[i], linetype = "dotted", color = "gray30") +
  scale_color_manual(values = c("3PL" = "#2C7FB8", "2PL" = "#D95F0E")) +
  labs(
    title = paste0(item_label, ": ajustes 2PL e 3PL"),
    x = expression(theta ~ "(habilidade)"),
    y = "Probabilidade de acerto"
  ) +
  ylim(0, 1)
O mesmo item ajustado por 2PL e por 3PL

O mesmo item ajustado por 2PL e por 3PL

7 A dificuldade de estimar o acerto casual

O \(c\) é o parâmetro mais difícil de estimar no 3PL. Ele depende dos respondentes de habilidade baixa, faixa em que, na maioria dos itens, há poucas observações, de modo que os dados trazem pouca informação sobre ele. Foi por isso que ancoramos a estimação em uma distribuição a priori. Para avaliar o efeito dessa âncora, reajustamos o mesmo conjunto de dados com o acerto casual totalmente livre.

mod3_livre <- mirt(dados, model = 1, itemtype = "3PL",
                   technical = list(NCYCLES = 2000), verbose = FALSE)
est3_livre <- as.data.frame(coef(mod3_livre, IRTpars = TRUE, simplify = TRUE)$items)

estimacao <- data.frame(
  Item = paste0("Item ", 1:n_itens),
  c_verdadeiro = c_v,
  g_com_prior = round(est3$g, 2),
  g_sem_prior = round(est3_livre$g, 2)
)
names(estimacao) <- c("Item", "c verdadeiro", "g (com priori)", "g (sem priori)")

tabela(estimacao, "Acerto casual: valor verdadeiro, com priori e sem priori")

Sem a priori, o acerto casual de alguns itens assume valores muito acima de qualquer acerto ao acaso plausível, enquanto a versão com priori mantém as estimativas próximas da faixa real. Cabe uma ressalva: mesmo com a priori, não convém interpretar pequenas diferenças de \(c\) entre itens como se fossem exatas. O acerto casual é uma quantidade mal determinada por natureza, e por isso programas de larga escala combinam amostras grandes, como os milhões de provas do ENEM, com restrições desse tipo na estimação.

8 A informação do item no 3PL

A inclinação da curva indica o quanto o item distingue habilidades próximas, ideia que se formaliza na função de informação. Para o 3PL, ela é dada pela fórmula de Lord:

\[ I_j(\theta) = a_j^2 \,\dfrac{Q_j(\theta)}{P_j(\theta)}\left(\dfrac{P_j(\theta) - c_j}{1 - c_j}\right)^2, \qquad Q_j(\theta) = 1 - P_j(\theta). \]

Dessa expressão decorrem dois fatos, ambos consequência direta do acerto casual.

O primeiro: um item com acerto casual informa menos do que informaria sem ele. O fator \(\left(\frac{P - c}{1 - c}\right)^2\) reduz a informação na região de habilidade baixa, justamente onde o acerto pode ter ocorrido ao acaso.

O segundo, mais sutil: o pico de informação não fica em \(\theta = b_j\). Ele se desloca para a direita, para uma habilidade acima da dificuldade do item, na posição:

\[ \theta^{*}_j = b_j + \dfrac{1}{a_j}\,\ln\!\left(\dfrac{1 + \sqrt{1 + 8 c_j}}{2}\right). \]

Quando \(c_j = 0\), o logaritmo se anula e \(\theta^{*}_j = b_j\), o que recupera o resultado do 2PL. Note o contraste: a curva é mais inclinada em \(b_j\), mas o item mede com mais precisão um pouco acima de \(b_j\).

O gráfico a seguir compara a informação do item com acerto casual à informação que ele teria se \(c_j\) fosse zero, mantidos o mesmo \(a_j\) e \(b_j\).

info3 <- function(theta, a, b, c) {
  P <- p3(theta, a, b, c)
  Q <- 1 - P
  a^2 * (Q / P) * ((P - c) / (1 - c))^2
}

a_i <- est3$a[i]; b_i <- est3$b[i]; c_i <- est3$g[i]

I_com <- info3(theta, a_i, b_i, c_i)
P_sem <- 1 / (1 + exp(-a_i * (theta - b_i)))
I_sem <- a_i^2 * P_sem * (1 - P_sem)

theta_pico <- b_i + (1 / a_i) * log((1 + sqrt(1 + 8 * c_i)) / 2)

df_info <- data.frame(
  theta = rep(theta, 2),
  Info = c(I_com, I_sem),
  Curva = rep(c("Com acerto casual", "Sem acerto casual (c = 0)"),
              each = length(theta))
)

ggplot(df_info, aes(theta, Info, color = Curva)) +
  geom_line(linewidth = 0.8) +
  geom_vline(xintercept = b_i, linetype = "dashed", color = "gray40") +
  geom_vline(xintercept = theta_pico, linetype = "dotted", color = "#2C7FB8") +
  annotate("text", x = b_i, y = max(df_info$Info) * 0.15,
           label = "b", hjust = 1.3, color = "gray40") +
  annotate("text", x = theta_pico, y = max(df_info$Info) * 0.95,
           label = "pico", hjust = -0.2, color = "#2C7FB8") +
  scale_color_manual(values = c("Com acerto casual" = "#2C7FB8",
                                "Sem acerto casual (c = 0)" = "#D95F0E")) +
  labs(
    title = paste0("Função de informação do ", item_label),
    x = expression(theta ~ "(habilidade)"),
    y = expression(I(theta))
  )
Função de informação e o efeito do acerto casual

Função de informação e o efeito do acerto casual

A curva com acerto casual é mais baixa e tem o pico deslocado para a direita, como a fórmula previa.

9 O ganho do 3PL se justifica?

Mais parâmetros sempre melhoram o ajuste dentro da amostra, de modo que a questão é se a melhora justifica o custo. A função anova compara os dois modelos por critérios de informação como AIC e BIC, que penalizam a complexidade.

anova(mod2, mod3)
##          AIC    SABIC       HQ      BIC    logLik   logPost df
## mod2 61432.9 61546.06 61519.32 61673.16 -30676.45 -30676.45 NA
## mod3 61276.5 61446.24 61406.13 61636.88 -30578.25 -30547.69 20

Valores menores de AIC e BIC indicam o modelo preferido. Em provas de múltipla escolha, o 3PL costuma ser o escolhido, pois o acerto casual está de fato presente nos dados. Em instrumentos sem acerto ao acaso, como questionários de resposta livre, o terceiro parâmetro tende a não compensar, e o 2PL é mais adequado.

10 Considerações finais

O 3PL acrescenta um parâmetro de significado concreto, o acerto casual, e traz três consequências principais:

  1. A dificuldade \(b\) deixa de indicar a probabilidade \(0{,}5\) e passa a marcar o ponto de inflexão, em que a probabilidade vale \(\frac{1+c}{2}\).
  2. O \(c\) é mal determinado, pois depende dos respondentes de habilidade baixa, e em geral exige amostra grande e uma distribuição a priori para se manter estável.
  3. O acerto casual reduz a informação do item e desloca o pico de precisão para uma habilidade acima de \(b\).

A partir daqui, um caminho natural é agregar a informação de todos os itens para obter a função de informação do teste, relacioná-la ao erro padrão da medida e discutir como provas de anos diferentes são postas na mesma escala. Esse é o problema da equalização, que está por trás da comparação de notas entre edições do ENEM.