1 Teoria da Resposta ao Item

  • Em campos como Educação e Psicologia, há o constante interesse na mensuração de uma variável. Muitas vezes, tais variáveis não podem ser observadas diretamente: são as chamadas , por exemplo, habilidade, inteligência, entre outras.

  • Neste sentido, o objetivo da Teoria da Resposta ao Item é mensurar o quanto de uma habilidade latente um indivíduo possui. Assim, é possível avaliar comparativamente indivíduos por meio de uma escala de medida obtida a partir das respostas fornecidas por estes mesmos indivíduos a um teste. Tradicionalmente, o desempenho é avaliado pela soma dos scores obtidos em cada item do teste.

  • No entanto, tal abordagem não leva em consideração o grau de dificuldade de cada questão. Isto é, a pontuação final de um indivíduo depende apenas da quantidade de questões corretas, sendo ignorado o grau de dificuldade destas questões. A TRI permite que indivíduos com número de acertos menor, em comparação a outros, obtenha um score maior, desde que tenha acertado questões com grau de dificuldade e discriminação maiores. Nesta aplicação, abordaremos modelos que tratam dados binarizados, isto é, considerando que o indivíduo acertou (1) ou errou (0) um dado item.

1.1 Modelo de Rasch

Este é o modelo mais utilizado em TRI. Suponha que temos \(J\) itens binário \(X_1, X_2,\ldots,X_J\) em que \(1\) indica uma resposta correta e \(0\) indica uma resposta incorreta. A probabilidade de que o indivíduo \(i\) responda corretamente o item \(j\) é dada por:

\[Pr(X_{ij} = 1) = \frac{e^{\eta_i - \alpha_j}}{1 + e^{\eta_i - \alpha_j}}\]

em que \(\eta_i\) é a habilidade do indivíduo \(i\) e \(\alpha_j\) é a dificuldade do item \(j\).

Curva característica de um item

Curva característica de um item

Modelo de Rasch

Modelo de Rasch

1.2 Modelo de Dois Parâmetros

No modelo de Rasch, assume-se que todos os itens possuem a mesma forma. No Modelo de Dois Parâmetros, é adicionada a discriminação: um parâmetro que modifica a inclinação da CCI. Assim, a probabilidade do indivíduo \(i\) responder corretamente o item \(j\) é dada por \[P(X_{ij} = 1) = \frac{e^{\lambda_j \eta_i - \alpha_j}}{1+e^{\lambda_j \eta_i - \alpha_j}}\]

No modelo de dois parâmetros, as curvas caraterísticas dos itens assumem a seguinte forma:

Representação do modelo de 2 parâmetros

Representação do modelo de 2 parâmetros

1.3 Modelo de Três Parâmetros

Considera o fato de que indivíduos podem vir a acertar itens por meio de chute. O modelo inclui um parâmetro que representa a contribuição dos chutes na probabilidade de uma resposta correta. Assim, a probabilidade de acerto é dada pela relação:

\[P(X_{ij} = 1) = c + (1-c) * \frac{1}{1+e^{\lambda_j(\eta_i - \alpha_j)}}\]

No modelo de três parâmetros, as curvas caraterísticas dos itens assumem a seguinte forma:
Representação do modelo de 3 parâmetros

Representação do modelo de 3 parâmetros

2 Estimação de Parâmetros no Modelo de Rasch

2.1 Máxima Verossimilhança Conjunta

A probabilidade de uma dada matriz de respostas, que é o produto das probabilidades de acerto de cada indivíduo em cada item, tem a seguinte função de verossimilhança:

\[\Lambda ={\frac{\prod_{i}\prod_{j}\exp(x_{ij}(\eta_{i}-\alpha_{j}))}{\prod_{i}\prod_{j}(1+\exp(\eta_{i}-\alpha_{j}))}}\]

A função de verossimilhança é dada por: \[\log \Lambda =\sum_{i}^{I}\eta_{i}r_{i}-\sum_{j}^{J}\alpha_{j}s_{j}-\sum_{j}^{J}\sum_{i}^{I}\log(1+\exp(\eta_{i}-\alpha_{j}))\]

