library(ltm)
library(fdth)
library(knitr)
library(kableExtra)

1 Introdução

Este relatório apresenta a aplicação de modelos de Teoria de Resposta ao Item (TRI) para dados politômicos utilizando o pacote ltm no R. Foram ajustados cinco modelos a dados simulados com 4 categorias de resposta e 1.000 respondentes:

  • MRG : Modelo de Resposta Gradual (Samejima, 1969): discriminações livres
  • MRG constrained : MRG com discriminação igual para todos os itens
  • MCPG : Modelo de Crédito Parcial Generalizado (Muraki, 1992): discriminações livres
  • MCP 1PL : Modelo de Crédito Parcial com discriminação igual (estimada)
  • MCP Rasch : Modelo de Crédito Parcial com discriminação fixada em 1

Os dados foram simulados com os meus parametros: dificuldades fixas em \(b_1 = -1\), \(b_2 = 0\), \(b_3 = 1\) e discriminações equidistantes no intervalo \([0, 2]\) com seq(0, 2, length.out = 20). O critério para exclusão de itens inadequados é \(a < 0{,}65\); parametros de dificuldade extremos (\(|b| > 5\)) também foram monitorados.


2 Parametros Simulados

2.1 Modelo de Resposta Gradual (MRG)

O Modelo de Resposta Gradual (MRG), proposto por Samejima (1969), é um modelo de TRI para itens politômicos ordenados. Cada item com \(K\) categorias é descrito por \(K-1\) parametros de dificuldade (\(b_k\), chamados de extremidades no pacote ltm) e um parametro de discriminação (\(a\)). Os parametros \(b_k\) representam os pontos do traço latente \(\theta\) em que a probabilidade de escolher a categoria \(k\) ou acima é igual a 0,5.

Para este trabalho, foram simulados 20 itens com 4 categorias de resposta (categorias 1 a 4), com os meus parametros:

  • b1 = -1, b2 = 0, b3 = 1 (fixos para todos os itens)
  • a: equidistante entre 0 e 2 - seq(0, 2, length.out = 20) - variando de 0 (sem poder discriminatório) a 2 (alta discriminação)

Os parametros de dificuldade fixos e simétricos em torno de zero indicam que os itens foram construídos para medir bem indivíduos com traço latente na região central da escala. A variação equidistante da discriminação permite avaliar como o modelo se comporta com itens de qualidade psicométrica crescente.

set.seed(42)

# Parametros: b1=-1, b2=0, b3=1 fixos; a equidistante entre 0 e 2
a_vals <- seq(0, 2, length.out = 20)

itens_mrg <- lapply(1:20, function(u) c(-1, 0, 1, a_vals[u]))

# Exibir tabela dos parametros simulados
params_tab <- data.frame(
  Item = paste0("Item ", 1:20),
  b1   = -1,
  b2   =  0,
  b3   =  1,
  a    = round(a_vals, 4)
)

