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:
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.
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:
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)| 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
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)\).
##
## 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)| 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 |
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
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\).
##
## 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)| 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.
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.
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.
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.
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))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)| 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 |
boxplot(df.eap.grm,
ylab = "Traço Latente",
main = "Boxplot do Traço Latente (EAP) - MRG",
col = "steelblue")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")## 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.
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.
##
## 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)| 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 |
# 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.
##
## 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)| 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.
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.
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.
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.
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))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)| 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 |
boxplot(df.eap.grmR,
ylab = "Traço Latente",
main = "Boxplot do Traço Latente (EAP) - MRG (disc. igual)",
col = "darkorange")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")## 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.
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)| 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 |
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.
# 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)| 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).
# 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
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.
##
## 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)| 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.
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.
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)\).
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.
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))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)| 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 |
boxplot(df.eap.gpcm,
ylab = "Traço Latente",
main = "Boxplot do Traço Latente (EAP) - MCPG",
col = "mediumpurple")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")## 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.
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.
##
## 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)| 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\).
# 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.
##
## 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)| 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.
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)plot(gpcma.par.final, type = "IIC", item = 0,
main = "Funcao de Informacao do Teste - MCP (disc. 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))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)| 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 |
boxplot(df.eap.gpcma,
ylab = "Traço Latente",
main = "Boxplot do Traço Latente (EAP) - MCP (disc. igual)",
col = "forestgreen")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")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.
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.
##
## 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)| 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.
# 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.
##
## 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)| 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.
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)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.
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.
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\).
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))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)| 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 |
boxplot(df.eap.gpcm1,
ylab = "Traço Latente",
main = "Boxplot do Traço Latente (EAP) - MCP (Rasch)",
col = "tomato")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")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.
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 |
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.