em que \(r_{i}=\sum _{j}^{J}x_{ij}\) é o score total por pessoa \(i\) e \(s_{j}=\sum _{i}^{I}x_{ij}\) é o score total por item \(j\). A solução das equações após fazer as derivadas parciais e igualar a zero não é fechada. São necessários métodos numéricos para encontrar a solução.

3 Aplicação: Enade 2019 na Ufersa

library(dplyr)
library(ltm)
library(ggpubr)

microdados_enade_fixo <- read.table("C:/microdados_enade_2019.txt", header = TRUE, 
                                    sep=";", dec = ".",
                                    colClasses=c(DS_VT_ACE_OFG="character",
                                                 DS_VT_ACE_OCE="character"))

3.1 Pré-processamento

Os microdados do Enade 2019 foram utilizados para obter os acertos e erros por universidade e por área. É necessário, antes de utilizar os modelos de TRI, readequar os dados.

Na Tabela abaixo, são apresentados os códigos por área de enquadramento no Enade para os cursos participantes na Ufersa:

dicionario = data.frame(Codigo =  c("5", "6", "12", "17","19", "21", "23", "27", "28", "36", "51", "55", 
                                    "69", "90", "91", "92", "95", "3501", "4003", "5710", "5806", 
                                    "5814", "5902", "6002", "6008", "6208", "6307", "6405", "6410"),
                        Area_enquadramento = c("MEDICINA VETERINÁRIA", "ODONTOLOGIA", "MEDICINA", "AGRONOMIA",
                                               "FARMÁCIA", "ARQUITETURA E URBANISMO", "ENFERMAGEM",
                                               "FONOAUDIOLOGIA", "NUTRIÇÃO", "FISIOTERAPIA",
                                               "ZOOTECNIA","BIOMEDICINA",
                                               "TECNOLOGIA EM RADIOLOGIA", "TECNOLOGIA EM AGRONEGÓCIOS",
                                               "TECNOLOGIA EM GESTÃO HOSPITALAR", 
                                               "TECNOLOGIA EM GESTÃO AMBIENTAL",
                                               "TECNOLOGIA EM ESTÉTICA E COSMÉTICA", 
                                               "EDUCAÇÃO FÍSICA (BACHARELADO)",
                                               "ENGENHARIA DA COMPUTAÇÃO", "ENGENHARIA CIVIL", 
                                               "ENGENHARIA ELÉTRICA",
                                               "ENGENHARIA DE CONTROLE E AUTOMAÇÃO", "ENGENHARIA MECÂNICA",
                                               "ENGENHARIA DE ALIMENTOS", "ENGENHARIA QUÍMICA",
                                               "ENGENHARIA DE PRODUÇÃO", "ENGENHARIA AMBIENTAL",
                                               "ENGENHARIA FLORESTAL", "TECNOLOGIA EM SEGURANÇA NO TRABALHO"))


dicionario %>% ggtexttable(rows=NULL, theme = ttheme("mBlue")) -> q

q + theme_void() + labs(title="Código da área de enquadramento do curso no Enade", 
                        caption="Fonte: Dicionário de Variáveis Enade - 2019")

O primeiro do pré-processamento consiste em filtrar os dados em relação à Instituição de Ensino Superior desejada. A variável CO_IES indica, por meio de códigos, as IES. A Ufersa é representada pelo código 589. É criado um data frame com duas variáveis da Ufersa, a saber, a área da prova e os acertos dos estudantes (0-erro, 1-acerto). Este último dado está representado como uma string de zeros e uns, sendo necessário transforma-la em um vetor numérico, o que é feito por meio da função “transforma”. Como exemplo, utilizaremos uma área para mostrar a aplicação dos modelos de TRI.