kable(params_tab,
      caption = "Parametros simulados - MRG",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros simulados - MRG
Item b1 b2 b3 a
Item 1 -1 0 1 0.0000
Item 2 -1 0 1 0.1053
Item 3 -1 0 1 0.2105
Item 4 -1 0 1 0.3158
Item 5 -1 0 1 0.4211
Item 6 -1 0 1 0.5263
Item 7 -1 0 1 0.6316
Item 8 -1 0 1 0.7368
Item 9 -1 0 1 0.8421
Item 10 -1 0 1 0.9474
Item 11 -1 0 1 1.0526
Item 12 -1 0 1 1.1579
Item 13 -1 0 1 1.2632
Item 14 -1 0 1 1.3684
Item 15 -1 0 1 1.4737
Item 16 -1 0 1 1.5789
Item 17 -1 0 1 1.6842
Item 18 -1 0 1 1.7895
Item 19 -1 0 1 1.8947
Item 20 -1 0 1 2.0000
set.seed(42)
respostas.grm <- rmvordlogis(1000, itens_mrg, model = "grm", IRT = FALSE)
head(respostas.grm)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## [1,]    2    4    1    2    4    3    4    4    4     2     4     2     2     4
## [2,]    4    3    3    4    2    3    1    4    3     2     1     2     1     3
## [3,]    3    1    1    1    4    4    4    4    2     1     4     4     2     4
## [4,]    2    3    2    2    4    4    4    4    4     2     2     1     4     4
## [5,]    2    4    4    1    3    3    3    3    2     3     4     2     1     4
## [6,]    3    2    4    1    4    2    2    2    2     2     3     4     1     1
##      [,15] [,16] [,17] [,18] [,19] [,20]
## [1,]     4     4     4     4     3     4
## [2,]     1     2     2     1     1     1
## [3,]     3     4     4     3     3     4
## [4,]     3     4     1     4     1     4
## [5,]     4     1     4     4     4     1
## [6,]     4     4     3     3     2     1

3 Ajuste com o MRG (discriminações livres)

O MRG com discriminações livres (modelo completo) estima um parametro \(a\) distinto para cada item. Isso permite maior flexibilidade, mas requer uma amostra suficientemente grande para estimativas estáveis. As respostas foram geradas para 1.000 indivíduos com traço latente \(\theta \sim N(0,1)\).

3.1 Parametros Iniciais Estimados

grm.par <- grm(respostas.grm)
grm.par
## 
## Call:
## grm(data = respostas.grm)
## 
## Coefficients:
##          Extrmt1  Extrmt2  Extrmt3  Dscrmn
## Item 1    14.626   -0.004  -13.567  -0.072
## Item 2    -7.142   -0.250    6.883   0.152
## Item 3    -8.971   -0.403    9.298   0.109
## Item 4    -3.547    0.007    3.521   0.280
## Item 5    -2.430   -0.032    2.219   0.429
## Item 6    -1.843    0.351    2.271   0.477
## Item 7    -1.266   -0.032    1.333   0.752
## Item 8    -1.542   -0.069    1.287   0.716
## Item 9    -1.199    0.016    1.325   0.796
## Item 10   -1.030    0.049    1.220   0.908
## Item 11   -1.009    0.065    1.102   0.998
## Item 12   -0.982   -0.026    0.839   1.175
## Item 13   -0.738   -0.044    0.759   1.401
## Item 14   -0.656   -0.069    0.570   1.427
## Item 15   -0.560    0.114    0.847   1.480
## Item 16   -0.587    0.042    0.731   1.530
## Item 17   -0.503    0.079    0.554   1.822
## Item 18   -0.536    0.007    0.619   1.848
## Item 19   -0.492    0.089    0.641   1.890
## Item 20   -0.411    0.039    0.473   1.950
## 
## Log.Lik: -25332.76
coef_grm <- coef(grm.par)
df_grm_ini <- as.data.frame(coef_grm)
df_grm_ini$Item <- rownames(df_grm_ini)
rownames(df_grm_ini) <- NULL
df_grm_ini <- df_grm_ini[, c("Item", "Extrmt1", "Extrmt2", "Extrmt3", "Dscrmn")]

kable(df_grm_ini,
      digits = 4,
      caption = "Parametros iniciais estimados - MRG",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros iniciais estimados - MRG
Item Extrmt1 Extrmt2 Extrmt3 Dscrmn
Item 1 14.626 -0.004 -13.567 -0.072
Item 2 -7.142 -0.250 6.883 0.152
Item 3 -8.971 -0.403 9.298 0.109
Item 4 -3.547 0.007 3.521 0.280
Item 5 -2.430 -0.032 2.219 0.429
Item 6 -1.843 0.351 2.271 0.477
Item 7 -1.266 -0.032 1.333 0.752
Item 8 -1.542 -0.069 1.287 0.716
Item 9 -1.199 0.016 1.325 0.796
Item 10 -1.030 0.049 1.220 0.908
Item 11 -1.009 0.065 1.102 0.998
Item 12 -0.982 -0.026 0.839 1.175
Item 13 -0.738 -0.044 0.759 1.401
Item 14 -0.656 -0.069 0.570 1.427
Item 15 -0.560 0.114 0.847 1.480
Item 16 -0.587 0.042 0.731 1.530
Item 17 -0.503 0.079 0.554 1.822
Item 18 -0.536 0.007 0.619 1.848
Item 19 -0.492 0.089 0.641 1.890
Item 20 -0.411 0.039 0.473 1.950

3.2 Remoção de Itens Inadequados

n_orig <- ncol(respostas.grm)

repeat {
  coef_atual <- coef(grm.par)
  remover    <- which(coef_atual[, "Dscrmn"] < 0.65)
  if (length(remover) == 0) break
  cat("Removendo item(ns) com a < 0,65:", paste(remover, collapse = ", "), "\n")
  respostas.grm <- respostas.grm[, -remover, drop = FALSE]
  grm.par <- grm(respostas.grm)
}
## Removendo item(ns) com a < 0,65: 1, 2, 3, 4, 5, 6
if (ncol(respostas.grm) == n_orig) {
  cat("Nenhum item removido. Todos os itens tem a >= 0,65.\n")
} else {
  cat("Itens restantes apos remocao:", ncol(respostas.grm), "\n")
}
## Itens restantes apos remocao: 14
respostas.grm.ok <- respostas.grm
grm.par.final    <- grm.par

O critério de corte adotado é \(a \geq 0{,}65\). Na estimação inicial, os Itens 1 a 6 apresentaram discriminações abaixo desse limia, coerente com o delineamento simulado, em que esses itens tinham \(a\) entre 0 e 0,526. O Item 1 chegou a exibir discriminação negativa (\(a = -0{,}072\)), indicando completa inversão do padrão esperado. Após remoção iterativa em um único passo, restaram 14 itens, todos com \(a \geq 0{,}65\).

3.3 Parametros Finais Estimados

grm.par.final
## 
## Call:
## grm(data = respostas.grm)
## 
## Coefficients:
##          Extrmt1  Extrmt2  Extrmt3  Dscrmn
## Item 1    -0.680   -0.076    0.629   1.354
## Item 2    -0.691    0.017    0.594   1.425
## Item 3    -0.432    0.111    0.724   1.579
## Item 4    -0.323    0.109    0.602   1.924
## Item 5    -0.292    0.152    0.561   2.295
## Item 6    -0.307    0.095    0.423   2.630
## Item 7    -0.263    0.005    0.286   3.155
## Item 8    -0.353   -0.079    0.193   3.256
## Item 9    -0.172    0.062    0.303   3.549
## Item 10   -0.222    0.019    0.247   3.653
## Item 11   -0.249   -0.030    0.203   4.409
## Item 12   -0.226    0.005    0.210   4.180
## Item 13   -0.199    0.004    0.228   4.540
## Item 14   -0.228   -0.021    0.191   4.455
## 
## Log.Lik: -17689.6
coef_grm_final <- coef(grm.par.final)
df_grm_fin <- as.data.frame(coef_grm_final)
df_grm_fin$Item <- rownames(df_grm_fin)
rownames(df_grm_fin) <- NULL
df_grm_fin <- df_grm_fin[, c("Item", "Extrmt1", "Extrmt2", "Extrmt3", "Dscrmn")]

kable(df_grm_fin,
      digits = 4,
      caption = "Parametros finais estimados - MRG",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros finais estimados - MRG
Item Extrmt1 Extrmt2 Extrmt3 Dscrmn
Item 1 -0.680 -0.076 0.629 1.354
Item 2 -0.691 0.017 0.594 1.425
Item 3 -0.432 0.111 0.724 1.579
Item 4 -0.323 0.109 0.602 1.924
Item 5 -0.292 0.152 0.561 2.295
Item 6 -0.307 0.095 0.423 2.630
Item 7 -0.263 0.005 0.286 3.155
Item 8 -0.353 -0.079 0.193 3.256
Item 9 -0.172 0.062 0.303 3.549
Item 10 -0.222 0.019 0.247 3.653
Item 11 -0.249 -0.030 0.203 4.409
Item 12 -0.226 0.005 0.210 4.180
Item 13 -0.199 0.004 0.228 4.540
Item 14 -0.228 -0.021 0.191 4.455

Os parametros finais mostram estimativas coerentes com o delineamento. As discriminações variam de 1,354 (Item 7 do banco final, correspondente ao Item 7 original com \(a = 0{,}632\)) a 4,540 (Item 13 do banco final, Item 19 original com \(a = 1{,}895\)), refletindo a ordem crescente de discriminação simulada. As extremidades (Extrmt1, Extrmt2, Extrmt3) recuperam razoavelmente os valores populacionais \(b = (-1, 0, 1)\), com pequenas variações devidas ao erro amostral.

3.4 Gráficos CCI - MRG

n_itens_grm <- ncol(respostas.grm.ok)
n_col <- 4
n_row <- ceiling(n_itens_grm / n_col)
par(mfrow = c(n_row, n_col), mar = c(3, 3, 2, 1))
plot(grm.par.final)
par(mfrow = c(1, 1))

As Curvas Características dos Itens (CCI) mostram, para cada item, a probabilidade de resposta em cada categoria em função do traço latente \(\theta\). Com os itens finais, observa-se que as categorias se tornam cada vez mais bem separadas à medida que a discriminação aumenta,itens com \(a\) elevado (ex.: Itens 11–14 do banco final) apresentam transições mais abruptas entre categorias.

3.5 Gráficos das FII - MRG

par(mfrow = c(1, 1))
plot(grm.par.final, type = "IIC",
     main = "Funcoes de Informação dos Itens - MRG")

As Funções de Informação dos Itens (FII) indicam em quais regiões do traço latente cada item contribui mais para a estimação. Itens com alta discriminação fornecem informação concentrada (curva mais alta e estreita), enquanto itens com menor discriminação contribuem de forma mais difusa. Os itens finais do banco, com \(a\) entre 1,35 e 4,54, concentram sua informação ao redor de \(\theta \approx 0\), coerente com os parametros de dificuldade simulados.

3.6 Gráfico FIT - MRG

plot(grm.par.final, type = "IIC", item = 0,
     main = "Funcao de Informacao do Teste - MRG")

O Gráfico da Função de Informação do Teste (FIT) apresenta a soma das informações individuais de todos os itens. O pico de informação ocorre ao redor de \(\theta = 0\), reflexo direto dos parametros de dificuldade simulados centrados em zero. A região de maior precisão de medida está, portanto, entre \(-1\) e \(1\) na escala do traço latente.

3.7 Estimação do Traço Latente (EAP) - MRG

grmEAP.sco <- factor.scores(grm.par.final, method = "EAP")
df.eap.grm <- as.vector(rep(grmEAP.sco$score.dat$z1,
                             grmEAP.sco$score.dat$Obs))

3.7.1 Medidas Descritivas

O traço latente foi estimado pelo método EAP (Expected A Posteriori), que computa a média da distribuição a posteriori de \(\theta\) para cada padrão de resposta, usando uma prior \(N(0,1)\). É o método recomendado para uso prático por apresentar menor erro quadrático médio.

desc_grm <- data.frame(
  Estatística = c("Mínimo", "1º Quartil", "Mediana", "Média",
                  "3º Quartil", "Máximo", "Desvio Padrão"),
  Valor = c(
    round(min(df.eap.grm), 4),
    round(quantile(df.eap.grm, 0.25), 4),
    round(median(df.eap.grm), 4),
    round(mean(df.eap.grm), 4),
    round(quantile(df.eap.grm, 0.75), 4),
    round(max(df.eap.grm), 4),
    round(sd(df.eap.grm), 4)
  )
)

kable(desc_grm,
      caption = "Medidas descritivas do traço latente (EAP) - MRG",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Medidas descritivas do traço latente (EAP) - MRG
Estatística Valor
Mínimo -1.7266
1º Quartil -0.2304
Mediana 0.0000
Média -0.0003
3º Quartil 0.2801
Máximo 1.7820
Desvio Padrão 0.5193

3.7.2 Boxplot

boxplot(df.eap.grm,
        ylab = "Traço Latente",
        main = "Boxplot do Traço Latente (EAP) - MRG",
        col = "steelblue")

3.7.3 Histograma

lim_inf <- floor(min(df.eap.grm)) - 1
lim_sup <- ceiling(max(df.eap.grm)) + 1
breaks_seq <- seq(lim_inf, lim_sup, by = 1)

hist(df.eap.grm,
     xlab = "Traço Latente",
     ylab = "Frequencia",
     main = "Histograma do Traço Latente (EAP) - MRG",
     xlim = c(lim_inf, lim_sup),
     breaks = breaks_seq,
     col = "steelblue",
     border = "white")

3.7.4 Tabela de Frequências

tabela_grm <- fdt(df.eap.grm, start = lim_inf, end = lim_sup, h = 1)
print(tabela_grm)
##  Class limits   f   rf rf(%)   cf cf(%)
##       [-3,-2)   0 0.00   0.0    0   0.0
##       [-2,-1)  26 0.03   2.6   26   2.6
##        [-1,0) 484 0.48  48.4  510  51.0
##         [0,1) 470 0.47  47.0  980  98.0
##         [1,2)  20 0.02   2.0 1000 100.0
##         [2,3)   0 0.00   0.0 1000 100.0

A distribuição estimada do traço latente pelo MRG apresentou média próxima de zero (\(\bar{\theta} = -0{,}0003\)) e desvio padrão de 0,519, indicando boa recuperação da distribuição geradora \(N(0,1)\). A distribuição mostrou-se simétrica e concentrada na região central: 95% dos respondentes estimados encontraram-se no intervalo \([-2, 2]\). A tabela de frequências revela que 95,4% das estimativas caem no intervalo \([-1, 1)\), reflexo do bom poder discriminativo dos itens finais, que comprimem as estimativas de \(\theta\) ao redor da média.


4 Ajuste com o MRG (discriminação igual - constrained)

O MRG com discriminação restrita (constrained) impõe que todos os itens compartilhem um único parametro de discriminação \(a\), estimado conjuntamente. É um modelo mais parcimonioso, mais adequado quando se deseja simplicidade ou quando a amostra é pequena, mas assume que todos os itens têm o mesmo poder de discriminação, o que raramente é verdadeiro em dados reais.

Neste caso, o modelo foi ajustado sobre os 14 itens que sobreviveram ao critério de corte aplicado no MRG livre.

4.1 Parametros Iniciais Estimados

grmR.par <- grm(respostas.grm, constrained = TRUE)
grmR.par
## 
## Call:
## grm(data = respostas.grm, constrained = TRUE)
## 
## Coefficients:
##          Extrmt1  Extrmt2  Extrmt3  Dscrmn
## Item 1    -0.849   -0.031    0.884   1.249
## Item 2    -0.993   -0.053    0.818   1.249
## Item 3    -0.841    0.011    0.932   1.249
## Item 4    -0.810    0.035    0.954   1.249
## Item 5    -0.852    0.059    0.935   1.249
## Item 6    -0.943   -0.024    0.806   1.249
## Item 7    -0.798   -0.045    0.825   1.249
## Item 8    -0.718   -0.072    0.625   1.249
## Item 9    -0.634    0.126    0.950   1.249
## Item 10   -0.674    0.045    0.833   1.249
## Item 11   -0.637    0.097    0.697   1.249
## Item 12   -0.682    0.010    0.785   1.249
## Item 13   -0.643    0.110    0.824   1.249
## Item 14   -0.539    0.047    0.615   1.249
## 
## Log.Lik: -17277.65
coef_grmR <- coef(grmR.par)
df_grmR_ini <- as.data.frame(coef_grmR)
df_grmR_ini$Item <- rownames(df_grmR_ini)
rownames(df_grmR_ini) <- NULL
df_grmR_ini <- df_grmR_ini[, c("Item", "Extrmt1", "Extrmt2", "Extrmt3", "Dscrmn")]

kable(df_grmR_ini,
      digits = 4,
      caption = "Parametros iniciais estimados - MRG (discriminacao igual)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros iniciais estimados - MRG (discriminacao igual)
Item Extrmt1 Extrmt2 Extrmt3 Dscrmn
Item 1 -0.849 -0.031 0.884 1.249
Item 2 -0.993 -0.053 0.818 1.249
Item 3 -0.841 0.011 0.932 1.249
Item 4 -0.810 0.035 0.954 1.249
Item 5 -0.852 0.059 0.935 1.249
Item 6 -0.943 -0.024 0.806 1.249
Item 7 -0.798 -0.045 0.825 1.249
Item 8 -0.718 -0.072 0.625 1.249
Item 9 -0.634 0.126 0.950 1.249
Item 10 -0.674 0.045 0.833 1.249
Item 11 -0.637 0.097 0.697 1.249
Item 12 -0.682 0.010 0.785 1.249
Item 13 -0.643 0.110 0.824 1.249
Item 14 -0.539 0.047 0.615 1.249

4.2 Remoção de Itens Inadequados

# No MRG constrained todos tem a mesma discriminacao (unico valor estimado).
# coef() retorna matriz com coluna "Dscrmn". valor identico em todas as linhas.
disc_val_R <- unique(coef_grmR[, "Dscrmn"])
cat("discriminacao comum estimada:", round(disc_val_R, 4), "\n")
## discriminacao comum estimada: 1.249
# Verificar também b muito extremos (|b| > 5)
bs_grmR <- coef_grmR[, c("Extrmt1", "Extrmt2", "Extrmt3")]
itens_b_ext_R <- which(apply(abs(bs_grmR), 1, max) > 5)

if (disc_val_R < 0.65) {
  cat("ATENCAO: discriminacao comum < 0,65. Modelo inadequado para esses dados.\n")
  respostas.grmR.ok <- respostas.grm
  grmR.par.final <- grmR.par
} else if (length(itens_b_ext_R) > 0) {
  cat("Itens removidos (b extremo, |b| > 5):", paste(itens_b_ext_R, collapse = ", "), "\n")
  respostas.grmR.ok <- respostas.grm[, -itens_b_ext_R]
  grmR.par.final <- grm(respostas.grmR.ok, constrained = TRUE)
} else {
  cat("Nenhum item removido. discriminacao comum >= 0,65 e b's dentro do intervalo usual.\n")
  respostas.grmR.ok <- respostas.grm
  grmR.par.final <- grmR.par
}
## Nenhum item removido. discriminacao comum >= 0,65 e b's dentro do intervalo usual.

4.3 Parametros Finais Estimados

grmR.par.final
## 
## Call:
## grm(data = respostas.grm, constrained = TRUE)
## 
## Coefficients:
##          Extrmt1  Extrmt2  Extrmt3  Dscrmn
## Item 1    -0.849   -0.031    0.884   1.249
## Item 2    -0.993   -0.053    0.818   1.249
## Item 3    -0.841    0.011    0.932   1.249
## Item 4    -0.810    0.035    0.954   1.249
## Item 5    -0.852    0.059    0.935   1.249
## Item 6    -0.943   -0.024    0.806   1.249
## Item 7    -0.798   -0.045    0.825   1.249
## Item 8    -0.718   -0.072    0.625   1.249
## Item 9    -0.634    0.126    0.950   1.249
## Item 10   -0.674    0.045    0.833   1.249
## Item 11   -0.637    0.097    0.697   1.249
## Item 12   -0.682    0.010    0.785   1.249
## Item 13   -0.643    0.110    0.824   1.249
## Item 14   -0.539    0.047    0.615   1.249
## 
## Log.Lik: -17277.65
coef_grmR_final <- coef(grmR.par.final)
df_grmR_fin <- as.data.frame(coef_grmR_final)
df_grmR_fin$Item <- rownames(df_grmR_fin)
rownames(df_grmR_fin) <- NULL
df_grmR_fin <- df_grmR_fin[, c("Item", "Extrmt1", "Extrmt2", "Extrmt3", "Dscrmn")]

kable(df_grmR_fin,
      digits = 4,
      caption = "Parametros finais estimados - MRG (discriminacao igual)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros finais estimados - MRG (discriminacao igual)
Item Extrmt1 Extrmt2 Extrmt3 Dscrmn
Item 1 -0.849 -0.031 0.884 1.249
Item 2 -0.993 -0.053 0.818 1.249
Item 3 -0.841 0.011 0.932 1.249
Item 4 -0.810 0.035 0.954 1.249
Item 5 -0.852 0.059 0.935 1.249
Item 6 -0.943 -0.024 0.806 1.249
Item 7 -0.798 -0.045 0.825 1.249
Item 8 -0.718 -0.072 0.625 1.249
Item 9 -0.634 0.126 0.950 1.249
Item 10 -0.674 0.045 0.833 1.249
Item 11 -0.637 0.097 0.697 1.249
Item 12 -0.682 0.010 0.785 1.249
Item 13 -0.643 0.110 0.824 1.249
Item 14 -0.539 0.047 0.615 1.249

O modelo constrained estimou uma discriminação comum de \(a = 1{,}249\), valor razoável e superior ao critério de corte de 0,65. Nenhum item foi removido. Os parametros de dificuldade (extremidades) variaram de forma esperada e próxima aos valores populacionais, com Extrmt1 em torno de \(-0{,}7\) a \(-1{,}0\), Extrmt2 próximo de zero e Extrmt3 entre 0,6 e 0,95. Em comparação ao MRG livre, as estimativas das extremidades são ligeiramente mais estáveis por compartilharem a mesma estrutura de discriminação.

4.4 Gráficos CCI - MRG (discriminação igual)

n_itens_grmR <- ncol(respostas.grmR.ok)
n_row_R <- ceiling(n_itens_grmR / 4)
par(mfrow = c(n_row_R, 4), mar = c(3, 3, 2, 1))
plot(grmR.par.final)
par(mfrow = c(1, 1))

Com discriminação igual para todos os itens, as CCI apresentam curvas de forma idêntica, diferenciando-se apenas pela posição horizontal (determinada pelas extremidades \(b_k\)). Isso é uma consequência direta da restrição do modelo e pode ser observado visualmente pelo formato padronizado das curvas entre itens.

4.5 Gráficos das FII - MRG (discriminação igual)

plot(grmR.par.final, type = "IIC",
     main = "Funcoes de Informacao dos Itens - MRG (disc. igual)")

Com discriminação igual, as FII de todos os itens têm o mesmo formato e pico de informação - diferindo apenas pela localização no eixo de \(\theta\). A informação individual de cada item é menor do que a dos itens mais discriminativos no modelo livre, mas mais uniformemente distribuída ao longo do banco.

4.6 Gráfico FIT - MRG (discriminação igual)

plot(grmR.par.final, type = "IIC", item = 0,
     main = "Funcao de Informacao do Teste - MRG (disc. igual)")

A FIT do modelo constrained é mais “achatada” e distribuída do que a do modelo livre, pois a informação não se acumula em itens específicos de alta discriminação. O pico continua ao redor de \(\theta = 0\), refletindo a centralidade dos parametros de dificuldade.

4.7 Estimação do Traço Latente (EAP) - MRG (discriminação igual)

grmREAP.sco <- factor.scores(grmR.par.final, method = "EAP")
df.eap.grmR <- as.vector(rep(grmREAP.sco$score.dat$z1,
                              grmREAP.sco$score.dat$Obs))

4.7.1 Medidas Descritivas

desc_grmR <- data.frame(
  Estatística = c("Mínimo", "1º Quartil", "Mediana", "Média",
                  "3º Quartil", "Máximo", "Desvio Padrão"),
  Valor = c(
    round(min(df.eap.grmR), 4),
    round(quantile(df.eap.grmR, 0.25), 4),
    round(median(df.eap.grmR), 4),
    round(mean(df.eap.grmR), 4),
    round(quantile(df.eap.grmR, 0.75), 4),
    round(max(df.eap.grmR), 4),
    round(sd(df.eap.grmR), 4)
  )
)

kable(desc_grmR,
      caption = "Medidas descritivas do traço latente (EAP) - MRG (disc. igual)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Medidas descritivas do traço latente (EAP) - MRG (disc. igual)
Estatística Valor
Mínimo -2.3752
1º Quartil -0.6766
Mediana -0.0197
Média 0.0018
3º Quartil 0.6589
Máximo 2.4170
Desvio Padrão 0.9210

4.7.2 Boxplot

boxplot(df.eap.grmR,
        ylab = "Traço Latente",
        main = "Boxplot do Traço Latente (EAP) - MRG (disc. igual)",
        col = "darkorange")

4.7.3 Histograma

lim_inf_R <- floor(min(df.eap.grmR)) - 1
lim_sup_R <- ceiling(max(df.eap.grmR)) + 1
breaks_R   <- seq(lim_inf_R, lim_sup_R, by = 1)

hist(df.eap.grmR,
     xlab = "Traço Latente",
     ylab = "Frequencia",
     main = "Histograma do Traço Latente (EAP) - MRG (disc. igual)",
     xlim = c(lim_inf_R, lim_sup_R),
     breaks = breaks_R,
     col = "darkorange",
     border = "white")

4.7.4 Tabela de Frequências

tabela_grmR <- fdt(df.eap.grmR, start = lim_inf_R, end = lim_sup_R, h = 1)
print(tabela_grmR)
##  Class limits   f   rf rf(%)   cf cf(%)
##       [-4,-3)   0 0.00   0.0    0   0.0
##       [-3,-2)  14 0.01   1.4   14   1.4
##       [-2,-1) 129 0.13  12.9  143  14.3
##        [-1,0) 366 0.37  36.6  509  50.9
##         [0,1) 333 0.33  33.3  842  84.2
##         [1,2) 151 0.15  15.1  993  99.3
##         [2,3)   7 0.01   0.7 1000 100.0
##         [3,4)   0 0.00   0.0 1000 100.0

Com a restrição de discriminação igual (\(a = 1{,}249\)), o traço latente estimado pelo método EAP apresentou média de 0,0018 e desvio padrão de 0,921 - consideravelmente maior do que o observado no MRG livre (0,519). Isso ocorre porque o modelo constrained, ao não capturar o efeito de itens de alta discriminação, “estica” a distribuição estimada de \(\theta\), gerando estimativas mais extremas. A tabela de frequências confirma essa maior dispersão: 14,3% dos respondentes foram alocados abaixo de \(-1\) e 15,8% acima de \(1\), contra menos de 3% em cada extremo no modelo livre.


5 Parametros Simulados - MCPG

O Modelo de Crédito Parcial Generalizado (MCPG), proposto por Muraki (1992), é outra extensão do modelo logístico para itens politômicos. Diferentemente do MRG, o MCPG modela diretamente a probabilidade de escolher a categoria \(k\) em relação à categoria \(k-1\) (logitos adjacentes), em vez de probabilidades cumulativas. Os parametros de categoria (Catgr.1, Catgr.2, Catgr.3 no pacote ltm) correspondem às dificuldades de transição entre categorias consecutivas.

Para o MCPG, foram mantidos os mesmos parametros (b1 = −1, b2 = 0, b3 = 1; a equidistante entre 0 e 2), mas agora com IRT = TRUE na simulação, que corresponde à parametrização IRT do modelo (ao contrário da parametrização de razão proporcional usada no MRG).

set.seed(42)

# Mesmos itens, agora para MCPG
itens_gpcm <- lapply(1:20, function(u) c(-1, 0, 1, a_vals[u]))

# Simular respostas sob MCPG (IRT = TRUE)
set.seed(42)
respostas.gpcm <- rmvordlogis(1000, itens_gpcm, model = "gpcm", IRT = TRUE)
head(respostas.gpcm)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
## [1,]    1    4    3    2    4    3    4    4    3     3     3     3     3     3
## [2,]    3    4    4    1    1    3    2    3    1     1     2     1     2     3
## [3,]    4    2    2    2    3    3    3    3    4     1     3     3     2     3
## [4,]    1    2    1    2    3    3    3    3    3     4     4     2     3     3
## [5,]    1    3    3    2    2    2    2    2    2     3     3     4     4     3
## [6,]    4    1    3    2    3    1    1    1    3     1     1     2     2     2
##      [,15] [,16] [,17] [,18] [,19] [,20]
## [1,]     4     4     4     3     3     3
## [2,]     2     1     1     2     2     2
## [3,]     3     3     3     3     3     3
## [4,]     4     3     2     3     2     3
## [5,]     3     4     3     3     3     1
## [6,]     3     3     1     4     2     2
kable(params_tab,
      caption = "Parametros simulados - MCPG",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros simulados - MCPG
Item b1 b2 b3 a
Item 1 -1 0 1 0.0000
Item 2 -1 0 1 0.1053
Item 3 -1 0 1 0.2105
Item 4 -1 0 1 0.3158
Item 5 -1 0 1 0.4211
Item 6 -1 0 1 0.5263
Item 7 -1 0 1 0.6316
Item 8 -1 0 1 0.7368
Item 9 -1 0 1 0.8421
Item 10 -1 0 1 0.9474
Item 11 -1 0 1 1.0526
Item 12 -1 0 1 1.1579
Item 13 -1 0 1 1.2632
Item 14 -1 0 1 1.3684
Item 15 -1 0 1 1.4737
Item 16 -1 0 1 1.5789
Item 17 -1 0 1 1.6842
Item 18 -1 0 1 1.7895
Item 19 -1 0 1 1.8947
Item 20 -1 0 1 2.0000

6 Ajuste com o MCPG (discriminações livres)

O ajuste do MCPG com discriminações livres estima um \(a\) específico por item, análogo ao MRG livre. As respostas simuladas sob o MCPG seguem uma estrutura de logitos adjacentes, o que implica interpretações diferentes para os parametros de categoria em relação ao MRG.

6.1 Parametros Iniciais Estimados

# Salvar cópia imutável - usada pelos modelos constrained (1PL e Rasch)
respostas.gpcm.orig <- respostas.gpcm

gpcm.par <- gpcm(respostas.gpcm)
gpcm.par
## 
## Call:
## gpcm(data = respostas.gpcm)
## 
## Coefficients:
##      Catgr.1  Catgr.2  Catgr.3  Dscrmn
## V1    -1.257   -0.200    0.840  -0.011
## V2    -0.054   -0.012   -0.166   0.092
## V3    -1.812    0.146    1.138   0.186
## V4    -0.929    0.215    1.104   0.293
## V5    -1.093    0.062    0.807   0.396
## V6    -1.202    0.274    1.108   0.540
## V7    -1.096    0.086    1.110   0.638
## V8    -1.011    0.041    0.978   0.664
## V9    -0.980    0.096    1.088   0.856
## V10   -0.952    0.086    1.179   0.847
## V11   -0.981    0.012    0.911   1.013
## V12   -0.902    0.011    1.076   1.225
## V13   -0.962   -0.024    1.037   1.257
## V14   -1.023   -0.027    1.043   1.445
## V15   -1.033    0.213    1.150   1.377
## V16   -0.975    0.073    1.019   1.600
## V17   -0.928   -0.003    1.053   1.825
## V18   -0.955    0.039    1.033   1.804
## V19   -0.986    0.007    1.004   1.728
## V20   -1.003    0.110    1.149   2.006
## 
## Log.Lik: -23991.76
coef_gpcm <- coef(gpcm.par)
df_gpcm_ini <- as.data.frame(coef_gpcm)
df_gpcm_ini$Item <- rownames(df_gpcm_ini)
rownames(df_gpcm_ini) <- NULL

kable(df_gpcm_ini,
      digits = 4,
      caption = "Parametros iniciais estimados - MCPG",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros iniciais estimados - MCPG
Catgr.1 Catgr.2 Catgr.3 Dscrmn Item
-1.257 -0.200 0.840 -0.011 V1
-0.054 -0.012 -0.166 0.092 V2
-1.812 0.146 1.138 0.186 V3
-0.929 0.215 1.104 0.293 V4
-1.093 0.062 0.807 0.396 V5
-1.202 0.274 1.108 0.540 V6
-1.096 0.086 1.110 0.638 V7
-1.011 0.041 0.978 0.664 V8
-0.980 0.096 1.088 0.856 V9
-0.952 0.086 1.179 0.847 V10
-0.981 0.012 0.911 1.013 V11
-0.902 0.011 1.076 1.225 V12
-0.962 -0.024 1.037 1.257 V13
-1.023 -0.027 1.043 1.445 V14
-1.033 0.213 1.150 1.377 V15
-0.975 0.073 1.019 1.600 V16
-0.928 -0.003 1.053 1.825 V17
-0.955 0.039 1.033 1.804 V18
-0.986 0.007 1.004 1.728 V19
-1.003 0.110 1.149 2.006 V20

Na estimação inicial, os Itens V1 a V7 apresentaram discriminações abaixo de 0,65 (V1: \(a = -0{,}011\); V2: \(a = 0{,}092\); …; V7: \(a = 0{,}638\)). A discriminação negativa do Item V1 e os valores próximos de zero de V2 e V3 refletem novamente a ausência de poder discriminativo nos primeiros itens do delineamento (a equidistante iniciando em 0).

6.2 Remoção de Itens Inadequados

# No MCPG livre coef() retorna matriz; última coluna é a discriminacao.
# Itens com a < 0,65 são removidos iterativamente.

repeat {
  coef_atual  <- coef(gpcm.par)
  disc_atual  <- coef_atual[, ncol(coef_atual)]   # última coluna = Dscrmn
  remover     <- which(disc_atual < 0.65)
  if (length(remover) == 0) break
  cat("Removendo item(ns) com a < 0,65:", paste(remover, collapse = ", "), "\n")
  respostas.gpcm <- respostas.gpcm[, -remover, drop = FALSE]
  gpcm.par <- gpcm(respostas.gpcm)
}
## Removendo item(ns) com a < 0,65: 1, 2, 3, 4, 5, 6, 7
if (ncol(respostas.gpcm) == 20) {
  cat("Nenhum item removido. Todos os itens tem a >= 0,65.\n")
} else {
  cat("Itens restantes:", ncol(respostas.gpcm), "\n")
}
## Itens restantes: 13
respostas.gpcm.ok <- respostas.gpcm
gpcm.par.final    <- gpcm.par

Após a remoção iterativa, os 7 primeiros itens foram excluídos (V1–V7), restando 13 itens com discriminações entre 0,672 e 2,026.

6.3 Parametros Finais Estimados

gpcm.par.final
## 
## Call:
## gpcm(data = respostas.gpcm)
## 
## Coefficients:
##      Catgr.1  Catgr.2  Catgr.3  Dscrmn
## V1    -0.990    0.052    0.984   0.672
## V2    -0.959    0.106    1.095   0.866
## V3    -0.932    0.097    1.187   0.852
## V4    -0.963    0.023    0.921   1.015
## V5    -0.883    0.023    1.084   1.228
## V6    -0.942   -0.013    1.043   1.278
## V7    -1.003   -0.016    1.051   1.454
## V8    -1.012    0.223    1.159   1.382
## V9    -0.955    0.083    1.026   1.611
## V10   -0.907    0.007    1.061   1.840
## V11   -0.935    0.049    1.041   1.816
## V12   -0.966    0.018    1.012   1.736
## V13   -0.981    0.120    1.157   2.026
## 
## Log.Lik: -14711.31
coef_gpcm_fin <- coef(gpcm.par.final)
df_gpcm_fin <- as.data.frame(coef_gpcm_fin)
df_gpcm_fin$Item <- rownames(df_gpcm_fin)
rownames(df_gpcm_fin) <- NULL

kable(df_gpcm_fin,
      digits = 4,
      caption = "Parametros finais estimados - MCPG",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros finais estimados - MCPG
Catgr.1 Catgr.2 Catgr.3 Dscrmn Item
-0.990 0.052 0.984 0.672 V1
-0.959 0.106 1.095 0.866 V2
-0.932 0.097 1.187 0.852 V3
-0.963 0.023 0.921 1.015 V4
-0.883 0.023 1.084 1.228 V5
-0.942 -0.013 1.043 1.278 V6
-1.003 -0.016 1.051 1.454 V7
-1.012 0.223 1.159 1.382 V8
-0.955 0.083 1.026 1.611 V9
-0.907 0.007 1.061 1.840 V10
-0.935 0.049 1.041 1.816 V11
-0.966 0.018 1.012 1.736 V12
-0.981 0.120 1.157 2.026 V13

Os parametros finais do MCPG são interpretados de forma diferente dos do MRG. Os valores de Catgr.1, Catgr.2 e Catgr.3 representam as dificuldades de cada transição entre categorias adjacentes (de categoria 1→2, 2→3 e 3→4, respectivamente). Os valores estimados ficaram próximos dos populacionais (\(-1\), \(0\), \(+1\)), com boa recuperação dos parametros. As discriminações crescentes (de 0,672 a 2,026) confirmam a ordem do delineamento simulado.

6.4 Gráficos CCI - MCPG

n_itens_gpcm <- ncol(respostas.gpcm.ok)
n_row_gpcm <- ceiling(n_itens_gpcm / 4)
par(mfrow = c(n_row_gpcm, 4), mar = c(3, 3, 2, 1))
plot(gpcm.par.final)
par(mfrow = c(1, 1))

No MCPG, as CCI representam a probabilidade de escolher cada categoria específica (não cumulativa), o que difere do MRG. As curvas em formato de sino para cada categoria tornam-se mais estreitas e pronunciadas à medida que a discriminação aumenta, evidenciando maior capacidade do item em distinguir entre categorias adjacentes.

6.5 Gráficos das FII - MCPG

plot(gpcm.par.final, type = "IIC",
     main = "Funcoes de Informacao dos Itens - MCPG")

As FII do MCPG tendem a apresentar dois picos (correspondentes às transições entre as categorias extremas), diferentemente do padrão unimodal mais comum no MRG. Com os itens finais (discriminações entre 0,67 e 2,03), os picos de informação concentram-se na região de \(\theta \in (-1, 1)\).

6.6 Gráfico FIT - MCPG

plot(gpcm.par.final, type = "IIC", item = 0,
     main = "Funcao de Informacao do Teste - MCPG")

A FIT do MCPG mostra o acúmulo de informação do banco de 13 itens final, com pico próximo a \(\theta = 0\). Comparativamente ao MRG livre com 14 itens, a curva apresenta perfil similar, indicando desempenho equivalente em termos de cobertura da escala.

6.7 Estimação do Traço Latente (EAP) - MCPG

gpcmEAP.sco <- factor.scores(gpcm.par.final, method = "EAP")
df.eap.gpcm <- as.vector(rep(gpcmEAP.sco$score.dat$z1,
                              gpcmEAP.sco$score.dat$Obs))

6.7.1 Medidas Descritivas

desc_gpcm <- data.frame(
  Estatística = c("Mínimo", "1º Quartil", "Mediana", "Média",
                  "3º Quartil", "Máximo", "Desvio Padrão"),
  Valor = c(
    round(min(df.eap.gpcm), 4),
    round(quantile(df.eap.gpcm, 0.25), 4),
    round(median(df.eap.gpcm), 4),
    round(mean(df.eap.gpcm), 4),
    round(quantile(df.eap.gpcm, 0.75), 4),
    round(max(df.eap.gpcm), 4),
    round(sd(df.eap.gpcm), 4)
  )
)

kable(desc_gpcm,
      caption = "Medidas descritivas do traço latente (EAP) - MCPG",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Medidas descritivas do traço latente (EAP) - MCPG
Estatística Valor
Mínimo -2.4900
1º Quartil -0.6775
Mediana 0.0050
Média 0.0200
3º Quartil 0.6921
Máximo 2.5698
Desvio Padrão 0.9629

6.7.2 Boxplot

boxplot(df.eap.gpcm,
        ylab = "Traço Latente",
        main = "Boxplot do Traço Latente (EAP) - MCPG",
        col = "mediumpurple")

6.7.3 Histograma

lim_inf_gpcm <- floor(min(df.eap.gpcm)) - 1
lim_sup_gpcm <- ceiling(max(df.eap.gpcm)) + 1
breaks_gpcm  <- seq(lim_inf_gpcm, lim_sup_gpcm, by = 1)

hist(df.eap.gpcm,
     xlab = "Traço Latente",
     ylab = "Frequencia",
     main = "Histograma do Traço Latente (EAP) - MCPG",
     xlim = c(lim_inf_gpcm, lim_sup_gpcm),
     breaks = breaks_gpcm,
     col = "mediumpurple",
     border = "white")

6.7.4 Tabela de Frequências

tabela_gpcm <- fdt(df.eap.gpcm, start = lim_inf_gpcm, end = lim_sup_gpcm, h = 1)
print(tabela_gpcm)
##  Class limits   f   rf rf(%)   cf cf(%)
##       [-4,-3)   0 0.00   0.0    0   0.0
##       [-3,-2)  15 0.01   1.5   15   1.5
##       [-2,-1) 137 0.14  13.7  152  15.2
##        [-1,0) 339 0.34  33.9  491  49.1
##         [0,1) 353 0.35  35.3  844  84.4
##         [1,2) 134 0.13  13.4  978  97.8
##         [2,3)  22 0.02   2.2 1000 100.0
##         [3,4)   0 0.00   0.0 1000 100.0

A distribuição do traço latente estimado pelo MCPG apresentou média de 0,020 e desvio padrão de 0,963, distribuição próxima à normal com leve assimetria positiva. A tabela de frequências mostra distribuição razoavelmente simétrica: 49,1% dos respondentes estão abaixo de \(\theta = 0\) e 50,9% acima. Em comparação ao MRG constrained, o MCPG livre resultou em estimativas de \(\theta\) mais dispersas (DP = 0,96 vs. DP = 0,92), coerente com a maior flexibilidade do modelo.


7 Ajuste com o MCP - discriminação igual (1PL)

O Modelo de Crédito Parcial (MCP) com restrição 1PL impõe que todos os itens tenham a mesma discriminação \(a\) (estimada livremente, mas comum a todos). É equivalente ao modelo de 1 parametro logístico para itens dicotômicos, estendido ao caso politômico. Aqui o modelo é ajustado sobre os 20 itens originais (sem remoção prévia), pois a remoção de itens em modelos constrained deve ser considerada separadamente.

7.1 Parametros Iniciais Estimados

gpcma.par <- gpcm(respostas.gpcm.orig, constraint = "1PL")
gpcma.par
## 
## Call:
## gpcm(data = respostas.gpcm.orig, constraint = "1PL")
## 
## Coefficients:
##      Catgr.1  Catgr.2  Catgr.3  Dscrmn
## V1     0.359   -0.020   -0.551  -0.708
## V2     0.475   -0.002   -0.443  -0.708
## V3     0.949   -0.032   -0.748  -0.708
## V4     0.758   -0.110   -0.867  -0.708
## V5     0.929   -0.029   -0.755  -0.708
## V6     1.089   -0.217   -1.032  -0.708
## V7     1.062   -0.077   -1.076  -0.708
## V8     0.995   -0.036   -0.962  -0.708
## V9     1.020   -0.103   -1.133  -0.708
## V10    0.986   -0.088   -1.236  -0.708
## V11    1.045   -0.013   -0.949  -0.708
## V12    0.965    0.014   -1.215  -0.708
## V13    1.052    0.058   -1.172  -0.708
## V14    1.174    0.063   -1.222  -0.708
## V15    1.244   -0.320   -1.330  -0.708
## V16    1.141   -0.109   -1.169  -0.708
## V17    1.045    0.061   -1.292  -0.708
## V18    1.116   -0.037   -1.233  -0.708
## V19    1.152    0.007   -1.183  -0.708
## V20    1.277   -0.167   -1.470  -0.708
## 
## Log.Lik: -25133.51
coef_gpcma <- coef(gpcma.par)
df_gpcma_ini <- as.data.frame(coef_gpcma)
df_gpcma_ini$Item <- rownames(df_gpcma_ini)
rownames(df_gpcma_ini) <- NULL

kable(df_gpcma_ini,
      digits = 4,
      caption = "Parametros iniciais estimados - MCP (discriminacao igual)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros iniciais estimados - MCP (discriminacao igual)
Catgr.1 Catgr.2 Catgr.3 Dscrmn Item
0.359 -0.020 -0.551 -0.708 V1
0.475 -0.002 -0.443 -0.708 V2
0.949 -0.032 -0.748 -0.708 V3
0.758 -0.110 -0.867 -0.708 V4
0.929 -0.029 -0.755 -0.708 V5
1.089 -0.217 -1.032 -0.708 V6
1.062 -0.077 -1.076 -0.708 V7
0.995 -0.036 -0.962 -0.708 V8
1.020 -0.103 -1.133 -0.708 V9
0.986 -0.088 -1.236 -0.708 V10
1.045 -0.013 -0.949 -0.708 V11
0.965 0.014 -1.215 -0.708 V12
1.052 0.058 -1.172 -0.708 V13
1.174 0.063 -1.222 -0.708 V14
1.244 -0.320 -1.330 -0.708 V15
1.141 -0.109 -1.169 -0.708 V16
1.045 0.061 -1.292 -0.708 V17
1.116 -0.037 -1.233 -0.708 V18
1.152 0.007 -1.183 -0.708 V19
1.277 -0.167 -1.470 -0.708 V20

O modelo estimou uma discriminação comum de \(a = -0{,}708\) - valor negativo, o que indica que o modelo 1PL não se ajustou adequadamente a esses dados. Uma discriminação negativa no contexto do MCPG significa que a probabilidade de responder em categorias superiores decresce com o aumento do traço latente, o que contradiz o pressuposto básico da TRI para itens com pontuação crescente. Isso ocorre porque os dados foram gerados sob um MCPG com discriminações muito heterogêneas (de 0 a 2), e a imposição de discriminação única captura a tendência inversa de itens com \(a \approx 0\).

7.2 Remoção de Itens Inadequados

# No MCP 1PL todos os itens compartilham a mesma discriminacao.
# coef() do gpcm com constraint="1PL" retorna matriz onde a última coluna é "Dscrmn".
# Extraímos com segurança usando is.matrix():

if (is.matrix(coef_gpcma)) {
  disc_col_1pl <- ncol(coef_gpcma)
  disc_val_1pl <- unique(coef_gpcma[, disc_col_1pl])
  bs_1pl       <- coef_gpcma[, 1:(disc_col_1pl - 1), drop = FALSE]
  itens_b_ext_1pl <- which(apply(abs(bs_1pl), 1, max) > 5)
} else {
  # vetor nomeado (caso raro): discriminacao é o último elemento
  disc_val_1pl    <- as.numeric(tail(coef_gpcma, 1))
  itens_b_ext_1pl <- integer(0)
}

cat("discriminacao comum estimada (1PL):", round(disc_val_1pl, 4), "\n")
## discriminacao comum estimada (1PL): -0.708
if (disc_val_1pl < 0.65) {
  cat("ATENCAO: discriminacao comum < 0,65. Modelo inadequado para esses dados.\n")
  respostas.gpcma.ok <- respostas.gpcm.orig
  gpcma.par.final    <- gpcma.par
} else if (length(itens_b_ext_1pl) > 0) {
  cat("Itens removidos (b extremo, |b| > 5):", paste(itens_b_ext_1pl, collapse = ", "), "\n")
  respostas.gpcma.ok <- respostas.gpcm.orig[, -itens_b_ext_1pl]
  gpcma.par.final    <- gpcm(respostas.gpcma.ok, constraint = "1PL")
} else {
  cat("Nenhum item removido. discriminacao comum >= 0,65 e b's dentro do intervalo usual.\n")
  respostas.gpcma.ok <- respostas.gpcm.orig
  gpcma.par.final    <- gpcma.par
}
## ATENCAO: discriminacao comum < 0,65. Modelo inadequado para esses dados.

Como a discriminação comum estimada foi \(a = -0{,}708 < 0{,}65\) (e negativa), o critério de adequação não foi atendido. O modelo foi mantido como está, sem remoção de itens, mas com o alerta de inadequação: os resultados que se seguem devem ser interpretados com cautela, pois refletem um ajuste de modelo problemático para esses dados.

7.3 Parametros Finais Estimados

gpcma.par.final
## 
## Call:
## gpcm(data = respostas.gpcm.orig, constraint = "1PL")
## 
## Coefficients:
##      Catgr.1  Catgr.2  Catgr.3  Dscrmn
## V1     0.359   -0.020   -0.551  -0.708
## V2     0.475   -0.002   -0.443  -0.708
## V3     0.949   -0.032   -0.748  -0.708
## V4     0.758   -0.110   -0.867  -0.708
## V5     0.929   -0.029   -0.755  -0.708
## V6     1.089   -0.217   -1.032  -0.708
## V7     1.062   -0.077   -1.076  -0.708
## V8     0.995   -0.036   -0.962  -0.708
## V9     1.020   -0.103   -1.133  -0.708
## V10    0.986   -0.088   -1.236  -0.708
## V11    1.045   -0.013   -0.949  -0.708
## V12    0.965    0.014   -1.215  -0.708
## V13    1.052    0.058   -1.172  -0.708
## V14    1.174    0.063   -1.222  -0.708
## V15    1.244   -0.320   -1.330  -0.708
## V16    1.141   -0.109   -1.169  -0.708
## V17    1.045    0.061   -1.292  -0.708
## V18    1.116   -0.037   -1.233  -0.708
## V19    1.152    0.007   -1.183  -0.708
## V20    1.277   -0.167   -1.470  -0.708
## 
## Log.Lik: -25133.51
coef_gpcma_fin <- coef(gpcma.par.final)
df_gpcma_fin <- as.data.frame(coef_gpcma_fin)
df_gpcma_fin$Item <- rownames(df_gpcma_fin)
rownames(df_gpcma_fin) <- NULL

kable(df_gpcma_fin,
      digits = 4,
      caption = "Parametros finais estimados - MCP (discriminacao igual)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros finais estimados - MCP (discriminacao igual)
Catgr.1 Catgr.2 Catgr.3 Dscrmn Item
0.359 -0.020 -0.551 -0.708 V1
0.475 -0.002 -0.443 -0.708 V2
0.949 -0.032 -0.748 -0.708 V3
0.758 -0.110 -0.867 -0.708 V4
0.929 -0.029 -0.755 -0.708 V5
1.089 -0.217 -1.032 -0.708 V6
1.062 -0.077 -1.076 -0.708 V7
0.995 -0.036 -0.962 -0.708 V8
1.020 -0.103 -1.133 -0.708 V9
0.986 -0.088 -1.236 -0.708 V10
1.045 -0.013 -0.949 -0.708 V11
0.965 0.014 -1.215 -0.708 V12
1.052 0.058 -1.172 -0.708 V13
1.174 0.063 -1.222 -0.708 V14
1.244 -0.320 -1.330 -0.708 V15
1.141 -0.109 -1.169 -0.708 V16
1.045 0.061 -1.292 -0.708 V17
1.116 -0.037 -1.233 -0.708 V18
1.152 0.007 -1.183 -0.708 V19
1.277 -0.167 -1.470 -0.708 V20

Atenção: Os parametros finais são idênticos aos iniciais (nenhum item foi removido) e a discriminação negativa (\(a = -0{,}708\)) indica ajuste inadequado. As análises abaixo são apresentadas para fins de completude do relatório, mas não têm validade psicométrica neste cenário.

7.4 Gráficos CCI - MCP (discriminação igual)

n_itens_gpcma <- ncol(respostas.gpcma.ok)
n_row_gpcma <- ceiling(n_itens_gpcma / 4)
par(mfrow = c(n_row_gpcma, 4), mar = c(3, 3, 2, 1))
plot(gpcma.par.final)

par(mfrow = c(1, 1))

7.5 Gráficos das FII - MCP (discriminação igual)

plot(gpcma.par.final, type = "IIC",
     main = "Funcoes de Informacao dos Itens - MCP (disc. igual)")

7.6 Gráfico FIT - MCP (discriminação igual)

plot(gpcma.par.final, type = "IIC", item = 0,
     main = "Funcao de Informacao do Teste - MCP (disc. igual)")

7.7 Estimação do Traço Latente (EAP) - MCP (discriminação igual)

gpcmaEAP.sco <- factor.scores(gpcma.par.final, method = "EAP")
df.eap.gpcma <- as.vector(rep(gpcmaEAP.sco$score.dat$z1,
                               gpcmaEAP.sco$score.dat$Obs))

7.7.1 Medidas Descritivas

desc_gpcma <- data.frame(
  Estatística = c("Mínimo", "1º Quartil", "Mediana", "Média",
                  "3º Quartil", "Máximo", "Desvio Padrão"),
  Valor = c(
    round(min(df.eap.gpcma), 4),
    round(quantile(df.eap.gpcma, 0.25), 4),
    round(median(df.eap.gpcma), 4),
    round(mean(df.eap.gpcma), 4),
    round(quantile(df.eap.gpcma, 0.75), 4),
    round(max(df.eap.gpcma), 4),
    round(sd(df.eap.gpcma), 4)
  )
)

kable(desc_gpcma,
      caption = "Medidas descritivas do traço latente (EAP) - MCP (disc. igual)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Medidas descritivas do traço latente (EAP) - MCP (disc. igual)
Estatística Valor
Mínimo -2.6473
1º Quartil -0.6994
Mediana -0.0286
Média -0.0048
3º Quartil 0.7048
Máximo 2.5895
Desvio Padrão 0.9396

7.7.2 Boxplot

boxplot(df.eap.gpcma,
        ylab = "Traço Latente",
        main = "Boxplot do Traço Latente (EAP) - MCP (disc. igual)",
        col = "forestgreen")

7.7.3 Histograma

lim_inf_gpcma <- floor(min(df.eap.gpcma)) - 1
lim_sup_gpcma <- ceiling(max(df.eap.gpcma)) + 1
breaks_gpcma2 <- seq(lim_inf_gpcma, lim_sup_gpcma, by = 1)

hist(df.eap.gpcma,
     xlab = "Traço Latente",
     ylab = "Frequencia",
     main = "Histograma do Traço Latente (EAP) - MCP (disc. igual)",
     xlim = c(lim_inf_gpcma, lim_sup_gpcma),
     breaks = breaks_gpcma2,
     col = "forestgreen",
     border = "white")

7.7.4 Tabela de Frequências

tabela_gpcma <- fdt(df.eap.gpcma,
                    start = lim_inf_gpcma, end = lim_sup_gpcma, h = 1)
print(tabela_gpcma)
##  Class limits   f   rf rf(%)   cf cf(%)
##       [-4,-3)   0 0.00   0.0    0   0.0
##       [-3,-2)  13 0.01   1.3   13   1.3
##       [-2,-1) 149 0.15  14.9  162  16.2
##        [-1,0) 341 0.34  34.1  503  50.3
##         [0,1) 341 0.34  34.1  844  84.4
##         [1,2) 146 0.15  14.6  990  99.0
##         [2,3)  10 0.01   1.0 1000 100.0
##         [3,4)   0 0.00   0.0 1000 100.0

Com discriminação negativa, a distribuição do traço latente EAP apresentou média de −0,005 e desvio padrão de 0,940. Embora os valores numéricos pareçam razoáveis, eles decorrem de um modelo mal especificado e não devem ser interpretados como estimativas confiáveis do traço latente. A distribuição aparentemente normal é um artefato da prior \(N(0,1)\) dominando a verossimilhança num modelo de ajuste pobre.


8 Ajuste com o MCP - discriminação igual a 1 (Rasch)

O MCP com discriminação fixada em 1 (modelo de Rasch politômico) é o modelo mais restritivo dentre os avaliados. Assume que todos os itens discriminam igualmente e com intensidade unitária, o que simplifica drasticamente a interpretação: apenas os parametros de dificuldade de categoria são estimados. É o modelo mais fácil de interpretar e o mais parcimonioso, mas também o que impõe as premissas mais fortes sobre os dados.

8.1 Parametros Iniciais Estimados

gpcm1.par <- gpcm(respostas.gpcm.orig, constraint = "rasch")
gpcm1.par
## 
## Call:
## gpcm(data = respostas.gpcm.orig, constraint = "rasch")
## 
## Coefficients:
##      Catgr.1  Catgr.2  Catgr.3  Dscrmn
## V1    -0.289    0.030    0.457       1
## V2    -0.374    0.015    0.378       1
## V3    -0.714    0.035    0.596       1
## V4    -0.574    0.094    0.684       1
## V5    -0.699    0.033    0.602       1
## V6    -0.811    0.170    0.803       1
## V7    -0.793    0.069    0.833       1
## V8    -0.746    0.039    0.750       1
## V9    -0.762    0.088    0.875       1
## V10   -0.737    0.079    0.948       1
## V11   -0.782    0.022    0.741       1
## V12   -0.724    0.005    0.932       1
## V13   -0.787   -0.027    0.900       1
## V14   -0.875   -0.032    0.936       1
## V15   -0.919    0.245    1.017       1
## V16   -0.849    0.092    0.900       1
## V17   -0.781   -0.029    0.987       1
## V18   -0.832    0.041    0.945       1
## V19   -0.858    0.008    0.908       1
## V20   -0.944    0.135    1.116       1
## 
## Log.Lik: -25205.9
coef_gpcm1 <- coef(gpcm1.par)
df_gpcm1_ini <- as.data.frame(coef_gpcm1)
df_gpcm1_ini$Item <- rownames(df_gpcm1_ini)
rownames(df_gpcm1_ini) <- NULL

kable(df_gpcm1_ini,
      digits = 4,
      caption = "Parametros iniciais estimados - MCP (discriminacao = 1, Rasch)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros iniciais estimados - MCP (discriminacao = 1, Rasch)
Catgr.1 Catgr.2 Catgr.3 Dscrmn Item
-0.289 0.030 0.457 1 V1
-0.374 0.015 0.378 1 V2
-0.714 0.035 0.596 1 V3
-0.574 0.094 0.684 1 V4
-0.699 0.033 0.602 1 V5
-0.811 0.170 0.803 1 V6
-0.793 0.069 0.833 1 V7
-0.746 0.039 0.750 1 V8
-0.762 0.088 0.875 1 V9
-0.737 0.079 0.948 1 V10
-0.782 0.022 0.741 1 V11
-0.724 0.005 0.932 1 V12
-0.787 -0.027 0.900 1 V13
-0.875 -0.032 0.936 1 V14
-0.919 0.245 1.017 1 V15
-0.849 0.092 0.900 1 V16
-0.781 -0.029 0.987 1 V17
-0.832 0.041 0.945 1 V18
-0.858 0.008 0.908 1 V19
-0.944 0.135 1.116 1 V20

No modelo Rasch, a discriminação é fixada em \(a = 1\) (não estimada). Os parametros de categoria estimados ficaram próximos dos valores populacionais (\(-1\), \(0\), \(+1\)), com variações entre items de até 0,3 unidades. Nenhum item apresentou parametros de dificuldade extremos (\(|b| > 5\)), portanto nenhum item foi removido.

8.2 Remoção de Itens Inadequados

# No MCP Rasch a = 1 para todos os itens (fixo, não estimado).
# coef() retorna matriz apenas com os parametros de dificuldade (b's).
# Critério: remover itens com b's muito extremos (|b| > 5).

if (is.matrix(coef_gpcm1)) {
  bs_rasch         <- coef_gpcm1        # todas as colunas são b's
  itens_b_ext_rasch <- which(apply(abs(bs_rasch), 1, max) > 5)
} else {
  itens_b_ext_rasch <- integer(0)
}

cat("discriminacao fixa no modelo Rasch: a = 1\n")
## discriminacao fixa no modelo Rasch: a = 1
if (length(itens_b_ext_rasch) > 0) {
  cat("Itens removidos (b extremo, |b| > 5):", paste(itens_b_ext_rasch, collapse = ", "), "\n")
  respostas.gpcm1.ok <- respostas.gpcm.orig[, -itens_b_ext_rasch]
  gpcm1.par.final    <- gpcm(respostas.gpcm1.ok, constraint = "rasch")
} else {
  cat("Nenhum item removido. Todos os b's dentro do intervalo usual.\n")
  respostas.gpcm1.ok <- respostas.gpcm.orig
  gpcm1.par.final    <- gpcm1.par
}
## Nenhum item removido. Todos os b's dentro do intervalo usual.

8.3 Parametros Finais Estimados

gpcm1.par.final
## 
## Call:
## gpcm(data = respostas.gpcm.orig, constraint = "rasch")
## 
## Coefficients:
##      Catgr.1  Catgr.2  Catgr.3  Dscrmn
## V1    -0.289    0.030    0.457       1
## V2    -0.374    0.015    0.378       1
## V3    -0.714    0.035    0.596       1
## V4    -0.574    0.094    0.684       1
## V5    -0.699    0.033    0.602       1
## V6    -0.811    0.170    0.803       1
## V7    -0.793    0.069    0.833       1
## V8    -0.746    0.039    0.750       1
## V9    -0.762    0.088    0.875       1
## V10   -0.737    0.079    0.948       1
## V11   -0.782    0.022    0.741       1
## V12   -0.724    0.005    0.932       1
## V13   -0.787   -0.027    0.900       1
## V14   -0.875   -0.032    0.936       1
## V15   -0.919    0.245    1.017       1
## V16   -0.849    0.092    0.900       1
## V17   -0.781   -0.029    0.987       1
## V18   -0.832    0.041    0.945       1
## V19   -0.858    0.008    0.908       1
## V20   -0.944    0.135    1.116       1
## 
## Log.Lik: -25205.9
coef_gpcm1_fin <- coef(gpcm1.par.final)
df_gpcm1_fin <- as.data.frame(coef_gpcm1_fin)
df_gpcm1_fin$Item <- rownames(df_gpcm1_fin)
rownames(df_gpcm1_fin) <- NULL

kable(df_gpcm1_fin,
      digits = 4,
      caption = "Parametros finais estimados - MCP (discriminacao = 1, Rasch)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Parametros finais estimados - MCP (discriminacao = 1, Rasch)
Catgr.1 Catgr.2 Catgr.3 Dscrmn Item
-0.289 0.030 0.457 1 V1
-0.374 0.015 0.378 1 V2
-0.714 0.035 0.596 1 V3
-0.574 0.094 0.684 1 V4
-0.699 0.033 0.602 1 V5
-0.811 0.170 0.803 1 V6
-0.793 0.069 0.833 1 V7
-0.746 0.039 0.750 1 V8
-0.762 0.088 0.875 1 V9
-0.737 0.079 0.948 1 V10
-0.782 0.022 0.741 1 V11
-0.724 0.005 0.932 1 V12
-0.787 -0.027 0.900 1 V13
-0.875 -0.032 0.936 1 V14
-0.919 0.245 1.017 1 V15
-0.849 0.092 0.900 1 V16
-0.781 -0.029 0.987 1 V17
-0.832 0.041 0.945 1 V18
-0.858 0.008 0.908 1 V19
-0.944 0.135 1.116 1 V20

Com \(a = 1\) fixo para todos, os parametros finais são idênticos aos iniciais. As estimativas de Catgr.1 variaram de \(-0{,}289\) (V1) a \(-0{,}944\) (V20), Catgr.2 ficou próxima de zero em todos os itens (máximo: 0,245 no V15), e Catgr.3 variou de \(0{,}378\) (V2) a \(1{,}116\) (V20). Observa-se que o modelo recuperou razoavelmente bem a estrutura dos parametros populacionais para as dificuldades de transição.

8.4 Gráficos CCI - MCP (Rasch)

n_itens_gpcm1 <- ncol(respostas.gpcm1.ok)
n_row_gpcm1 <- ceiling(n_itens_gpcm1 / 4)
par(mfrow = c(n_row_gpcm1, 4), mar = c(3, 3, 2, 1))
plot(gpcm1.par.final)

par(mfrow = c(1, 1))

Com discriminação unitária igual para todos os itens, as CCI do Rasch apresentam as curvas mais suaves e simétricas entre todos os modelos avaliados. As categorias se superpõem de forma mais gradual, o que é coerente com a menor capacidade discriminativa do modelo em relação ao MRG e MCPG livres.

8.5 Gráficos das FII - MCP (Rasch)

plot(gpcm1.par.final, type = "IIC",
     main = "Funcoes de Informacao dos Itens - MCP (Rasch)")

Com \(a = 1\) para todos os itens, as FII individuais têm exatamente o mesmo formato e diferem apenas na posição. O banco de 20 itens resulta em uma FIT mais distribuída ao longo do eixo \(\theta\) do que os bancos menores dos modelos anteriores, o que é uma vantagem do Rasch: com mais itens contribuindo igualmente, a cobertura da escala é mais uniforme.

8.6 Gráfico FIT - MCP (Rasch)

plot(gpcm1.par.final, type = "IIC", item = 0,
     main = "Funcao de Informacao do Teste - MCP (Rasch)")

A FIT do modelo Rasch com 20 itens apresenta um pico menor mas mais amplo em comparação ao MRG livre (14 itens de alta discriminação). Isso reflete o trade-off entre precisão e cobertura: o Rasch oferece informação mais distribuída, enquanto modelos de alta discriminação concentram a informação em faixas estreitas de \(\theta\).

8.7 Estimação do Traço Latente (EAP) - MCP (Rasch)

gpcm1EAP.sco <- factor.scores(gpcm1.par.final, method = "EAP")
df.eap.gpcm1 <- as.vector(rep(gpcm1EAP.sco$score.dat$z1,
                               gpcm1EAP.sco$score.dat$Obs))

8.7.1 Medidas Descritivas

desc_gpcm1 <- data.frame(
  Estatística = c("Mínimo", "1º Quartil", "Mediana", "Média",
                  "3º Quartil", "Máximo", "Desvio Padrão"),
  Valor = c(
    round(min(df.eap.gpcm1), 4),
    round(quantile(df.eap.gpcm1, 0.25), 4),
    round(median(df.eap.gpcm1), 4),
    round(mean(df.eap.gpcm1), 4),
    round(quantile(df.eap.gpcm1, 0.75), 4),
    round(max(df.eap.gpcm1), 4),
    round(sd(df.eap.gpcm1), 4)
  )
)

kable(desc_gpcm1,
      caption = "Medidas descritivas do traço latente (EAP) - MCP (Rasch)",
      align = "c") |>
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE)
Medidas descritivas do traço latente (EAP) - MCP (Rasch)
Estatística Valor
Mínimo -2.1543
1º Quartil -0.6109
Mediana 0.0106
Média 0.0172
3º Quartil 0.6289
Máximo 2.2192
Desvio Padrão 0.7391

8.7.2 Boxplot

boxplot(df.eap.gpcm1,
        ylab = "Traço Latente",
        main = "Boxplot do Traço Latente (EAP) - MCP (Rasch)",
        col = "tomato")

8.7.3 Histograma

lim_inf_gpcm1 <- floor(min(df.eap.gpcm1)) - 1
lim_sup_gpcm1 <- ceiling(max(df.eap.gpcm1)) + 1
breaks_gpcm1   <- seq(lim_inf_gpcm1, lim_sup_gpcm1, by = 1)

hist(df.eap.gpcm1,
     xlab = "Traço Latente",
     ylab = "Frequencia",
     main = "Histograma do Traço Latente (EAP) - MCP (Rasch)",
     xlim = c(lim_inf_gpcm1, lim_sup_gpcm1),
     breaks = breaks_gpcm1,
     col = "tomato",
     border = "white")

8.7.4 Tabela de Frequências

tabela_gpcm1 <- fdt(df.eap.gpcm1,
                    start = lim_inf_gpcm1, end = lim_sup_gpcm1, h = 1)
print(tabela_gpcm1)
##  Class limits   f   rf rf(%)   cf cf(%)
##       [-4,-3)   0 0.00   0.0    0   0.0
##       [-3,-2)   2 0.00   0.2    2   0.2
##       [-2,-1)  68 0.07   6.8   70   7.0
##        [-1,0) 427 0.43  42.7  497  49.7
##         [0,1) 418 0.42  41.8  915  91.5
##         [1,2)  83 0.08   8.3  998  99.8
##         [2,3)   2 0.00   0.2 1000 100.0
##         [3,4)   0 0.00   0.0 1000 100.0

A distribuição do traço latente estimado pelo MCP Rasch apresentou média de 0,017 e desvio padrão de 0,739 - o menor entre todos os modelos MCPG. Isso é esperado: com discriminação fixada em 1 (menor do que a média dos itens no delineamento, que vai até \(a = 2\)), o modelo subestima a separação entre indivíduos, resultando em estimativas de \(\theta\) mais comprimidas ao redor da média. A tabela de frequências mostra que 84,5% dos respondentes foram alocados no intervalo \([-1, 1)\), contra 74,4% no MCPG livre, confirmando a maior concentração das estimativas no modelo Rasch.


9 Considerações Finais

9.1 Comparação entre os modelos ajustados

A tabela abaixo sintetiza os principais resultados obtidos nos cinco ajustes realizados:

Modelo Dados gerados Itens finais DP(θ̂) EAP Observação
MRG livre MRG 14/20 0,519 6 itens removidos (a < 0,65)
MRG constrained MRG 14/14 0,921 a comum = 1,249; nenhum item removido
MCPG livre MCPG 13/20 0,963 7 itens removidos (a < 0,65)
MCP 1PL MCPG 20/20 0,940 a negativo (−0,708): ajuste inadequado
MCP Rasch MCPG 20/20 0,739 a fixo = 1; distribuição θ̂ mais comprimida

9.2 Principais conclusões

Remoção de itens: Em ambos os casos (MRG e MCPG livres), os primeiros itens do banco foram eliminados pelo critério \(a < 0{,}65\). Isso demonstra a sensibilidade do critério e a coerência entre o delineamento de simulação e o processo de validação.

Dispersão do traço latente: O MRG livre, com apenas 14 itens mas de alta discriminação, produziu as estimativas de $ heta$ mais comprimidas (DP = 0,519). Os modelos constrained e Rasch ampliam a dispersão por não capturar a heterogeneidade nas discriminações. O MCPG livre resultou nas estimativas mais dispersas (DP = 0,963), próximas ao desvio padrão da distribuição geradora.

MCP 1PL com dados MCPG: A discriminação negativa estimada pelo modelo 1PL (\(a = -0{,}708\)) evidencia a incompatibilidade entre esse modelo altamente restritivo e os dados gerados com discriminações heterogêneas. Isso reforça a importancia de avaliar a adequação do modelo antes de interpretar os resultados.

MCP Rasch: Apesar de sua simplicidade, o modelo Rasch produziu parametros de dificuldade razoavelmente próximos aos populacionais. O custo é a subestimação da variabilidade do traço latente quando a discriminação real dos itens é superior a 1.