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.
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
Modelo de Rasch
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
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
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.
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"))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
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
## 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
## [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
## 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
## [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.
##
## 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
## 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
## [1] "V12" "V11" "V7" "V22"
##
## 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
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"