Os dados são novamente filtrados de forma a conter somente os alunos que responderam a prova. Em seguida, é apresentada uma descrição dos dados: a proporção de acertos e erros em cada item, as frequências dos scores (notas obtidas ao somar os acertos), a correlação bisserial entre os itens e o score, o alpha de Cronbach e as associações entre os pares de itens.

# passo 0: filtrar ies (codigo da ufersa e 589)
microdados_enade_fixo %>% filter(., CO_IES==589) -> microdados_enade

dados_respostas = data.frame(curso=microdados_enade$CO_GRUPO, 
                             respostas=microdados_enade$DS_VT_ACE_OCE)

microdados_enade$CO_GRUPO %>% unique -> grupos

codigo_grupo = grupos[1]

# passo 1: filtrar o curso e apenas os alunos que responderam 
dados_respostas %>% filter(curso==codigo_grupo & respostas != " ") -> dados_respostas

# passo 2: definindo a entrada para as funcoes de TRI
transforma <- function (x) (x %>% as.character() %>% strsplit(., ""))[[1]] %>% as.numeric

sapply(dados_respostas$respostas, transforma) %>% t %>% as.data.frame %>% 
  select_if(~ length(unique(.)) > 1) -> dados_para_ltm

descript(dados_para_ltm)
## 
## Descriptive statistics for the 'dados_para_ltm' data-set
## 
## Sample:
##  22 items and 38 sample units; 0 missing values
## 
## Proportions for each level of response:
##          0      1   logit
## V2  0.5000 0.5000  0.0000
## V3  0.2368 0.7632  1.1701
## V5  0.4737 0.5263  0.1054
## V6  0.1316 0.8684  1.8871
## V7  0.7368 0.2632 -1.0296
## V8  0.4737 0.5263  0.1054
## V9  0.3421 0.6579  0.6539
## V10 0.1053 0.8947  2.1401
## V11 0.7105 0.2895 -0.8979
## V12 0.8421 0.1579 -1.6740
## V13 0.5263 0.4737 -0.1054
## V14 0.1579 0.8421  1.6740
## V17 0.1842 0.8158  1.4881
## V18 0.4474 0.5526  0.2113
## V19 0.2895 0.7105  0.8979
## V20 0.3421 0.6579  0.6539
## V21 0.1842 0.8158  1.4881
## V22 0.7895 0.2105 -1.3218
## V23 0.1053 0.8947  2.1401
## V24 0.3947 0.6053  0.4274
## V26 0.3947 0.6053  0.4274
## V27 0.4474 0.5526  0.2113
## 
## 
## Frequencies of total scores:
##      0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
## Freq 0 0 0 0 0 0 0 1 2 3  2  5  4  4  4  1  4  3  5  0  0  0  0
## 
## 
## Point Biserial correlation with Total Score:
##     Included Excluded
## V2    0.4508   0.3139
## V3    0.2055   0.0744
## V5    0.3007   0.1505
## V6    0.3133   0.2140
## V7    0.5055   0.3926
## V8    0.6618   0.5597
## V9    0.3524   0.2136
## V10   0.3402   0.2517
## V11   0.1260  -0.0153
## V12   0.0201  -0.0931
## V13   0.4545   0.3182
## V14   0.4294   0.3302
## V17   0.1964   0.0769
## V18   0.4802   0.3478
## V19   0.3439   0.2109
## V20   0.0414  -0.1059
## V21   0.2598   0.1426
## V22   0.2719   0.1490
## V23   0.0998   0.0042
## V24   0.5494   0.4293
## V26   0.3482   0.2046
## V27   0.3978   0.2560
## 
## 
## Cronbach's alpha:
##                value
## All Items     0.6165
## Excluding V2  0.5900
## Excluding V3  0.6205
## Excluding V5  0.6130
## Excluding V6  0.6052
## Excluding V7  0.5815
## Excluding V8  0.5531
## Excluding V9  0.6042
## Excluding V10 0.6025
## Excluding V11 0.6324
## Excluding V12 0.6349
## Excluding V13 0.5894
## Excluding V14 0.5928
## Excluding V17 0.6191
## Excluding V18 0.5851
## Excluding V19 0.6045
## Excluding V20 0.6448
## Excluding V21 0.6122
## Excluding V22 0.6117
## Excluding V23 0.6233
## Excluding V24 0.5736
## Excluding V26 0.6054
## Excluding V27 0.5983
## 
## 
## Pairwise Associations:
##    Item i Item j p.value
## 1       1      4   1.000
## 2       1      9   1.000
## 3       1     10   1.000
## 4       1     13   1.000
## 5       1     14   1.000
## 6       1     17   1.000
## 7       1     18   1.000
## 8       2      8   1.000
## 9       2     12   1.000
## 10      2     19   1.000

3.2 Ajustando os modelos

Ajustando os modelos de TRI para um curso específico. O primeiro modelo ajustado é o de Rasch com 1 parâmetro. Neste caso, o fator de discriminação dos itens é mantido fixo em 1 e os graus de dificuldade são estimados.

Também é obtida a probabilidade de que um estudante médio responder a cada item. Com base nesta informação, seremos capazes de indicar quais itens possuem probabilidade de acerto menor do que um valor estipulado em, por exemplo, 40%. Poderemos, então, disponibilizar esta informação para as coordenações dos cursos. A identificação das questões com menor probabilidade de acerto por parte dos estudantes poderá apontar para conteúdos que devem ser melhor trabalhados em sala de aula.

# Modelo 1: (Rasch model with constrained discrimination)
fit1 <- ltm::rasch(dados_para_ltm, constraint = cbind(ncol(dados_para_ltm) + 1, 1))
summary(fit1)
## 
## Call:
## ltm::rasch(data = dados_para_ltm, constraint = cbind(ncol(dados_para_ltm) + 
##     1, 1))
## 
## Model Summary:
##    log.Lik      AIC      BIC
##  -466.6002 977.2004 1013.227
## 
## Coefficients:
##              value std.err  z.vals
## Dffclt.V2  -0.0040  0.3839 -0.0105
## Dffclt.V3  -1.3306  0.4343 -3.0638
## Dffclt.V5  -0.1250  0.3843 -0.3254
## Dffclt.V6  -2.1121  0.5241 -4.0296
## Dffclt.V7   1.1712  0.4238  2.7636
## Dffclt.V8  -0.1250  0.3843 -0.3254
## Dffclt.V9  -0.7514  0.3990 -1.8830
## Dffclt.V10 -2.3819  0.5695 -4.1822
## Dffclt.V11  1.0231  0.4141  2.4703
## Dffclt.V12  1.8862  0.4938  3.8195
## Dffclt.V13  0.1170  0.3844  0.3045
## Dffclt.V14 -1.8826  0.4918 -3.8277
## Dffclt.V17 -1.6804  0.4677 -3.5931
## Dffclt.V18 -0.2467  0.3854 -0.6400
## Dffclt.V19 -1.0269  0.4130 -2.4867
## Dffclt.V20 -0.7515  0.3990 -1.8833
## Dffclt.V21 -1.6804  0.4677 -3.5931
## Dffclt.V22  1.4982  0.4507  3.3242
## Dffclt.V23 -2.3819  0.5695 -4.1822
## Dffclt.V24 -0.4938  0.3902 -1.2653
## Dffclt.V26 -0.4938  0.3902 -1.2653
## Dffclt.V27 -0.2467  0.3854 -0.6401
## Dscrmn      1.0000      NA      NA
## 
## Integration:
## method: Gauss-Hermite
## quadrature points: 21 
## 
## Optimization:
## Convergence: 0 
## max(|grad|): 0.0014 
## quasi-Newton: BFGS
c = coef(fit1, prob = TRUE, order = TRUE) 
c
##           Dffclt Dscrmn P(x=1|z=0)
## V10 -2.381874294      1  0.9154346
## V23 -2.381852821      1  0.9154330
## V6  -2.112074947      1  0.8920713
## V14 -1.882591427      1  0.8679085
## V17 -1.680437180      1  0.8429624
## V21 -1.680404051      1  0.8429580
## V3  -1.330623787      1  0.7909438
## V19 -1.026943762      1  0.7363230
## V20 -0.751520593      1  0.6795099
## V9  -0.751409048      1  0.6794856
## V24 -0.493789885      1  0.6209988
## V26 -0.493770533      1  0.6209943
## V27 -0.246686685      1  0.5613608
## V18 -0.246655769      1  0.5613532
## V8  -0.125048772      1  0.5312215
## V5  -0.125044336      1  0.5312204
## V2  -0.004045428      1  0.5010114
## V13  0.117045094      1  0.4707721
## V11  1.023052655      1  0.2644332
## V7   1.171228561      1  0.2366330
## V22  1.498150235      1  0.1827016
## V12  1.886208676      1  0.1316774
c[c[,3]<=0.4,] %>% rownames # probabilidade de um estudante medio responder abaixo de 40 porcento
## [1] "V11" "V7"  "V22" "V12"
#GoF.rasch(fit1,B=199) # goodness of fit, B is the number of bootstrap samples
 
# plotando
 
plot(fit1, legend = TRUE, cx = "bottomright",
     lwd = 3, cex.main = 1.5, cex.lab = 1.3, cex = 0.8)

Em seguida, é ajustado o modelo de Rasch com fator de discriminação é constante, mas irrestrita. Assim, o valor estimado da discriminação foi de 0.646. Da mesma forma, foram obtidos os itens em que a probabilidade de acerto de um aluno com habilidade média é menor que 40%. Nota-se que, pelo critério de informação de Akaike, o modelo 1 apresenta um melhor ajuste aos dados.

# Modelo 2: (Rasch model with unconstrained, but constant, discrimination)

fit2 <- ltm::rasch(dados_para_ltm)
summary(fit2)
## 
## Call:
## ltm::rasch(data = dados_para_ltm)
## 
## Model Summary:
##    log.Lik      AIC      BIC
##  -463.7698 973.5397 1011.204
## 
## Coefficients:
##              value std.err  z.vals
## Dffclt.V2  -0.0019  0.5551 -0.0035
## Dffclt.V3  -1.9885  0.7297 -2.7251
## Dffclt.V5  -0.1822  0.5565 -0.3275
## Dffclt.V6  -3.1740  0.9709 -3.2691
## Dffclt.V7   1.7510  0.6935  2.5250
## Dffclt.V8  -0.1823  0.5565 -0.3275
## Dffclt.V9  -1.1182  0.6128 -1.8247
## Dffclt.V10 -3.5865  1.0759 -3.3334
## Dffclt.V11  1.5295  0.6623  2.3094
## Dffclt.V12  2.8262  0.8910  3.1720
## Dffclt.V13  0.1785  0.5567  0.3206
## Dffclt.V14 -2.8247  0.8906 -3.1717
## Dffclt.V17 -2.5176  0.8263 -3.0467
## Dffclt.V18 -0.3636  0.5611 -0.6480
## Dffclt.V19 -1.5313  0.6613 -2.3156
## Dffclt.V20 -1.1183  0.6128 -1.8249
## Dffclt.V21 -2.5176  0.8263 -3.0467
## Dffclt.V22  2.2419  0.7745  2.8947
## Dffclt.V23 -3.5861  1.0758 -3.3333
## Dffclt.V24 -0.7327  0.5801 -1.2631
## Dffclt.V26 -0.7327  0.5801 -1.2631
## Dffclt.V27 -0.3637  0.5611 -0.6481
## Dscrmn      0.6399  0.1265  5.0577
## 
## Integration:
## method: Gauss-Hermite
## quadrature points: 21 
## 
## Optimization:
## Convergence: 0 
## max(|grad|): 0.0061 
## quasi-Newton: BFGS
c2 = coef(fit2, prob = TRUE, order=TRUE)
c2
##         Dffclt    Dscrmn P(x=1|z=0)
## V10 -3.5865026 0.6398626  0.9084512
## V23 -3.5861453 0.6398626  0.9084322
## V6  -3.1739879 0.6398626  0.8840051
## V14 -2.8247467 0.6398626  0.8590534
## V17 -2.5175862 0.6398626  0.8335376
## V21 -2.5175649 0.6398626  0.8335357
## V3  -1.9885201 0.6398626  0.7811498
## V19 -1.5313431 0.6398626  0.7270783
## V20 -1.1182766 0.6398626  0.6716249
## V9  -1.1181760 0.6398626  0.6716107
## V24 -0.7326859 0.6398626  0.6151040
## V26 -0.7326705 0.6398626  0.6151017
## V27 -0.3636816 0.6398626  0.5579154
## V18 -0.3636384 0.6398626  0.5579086
## V8  -0.1822793 0.6398626  0.5291254
## V5  -0.1822425 0.6398626  0.5291195
## V2  -0.0019375 0.6398626  0.5003099
## V13  0.1784825 0.6398626  0.4714799
## V11  1.5294702 0.6398626  0.2731596
## V7   1.7510245 0.6398626  0.2459343
## V22  2.2419163 0.6398626  0.1923956
## V12  2.8261960 0.6398626  0.1408344
# probabilidade de um estudante medio responder abaixo de 40 porcento
c2[c2[,3]<=0.4,] %>% rownames 
## [1] "V11" "V7"  "V22" "V12"
#GoF.rasch(fit2,B=99) # goodness of fit, B is the number of bootstrap samples

# comparandos os modelos
 
anova(fit1, fit2)
## 
##  Likelihood Ratio Table
##         AIC     BIC log.Lik  LRT df p.value
## fit1 977.20 1013.23 -466.60                
## fit2 973.54 1011.20 -463.77 5.66  1   0.017

O terceiro modelo ajustado é o de 2 parâmetros.

# modelo 3: two parameter logistic model
 
fit3 <- ltm(dados_para_ltm ~ z1)
summary(fit3)
## 
## Call:
## ltm(formula = dados_para_ltm ~ z1)
## 
## Model Summary:
##    log.Lik      AIC      BIC
##  -447.7256 983.4512 1055.505
## 
## Coefficients:
##              value  std.err  z.vals
## Dffclt.V2  -0.0158   0.3254 -0.0486
## Dffclt.V3  -2.4211   2.1852 -1.1079
## Dffclt.V5  -0.2314   0.7094 -0.3262
## Dffclt.V6  -3.6654   4.0061 -0.9150
## Dffclt.V7   1.2990   0.7522  1.7270
## Dffclt.V8  -0.0412   0.4000 -0.1030
## Dffclt.V9  -1.5815   1.6402 -0.9642
## Dffclt.V10 -8.6479  20.9164 -0.4135
## Dffclt.V11 -1.9246   1.8497 -1.0405
## Dffclt.V12 -8.4599  22.4178 -0.3774
## Dffclt.V13  0.1105   0.3809  0.2902
## Dffclt.V14 -2.8661   2.4338 -1.1776
## Dffclt.V17 -1.9628   1.2410 -1.5816
## Dffclt.V18 -0.2906   0.4495 -0.6465
## Dffclt.V19 -0.7746   0.3632 -2.1327
## Dffclt.V20  1.0440   0.8264  1.2633
## Dffclt.V21 -6.4583  13.4196 -0.4813
## Dffclt.V22  2.3582   1.9374  1.2172
## Dffclt.V23  3.0767   2.3973  1.2834
## Dffclt.V24 -0.5255   0.4446 -1.1819
## Dffclt.V26 -0.5737   0.4924 -1.1650
## Dffclt.V27 -0.4640   0.7886 -0.5884
## Dscrmn.V2   1.3277   0.6321  2.1004
## Dscrmn.V3   0.5117   0.4834  1.0585
## Dscrmn.V5   0.4975   0.4143  1.2009
## Dscrmn.V6   0.5442   0.6443  0.8447
## Dscrmn.V7   0.9231   0.5635  1.6382
## Dscrmn.V8  16.1923 154.1974  0.1050
## Dscrmn.V9   0.4332   0.4246  1.0204
## Dscrmn.V10  0.2505   0.6168  0.4061
## Dscrmn.V11 -0.4936   0.4786 -1.0312
## Dscrmn.V12 -0.1996   0.5351 -0.3730
## Dscrmn.V13  1.0506   0.5554  1.8915
## Dscrmn.V14  0.6300   0.5870  1.0733
## Dscrmn.V17  0.8698   0.6286  1.3838
## Dscrmn.V18  0.8794   0.5064  1.7368
## Dscrmn.V19  1.8074   1.0022  1.8034
## Dscrmn.V20 -0.6861   0.4740 -1.4476
## Dscrmn.V21  0.2333   0.4916  0.4745
## Dscrmn.V22  0.6009   0.5298  1.1344
## Dscrmn.V23 -0.7663   0.6880 -1.1139
## Dscrmn.V24  1.0033   0.5386  1.8627
## Dscrmn.V26  0.8842   0.5192  1.7031
## Dscrmn.V27  0.4886   0.4162  1.1740
## 
## Integration:
## method: Gauss-Hermite
## quadrature points: 21 
## 
## Optimization:
## Convergence: 0 
## max(|grad|): 0.001 
## quasi-Newton: BFGS
c3 = coef(fit3, prob = TRUE, order=TRUE)
c3
##          Dffclt     Dscrmn P(x=1|z=0)
## V10 -8.64790840  0.2504613  0.8971514
## V12 -8.45987966 -0.1996031  0.1559577
## V21 -6.45825705  0.2332506  0.8185259
## V6  -3.66535953  0.5442379  0.8802529
## V14 -2.86611495  0.6299802  0.8588287
## V3  -2.42105978  0.5116688  0.7753517
## V17 -1.96282617  0.8698196  0.8464864
## V11 -1.92463505 -0.4935558  0.2789019
## V9  -1.58149515  0.4332343  0.6648889
## V19 -0.77457196  1.8074419  0.8021829
## V26 -0.57366322  0.8841916  0.6241565
## V24 -0.52546008  1.0032873  0.6288269
## V27 -0.46397005  0.4886154  0.5564342
## V18 -0.29060363  0.8794338  0.5635462
## V5  -0.23141178  0.4975243  0.5287515
## V8  -0.04121952 16.1922793  0.6609293
## V2  -0.01582696  1.3277183  0.5052532
## V13  0.11053435  1.0505729  0.4710015
## V20  1.04398408 -0.6860865  0.6717837
## V7   1.29903124  0.9231370  0.2316204
## V22  2.35822961  0.6009405  0.1951079
## V23  3.07669697 -0.7663398  0.9135519
c3[c3[,3]<=0.4,] %>% rownames 
## [1] "V12" "V11" "V7"  "V22"
# comparando modelo 2 e 3
anova(fit2, fit3)
## 
##  Likelihood Ratio Table
##         AIC    BIC log.Lik   LRT df p.value
## fit2 973.54 1011.2 -463.77                 
## fit3 983.45 1055.5 -447.73 32.09 21   0.057

3.3 Itens mais difíceis por área

Neste caso, estamos considerando os itens de múltipla escolha da prova específica da área. Itens onde a probabilidade de acerto de um estudante com habilidade mediana é menor que 40%.

# Funcao que escolhe um modelo e retorna as questoes mais dificeis --------

mais_dificeis <- function(microdados, grupos, probability=0.4){
        transforma <- function (x) (x %>% as.character() %>% 
                                      strsplit(., ""))[[1]] %>% as.numeric
        hard_questions = list()
        cont=1 
        
        for(codigo_grupo in grupos){
                dados_respostas = data.frame(curso=microdados$CO_GRUPO, 
                                             respostas=microdados$DS_VT_ACE_OCE)
                
                # passo 1: filtrar o curso e apenas os alunos que responderam
                dados_respostas %>% 
                  filter(curso==codigo_grupo & respostas != " ") -> dados_respostas
                
                #print(dados_respostas)

                # passo 2: definindo a entrada para as funcoes de TRI
                sapply(dados_respostas$respostas, transforma) %>%
                        t %>% as.data.frame %>%
                        select_if(~ length(unique(.)) > 1) -> dados_para_ltm

                # ajusta o modelo com 1 parametro
                fit1 <- ltm::rasch(dados_para_ltm, 
                                   constraint = cbind(ncol(dados_para_ltm) + 1, 1))
                aic_fit1 = AIC(fit1)
                # ajusta o modelo com 2 parametros
                fit2 <- tryCatch(expr={ltm::rasch(dados_para_ltm)}, 
                                 warning = function(w){ltm::rasch(dados_para_ltm, 
                                                                  constraint = cbind(ncol(dados_para_ltm) + 1, 1))})
                
                area_enquadramento = dicionario %>% 
                  dplyr::filter(Codigo == toString(codigo_grupo))
                
                nome_area = toString(area_enquadramento$Area_enquadramento[1])
                
                if(AIC(fit1) < AIC(fit2)){
                        c = coef(fit1, prob = TRUE, order = TRUE)
                        hard_questions[[nome_area[1]]] <- c[c[,3]<=probability,] %>% 
                          rownames %>% 
                          as.vector #probabilidade de um estudante medio responder  
                } else{
                        c = coef(fit2, prob = TRUE, order = TRUE) 
                        hard_questions[[nome_area[1]]] <- c[c[,3]<=probability,] %>% 
                          rownames %>% 
                          as.vector #probabilidade de um estudante medio responder  
                }
                
                cont = cont+1
        }
        
        return(hard_questions)
}


# passo 0: filtrar ies (codigo da ufersa e 589)
microdados_enade_fixo %>% filter(., CO_IES==589) -> microdados_enade

mais_dificeis(microdados_enade, grupos, probability = 0.4)
## $AGRONOMIA
## [1] "V11" "V7"  "V22" "V12"
## 
## $`MEDICINA VETERINÁRIA`
## [1] "V9"  "V6"  "V7"  "V8"  "V25" "V15" "V13"
## 
## $ZOOTECNIA
## [1] "V14" "V17" "V19" "V13" "V21" "V18" "V1"  "V12"
## 
## $`ENGENHARIA DE PRODUÇÃO`
##  [1] "V3"  "V17" "V6"  "V1"  "V12" "V14" "V25" "V18" "V19" "V22"
## 
## $`ENGENHARIA MECÂNICA`
##  [1] "V27" "V22" "V6"  "V23" "V19" "V3"  "V16" "V8"  "V25" "V5"  "V12" "V7" 
## [13] "V18"
## 
## $`ENGENHARIA FLORESTAL`
##  [1] "V14" "V26" "V10" "V8"  "V24" "V22" "V15" "V7"  "V16" "V1"  "V18" "V25"
## [13] "V13"
## 
## $`ENGENHARIA CIVIL`
## [1] "V11" "V26" "V18" "V7"  "V25" "V27" "V20"
## 
## $`ENGENHARIA QUÍMICA`
## [1] "V3"  "V20" "V6"  "V25" "V9"  "V15" "V21" "V22"
## 
## $`ENGENHARIA ELÉTRICA`
##  [1] "V7"  "V22" "V26" "V5"  "V10" "V27" "V11" "V19" "V24" "V18" "V21" "V2" 
## [13] "V4"  "V16" "V12" "V15"
## 
## $`ENGENHARIA DA COMPUTAÇÃO`
## [1] "V17" "V3"  "V20" "V16" "V25" "V11" "V19" "V10" "V7" 
## 
## $`ENGENHARIA AMBIENTAL`
##  [1] "V2"  "V6"  "V24" "V14" "V19" "V1"  "V9"  "V3"  "V10" "V12"