Organizando os dados para 2011

Eu fiz algumas escolhas aqui

sf::sf_use_s2(FALSE)

biomes_br %>%
  filter(name_biome == "Caatinga") -> biomes_caat

mun_brasil[biomes_caat,] -> mun_cat #Brazilian municipaities with caatinga forest

as.factor(mun_cat$code_muni)-> mun_cat$code_muni

censo_escolar %>%
  mutate(across(.cols = c(2:10), .fns = as.factor)) %>%
  right_join(y = mun_cat, by = c("id_municipio" = "code_muni", "sigla_uf"="abbrev_state")) %>% 
  filter(ano=="2011") %>% # retirando a pandemia
  filter(tipo_localizacao=="2") %>% #escola rural
  filter(tipo_situacao_funcionamento=="1") %>% 
  filter(rede!="4") %>% 
  select(2:10, local_funcionamento_predio_escolar, agua_filtrada, agua_inexistente,
           energia_inexistente, esgoto_inexistente, banheiro_fora_predio, banheiro_dentro_predio,
           banheiro_educacao_infantil, banheiro_pne, bercario, biblioteca, 
           cozinha, laboratorio_ciencias, laboratorio_informatica, 
           parque_infantil, quadra_esportes, sala_diretoria, sala_professor, sala_atendimento_especial,
           dependencia_pne, equipamento_computador, equipamento_copiadora,
           equipamento_impressora, equipamento_dvd,equipamento_tv,
           internet, alimentacao, -tipo_categoria_escola_privada,
           etapa_ensino_infantil_creche, etapa_ensino_fundamental, etapa_ensino_medio) %>% 
  #filter(is.na(etapa_ensino_infantil_creche)) %>% glimpse #59 rows are NA and there NA in both F and M
  drop_na() %>% 
  dplyr::select(4, 9:38) %>% 
  mutate( banheiro_full=case_when(
    banheiro_fora_predio==1 ~ 1,
    banheiro_dentro_predio == 1 ~ 1,
    banheiro_fora_predio==0 & banheiro_dentro_predio == 0 ~ 0,
    banheiro_fora_predio==0 & banheiro_dentro_predio == 1 ~ 1,
    banheiro_fora_predio==1 & banheiro_dentro_predio == 0 ~ 1,
  ),
  levels_schools=case_when(
    etapa_ensino_infantil_creche==1 & etapa_ensino_fundamental==0 & etapa_ensino_medio==0 ~ "inf",
    etapa_ensino_infantil_creche==0 & etapa_ensino_fundamental==1 & etapa_ensino_medio==0 ~ "school_F",
    etapa_ensino_infantil_creche==0 & etapa_ensino_fundamental==0 & etapa_ensino_medio==1 ~ "school_M",
    etapa_ensino_infantil_creche==1 & etapa_ensino_fundamental==1 & etapa_ensino_medio==0 ~ "inf_F",
    etapa_ensino_infantil_creche==1 & etapa_ensino_fundamental==0 & etapa_ensino_medio==1 ~ "inf_M",
    etapa_ensino_infantil_creche==0 & etapa_ensino_fundamental==1 & etapa_ensino_medio==1 ~ "F_M",
    etapa_ensino_infantil_creche==1 & etapa_ensino_fundamental==1 & etapa_ensino_medio==1 ~ "inf_F_M",
    etapa_ensino_infantil_creche==0 & etapa_ensino_fundamental==0 & etapa_ensino_medio==0 ~ "only_0"
  ),
  to_group=case_when(
    levels_schools=="inf" ~ "c_ber",
    levels_schools=="school_F" ~ "s_ber",
    levels_schools=="school_M" ~ "s_ber",
    levels_schools=="inf_F" ~ "c_ber",
    levels_schools=="inf_M" ~ "c_ber",
    levels_schools=="F_M" ~ "s_ber",
    levels_schools=="inf_F_M" ~ "c_ber",
    levels_schools=="only_0" ~ "only_0",
  ),
  across(.cols=c(levels_schools, to_group), .fns=as.factor)) %>% 
  dplyr::select(-etapa_ensino_infantil_creche, -etapa_ensino_fundamental, -etapa_ensino_medio,
                -banheiro_fora_predio, -banheiro_dentro_predio) %>% 
  group_by(to_group, .add = TRUE) %>% 
  #summarise(fre1=sum(length(id_escola)))
  group_split()->data_list

data_list[[1]] %>% # com coluna berçario
  dplyr::select(id_escola, levels_schools, everything(), -to_group) %>% 
  glimpse ->infantil_schools
## Rows: 5,253
## Columns: 28
## $ id_escola                          <fct> 24043320, 24017892, 26066971, 22079…
## $ levels_schools                     <fct> inf_F, inf, inf_F, inf_F, inf_F, in…
## $ local_funcionamento_predio_escolar <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ agua_filtrada                      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ agua_inexistente                   <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ energia_inexistente                <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ esgoto_inexistente                 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ banheiro_educacao_infantil         <int> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ banheiro_pne                       <int> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,…
## $ bercario                           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ biblioteca                         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ cozinha                            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ laboratorio_ciencias               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ laboratorio_informatica            <int> 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0,…
## $ parque_infantil                    <int> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,…
## $ quadra_esportes                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,…
## $ sala_diretoria                     <int> 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1,…
## $ sala_professor                     <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,…
## $ sala_atendimento_especial          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ dependencia_pne                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_computador             <int> 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,…
## $ equipamento_copiadora              <int> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,…
## $ equipamento_impressora             <int> 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0,…
## $ equipamento_dvd                    <int> 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0,…
## $ equipamento_tv                     <int> 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,…
## $ internet                           <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,…
## $ alimentacao                        <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ banheiro_full                      <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
data_list[[2]] %>% # escolas que irei excluir
  glimpse
## Rows: 580
## Columns: 29
## $ id_escola                          <fct> 22014594, 25050516, 22049282, 29444…
## $ local_funcionamento_predio_escolar <int> 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,…
## $ agua_filtrada                      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ agua_inexistente                   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ energia_inexistente                <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ esgoto_inexistente                 <int> 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ banheiro_educacao_infantil         <int> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,…
## $ banheiro_pne                       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ bercario                           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ biblioteca                         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ cozinha                            <int> 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ laboratorio_ciencias               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ laboratorio_informatica            <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ parque_infantil                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ quadra_esportes                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,…
## $ sala_diretoria                     <int> 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0,…
## $ sala_professor                     <int> 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,…
## $ sala_atendimento_especial          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ dependencia_pne                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_computador             <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_copiadora              <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_impressora             <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_dvd                    <int> 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,…
## $ equipamento_tv                     <int> 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,…
## $ internet                           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ alimentacao                        <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ banheiro_full                      <dbl> 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1,…
## $ levels_schools                     <fct> only_0, only_0, only_0, only_0, onl…
## $ to_group                           <fct> only_0, only_0, only_0, only_0, onl…
data_list[[3]] %>% # escolas que posso retirar a coluna berçario
  dplyr::select(id_escola, levels_schools, everything(),
                -parque_infantil, -bercario, -banheiro_educacao_infantil, -to_group) %>%
  glimpse->F_M_schools
## Rows: 20,775
## Columns: 25
## $ id_escola                          <fct> 22111018, 25043048, 25047809, 22138…
## $ levels_schools                     <fct> school_F, school_F, school_F, schoo…
## $ local_funcionamento_predio_escolar <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,…
## $ agua_filtrada                      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ agua_inexistente                   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,…
## $ energia_inexistente                <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,…
## $ esgoto_inexistente                 <int> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,…
## $ banheiro_pne                       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ biblioteca                         <int> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,…
## $ cozinha                            <int> 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,…
## $ laboratorio_ciencias               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ laboratorio_informatica            <int> 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0,…
## $ quadra_esportes                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ sala_diretoria                     <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,…
## $ sala_professor                     <int> 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,…
## $ sala_atendimento_especial          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ dependencia_pne                    <int> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_computador             <int> 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,…
## $ equipamento_copiadora              <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_impressora             <int> 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,…
## $ equipamento_dvd                    <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,…
## $ equipamento_tv                     <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,…
## $ internet                           <int> 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,…
## $ alimentacao                        <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ banheiro_full                      <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,…

Como a ideia aqui é repetir exatamente o que o Soares fez, eu utilizei as variáveis de matrícula como uma forma de separar as escolas quanto aos seus níveis (infantil, fundamental e médio). NO entanto, descobri que existem escolas onde nessas três categorias o valor é 0:

etapa_ensino_infantil_creche==0 & etapa_ensino_fundamental==0 & etapa_ensino_medio==0 ~ "only_0"

Ao todo, dá um valor menor que 600 escolas. Então eu resolvi removê-las. Essas escolas são provavelmente, escolas profissionalizantes , EJA, etc.

Como Luke sugeriu, eu separei as escolas em infantil e Fundamental/Médio. Os valores eram, respectivamente, 5253 e 20775 escolas. E rodei um modelo irt de 2 parametros para cada um desses grupos.

2pl irt model for the “infantil” schools (2011)

Comecei retirando a variável alimentação, uma vez que ela não apresenta variação (todas as escolas tem uma mesma resposta já que são públicas).

infantil_schools %>%
  select(-alimentacao) %>% glimpse->infantil_schools
## Rows: 5,253
## Columns: 27
## $ id_escola                          <fct> 24043320, 24017892, 26066971, 22079…
## $ levels_schools                     <fct> inf_F, inf, inf_F, inf_F, inf_F, in…
## $ local_funcionamento_predio_escolar <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ agua_filtrada                      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ agua_inexistente                   <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ energia_inexistente                <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ esgoto_inexistente                 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ banheiro_educacao_infantil         <int> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ banheiro_pne                       <int> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,…
## $ bercario                           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ biblioteca                         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ cozinha                            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ laboratorio_ciencias               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ laboratorio_informatica            <int> 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0,…
## $ parque_infantil                    <int> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,…
## $ quadra_esportes                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,…
## $ sala_diretoria                     <int> 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1,…
## $ sala_professor                     <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,…
## $ sala_atendimento_especial          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ dependencia_pne                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_computador             <int> 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0,…
## $ equipamento_copiadora              <int> 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,…
## $ equipamento_impressora             <int> 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0,…
## $ equipamento_dvd                    <int> 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0,…
## $ equipamento_tv                     <int> 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0,…
## $ internet                           <int> 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,…
## $ banheiro_full                      <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…

m_2pl_infantil_schools <- mirt(infantil_schools[,c(-1:-2)], 1, itemtype = "2PL", verbose = T) 
## 
Iteration: 1, Log-Lik: -37741.553, Max-Change: 2.41415
Iteration: 2, Log-Lik: -34776.486, Max-Change: 1.22362
Iteration: 3, Log-Lik: -34328.465, Max-Change: 0.53468
Iteration: 4, Log-Lik: -34150.003, Max-Change: 0.33718
Iteration: 5, Log-Lik: -34071.177, Max-Change: 0.24990
Iteration: 6, Log-Lik: -34031.219, Max-Change: 0.16330
Iteration: 7, Log-Lik: -34011.606, Max-Change: 0.14091
Iteration: 8, Log-Lik: -34003.457, Max-Change: 0.11953
Iteration: 9, Log-Lik: -33999.070, Max-Change: 0.08688
Iteration: 10, Log-Lik: -33997.370, Max-Change: 0.07381
Iteration: 11, Log-Lik: -33995.102, Max-Change: 0.04304
Iteration: 12, Log-Lik: -33994.077, Max-Change: 0.03673
Iteration: 13, Log-Lik: -33993.607, Max-Change: 0.03048
Iteration: 14, Log-Lik: -33993.227, Max-Change: 0.02031
Iteration: 15, Log-Lik: -33993.027, Max-Change: 0.01489
Iteration: 16, Log-Lik: -33992.824, Max-Change: 0.00745
Iteration: 17, Log-Lik: -33992.800, Max-Change: 0.00597
Iteration: 18, Log-Lik: -33992.781, Max-Change: 0.00383
Iteration: 19, Log-Lik: -33992.765, Max-Change: 0.00140
Iteration: 20, Log-Lik: -33992.758, Max-Change: 0.00128
Iteration: 21, Log-Lik: -33992.753, Max-Change: 0.00117
Iteration: 22, Log-Lik: -33992.738, Max-Change: 0.00033
Iteration: 23, Log-Lik: -33992.738, Max-Change: 0.00030
Iteration: 24, Log-Lik: -33992.737, Max-Change: 0.00027
Iteration: 25, Log-Lik: -33992.737, Max-Change: 0.00026
Iteration: 26, Log-Lik: -33992.736, Max-Change: 0.00130
Iteration: 27, Log-Lik: -33992.735, Max-Change: 0.00059
Iteration: 28, Log-Lik: -33992.735, Max-Change: 0.00028
Iteration: 29, Log-Lik: -33992.735, Max-Change: 0.00024
Iteration: 30, Log-Lik: -33992.735, Max-Change: 0.00117
Iteration: 31, Log-Lik: -33992.734, Max-Change: 0.00064
Iteration: 32, Log-Lik: -33992.734, Max-Change: 0.00031
Iteration: 33, Log-Lik: -33992.734, Max-Change: 0.00021
Iteration: 34, Log-Lik: -33992.734, Max-Change: 0.00103
Iteration: 35, Log-Lik: -33992.734, Max-Change: 0.00096
Iteration: 36, Log-Lik: -33992.733, Max-Change: 0.00090
Iteration: 37, Log-Lik: -33992.733, Max-Change: 0.00091
Iteration: 38, Log-Lik: -33992.732, Max-Change: 0.00066
Iteration: 39, Log-Lik: -33992.732, Max-Change: 0.00035
Iteration: 40, Log-Lik: -33992.732, Max-Change: 0.00017
Iteration: 41, Log-Lik: -33992.732, Max-Change: 0.00067
Iteration: 42, Log-Lik: -33992.732, Max-Change: 0.00039
Iteration: 43, Log-Lik: -33992.732, Max-Change: 0.00016
Iteration: 44, Log-Lik: -33992.732, Max-Change: 0.00062
Iteration: 45, Log-Lik: -33992.732, Max-Change: 0.00048
Iteration: 46, Log-Lik: -33992.732, Max-Change: 0.00014
Iteration: 47, Log-Lik: -33992.732, Max-Change: 0.00012
Iteration: 48, Log-Lik: -33992.732, Max-Change: 0.00057
Iteration: 49, Log-Lik: -33992.732, Max-Change: 0.00028
Iteration: 50, Log-Lik: -33992.732, Max-Change: 0.00013
Iteration: 51, Log-Lik: -33992.732, Max-Change: 0.00010
Iteration: 52, Log-Lik: -33992.732, Max-Change: 0.00052
Iteration: 53, Log-Lik: -33992.731, Max-Change: 0.00049
Iteration: 54, Log-Lik: -33992.731, Max-Change: 0.00010

M2(m_2pl_infantil_schools) 
##             M2  df p      RMSEA   RMSEA_5  RMSEA_95      SRMSR       TLI
## stats 5736.199 275 0 0.06149153 0.0601054 0.0628766 0.04907296 0.8586996
##             CFI
## stats 0.8704746

A função M2 calcula o quanto o modelo se adapta aos dados por meio de vários índices diferentes. De maneira muito simples:

Assim, de modo geral, podemos considerar que o modelo tá ruim. Quase nenhum critério é atendido. Para entender melhor o que tá causando isso, eu tentei avaliar os itens (variáveis) que estão sendo usados.

Avaliando os itens

Isso pode ser feito de várias formas também. Aqui optei por usar todas que eu conhecia, começando pela análise de fator das variáveis (summary), e depois calculandos os valores de RMSEA para cada uma delas (itemfit). Por fim, também determinei a descriminação e dificuldades dos itens (coef).

summary(m_2pl_infantil_schools) # should be >50
##                                         F1      h2
## local_funcionamento_predio_escolar  0.5107 0.26083
## agua_filtrada                      -0.1112 0.01237
## agua_inexistente                   -0.2729 0.07446
## energia_inexistente                -0.6939 0.48154
## esgoto_inexistente                 -0.6018 0.36217
## banheiro_educacao_infantil          0.4061 0.16494
## banheiro_pne                        0.6474 0.41908
## bercario                            0.0897 0.00804
## biblioteca                          0.5689 0.32369
## cozinha                             0.5768 0.33275
## laboratorio_ciencias                0.6707 0.44988
## laboratorio_informatica             0.7983 0.63725
## parque_infantil                     0.4231 0.17900
## quadra_esportes                     0.7162 0.51300
## sala_diretoria                      0.6672 0.44518
## sala_professor                      0.5246 0.27516
## sala_atendimento_especial           0.7581 0.57475
## dependencia_pne                     0.5477 0.29998
## equipamento_computador              0.9069 0.82249
## equipamento_copiadora               0.6651 0.44232
## equipamento_impressora              0.9144 0.83608
## equipamento_dvd                     0.8933 0.79793
## equipamento_tv                      0.9204 0.84713
## internet                            0.8444 0.71297
## banheiro_full                       0.6845 0.46857
## 
## SS loadings:  10.742 
## Proportion Var:  0.43 
## 
## Factor correlations: 
## 
##    F1
## F1  1

itemfit(m_2pl_infantil_schools)
##                                  item    S_X2 df.S_X2 RMSEA.S_X2 p.S_X2
## 1  local_funcionamento_predio_escolar  41.850      10      0.025  0.000
## 2                       agua_filtrada  23.255      14      0.011  0.056
## 3                    agua_inexistente  56.526      13      0.025  0.000
## 4                 energia_inexistente  19.704       8      0.017  0.012
## 5                  esgoto_inexistente  43.432       9      0.027  0.000
## 6          banheiro_educacao_infantil  48.346      13      0.023  0.000
## 7                        banheiro_pne  16.290      12      0.008  0.178
## 8                            bercario  28.863      11      0.018  0.002
## 9                          biblioteca  59.590      12      0.027  0.000
## 10                            cozinha  23.550       9      0.018  0.005
## 11               laboratorio_ciencias   0.088       2      0.000  0.957
## 12            laboratorio_informatica 120.552      10      0.046  0.000
## 13                    parque_infantil  17.378      13      0.008  0.183
## 14                    quadra_esportes  24.339      11      0.015  0.011
## 15                     sala_diretoria  35.648      11      0.021  0.000
## 16                     sala_professor  56.990      12      0.027  0.000
## 17          sala_atendimento_especial  17.005      10      0.012  0.074
## 18                    dependencia_pne  47.701      13      0.023  0.000
## 19             equipamento_computador  34.090       8      0.025  0.000
## 20              equipamento_copiadora  29.573      12      0.017  0.003
## 21             equipamento_impressora  36.949       8      0.026  0.000
## 22                    equipamento_dvd  67.367       7      0.041  0.000
## 23                     equipamento_tv  37.404       7      0.029  0.000
## 24                           internet  77.968      10      0.036  0.000
## 25                      banheiro_full  48.688       8      0.031  0.000

params2PL_inf_schools <- coef(m_2pl_infantil_schools, IRTpars = TRUE, simplify = TRUE)
round(params2PL_inf_schools$items, 2)
##                                        a     b g u
## local_funcionamento_predio_escolar  1.01 -3.36 0 1
## agua_filtrada                      -0.19 14.80 0 1
## agua_inexistente                   -0.48 -4.77 0 1
## energia_inexistente                -1.64 -2.93 0 1
## esgoto_inexistente                 -1.28 -3.23 0 1
## banheiro_educacao_infantil          0.76  3.45 0 1
## banheiro_pne                        1.45  2.89 0 1
## bercario                            0.15 28.97 0 1
## biblioteca                          1.18  2.14 0 1
## cozinha                             1.20 -3.28 0 1
## laboratorio_ciencias                1.54  5.25 0 1
## laboratorio_informatica             2.26  0.77 0 1
## parque_infantil                     0.79  4.11 0 1
## quadra_esportes                     1.75  2.23 0 1
## sala_diretoria                      1.52  0.10 0 1
## sala_professor                      1.05  1.85 0 1
## sala_atendimento_especial           1.98  2.70 0 1
## dependencia_pne                     1.11  3.09 0 1
## equipamento_computador              3.66  0.16 0 1
## equipamento_copiadora               1.52  1.81 0 1
## equipamento_impressora              3.84  0.35 0 1
## equipamento_dvd                     3.38 -0.11 0 1
## equipamento_tv                      4.01 -0.22 0 1
## internet                            2.68  1.66 0 1
## banheiro_full                       1.60 -2.95 0 1

A análise de fator mostra os valores de F1 e h2. F1 indica o quanto cada item é relacionado com a variável latente (acima de 0.5 é bom). E h2 mostra a propoção que a variável explica da variável latente. Em nosso caso, os itens: agua_filtrada, agua_inexistente, banheiro_educacao_infantil, bercario, parque_infantil apresentam valor abaixo de 0.5. Principalmente, os itens: agua_filtrada, agua_inexistente, bercario, já que eles também tem uma baixíssima variância (h2).

A análise de cada item separadamente mostrou resultados um pouco diferentes. Para essa análise, um item se encaixe bem no modelo se S_X2 e RMSEA.S_X2 forem pequenos (RMSEA.S_X2<0.08 é aceitável) e p.S_X2 não significante (> 0.05). Nossos resultados demonstram que embora todas os nossos valores estejam dentro do RMSEA aceitável, quase nenhuma variável deu não siginificante. Exceto agua_filtrada, banheiro_pne, laboratorio_ciencias, parque_infantil e sala_atendimento_especial todas as outras deram significantes.

Por fim, a última análise foi sobre a discriminação (a) e dificuldade de cada item (b). A discriminação corresponde a capacidade do item de discriminar os indivíduos (escolas) com diferentes níveis do trait (infraestrutura). Enquanto que a dificuldade é onde o item está na escala da variável latente. De maneira mais simples, é a posícção mais informativa do item na escala/curva da variável latente. De maneira geral, baixos valores de a indicam que a variável não contribui muito enquanto que se b for muito discrepante, indica que aquela variável tá puxando a curva para um lado. nossos resultados mostram que os mesmos itens da análise de fator estão com baixa discrminação (agua_filtrada, agua_inexistente, banheiro_educacao_infantil, bercario, parque_infantil). Além disso, agua_filtrada e bercario tem valores exorbitantes de dificuldade.

Com tudo isso, pode ser difícil interpretar qual variável está prejudicando o modelo. A significância do valor de p nesse caso, pode ser devido a i) poucos dados, ii) x2 ser ser sensitivo a misfit local e iii) existência de outros fatores que modificam os itens. Acredito que é mais fácil ter acontecido isso pelas razões i e ii. Mas a terceira opção é válida visto que não controlamos as escolas de acordo com a complexidade.

Refazendo o modelo

infantil_schools %>% 
dplyr::select(-agua_filtrada, -agua_inexistente, -banheiro_educacao_infantil, -bercario,
              -parque_infantil)->reshape_data_inft_schools

m_2pl_infantil_schools_02 <- mirt(reshape_data_inft_schools[,c(-1:-2)], 1, itemtype = "2PL", verbose = T) 
## 
Iteration: 1, Log-Lik: -31678.297, Max-Change: 2.30059
Iteration: 2, Log-Lik: -29206.478, Max-Change: 0.90398
Iteration: 3, Log-Lik: -28805.410, Max-Change: 0.55005
Iteration: 4, Log-Lik: -28626.136, Max-Change: 0.30421
Iteration: 5, Log-Lik: -28554.036, Max-Change: 0.22425
Iteration: 6, Log-Lik: -28517.637, Max-Change: 0.17367
Iteration: 7, Log-Lik: -28499.606, Max-Change: 0.14060
Iteration: 8, Log-Lik: -28491.047, Max-Change: 0.10465
Iteration: 9, Log-Lik: -28485.966, Max-Change: 0.10356
Iteration: 10, Log-Lik: -28483.367, Max-Change: 0.07208
Iteration: 11, Log-Lik: -28481.713, Max-Change: 0.07018
Iteration: 12, Log-Lik: -28480.877, Max-Change: 0.05012
Iteration: 13, Log-Lik: -28480.303, Max-Change: 0.03593
Iteration: 14, Log-Lik: -28479.956, Max-Change: 0.02989
Iteration: 15, Log-Lik: -28479.749, Max-Change: 0.02174
Iteration: 16, Log-Lik: -28479.500, Max-Change: 0.01261
Iteration: 17, Log-Lik: -28479.469, Max-Change: 0.01069
Iteration: 18, Log-Lik: -28479.445, Max-Change: 0.00930
Iteration: 19, Log-Lik: -28479.376, Max-Change: 0.00114
Iteration: 20, Log-Lik: -28479.373, Max-Change: 0.00034
Iteration: 21, Log-Lik: -28479.373, Max-Change: 0.00163
Iteration: 22, Log-Lik: -28479.372, Max-Change: 0.00036
Iteration: 23, Log-Lik: -28479.372, Max-Change: 0.00028
Iteration: 24, Log-Lik: -28479.372, Max-Change: 0.00137
Iteration: 25, Log-Lik: -28479.371, Max-Change: 0.00074
Iteration: 26, Log-Lik: -28479.371, Max-Change: 0.00037
Iteration: 27, Log-Lik: -28479.371, Max-Change: 0.00021
Iteration: 28, Log-Lik: -28479.371, Max-Change: 0.00104
Iteration: 29, Log-Lik: -28479.371, Max-Change: 0.00020
Iteration: 30, Log-Lik: -28479.371, Max-Change: 0.00088
Iteration: 31, Log-Lik: -28479.370, Max-Change: 0.00073
Iteration: 32, Log-Lik: -28479.370, Max-Change: 0.00037
Iteration: 33, Log-Lik: -28479.370, Max-Change: 0.00019
Iteration: 34, Log-Lik: -28479.370, Max-Change: 0.00075
Iteration: 35, Log-Lik: -28479.370, Max-Change: 0.00033
Iteration: 36, Log-Lik: -28479.370, Max-Change: 0.00017
Iteration: 37, Log-Lik: -28479.370, Max-Change: 0.00069
Iteration: 38, Log-Lik: -28479.370, Max-Change: 0.00030
Iteration: 39, Log-Lik: -28479.370, Max-Change: 0.00015
Iteration: 40, Log-Lik: -28479.370, Max-Change: 0.00063
Iteration: 41, Log-Lik: -28479.370, Max-Change: 0.00027
Iteration: 42, Log-Lik: -28479.369, Max-Change: 0.00013
Iteration: 43, Log-Lik: -28479.369, Max-Change: 0.00057
Iteration: 44, Log-Lik: -28479.369, Max-Change: 0.00023
Iteration: 45, Log-Lik: -28479.369, Max-Change: 0.00012
Iteration: 46, Log-Lik: -28479.369, Max-Change: 0.00052
Iteration: 47, Log-Lik: -28479.369, Max-Change: 0.00019
Iteration: 48, Log-Lik: -28479.369, Max-Change: 0.00010

M2(m_2pl_infantil_schools_02) 
##             M2  df p      RMSEA    RMSEA_5   RMSEA_95      SRMSR       TLI
## stats 4511.782 170 0 0.06973442 0.06797802 0.07149294 0.05297804 0.8768078
##             CFI
## stats 0.8897754

#summary(m_2pl_infantil_schools_02) # should be >50
#itemfit(m_2pl_infantil_schools_02)
#params2PL_inf_schools_02 <- coef(m_2pl_infantil_schools_02, IRTpars = TRUE, simplify = TRUE)
#round(params2PL_inf_schools_02$items, 2)
#personfitPlot(m_2pl_infantil_schools_02)

anova(m_2pl_infantil_schools, m_2pl_infantil_schools_02)
##                                AIC    SABIC       HQ      BIC    logLik
## m_2pl_infantil_schools    68085.46 68254.91 68200.25 68413.79 -33992.73
## m_2pl_infantil_schools_02 57038.74 57174.29 57130.57 57301.40 -28479.37
##                                  X2       df p
## m_2pl_infantil_schools                        
## m_2pl_infantil_schools_02 11026.724 32505846 1

O modelo refeito é melhor, mas sem uma real diferença estatística.

2pl irt model for the “fundamenal” and “médio” schools (2011)

F_M_schools %>%
  select(-alimentacao) %>% 
  glimpse -> F_M_schools
## Rows: 20,775
## Columns: 24
## $ id_escola                          <fct> 22111018, 25043048, 25047809, 22138…
## $ levels_schools                     <fct> school_F, school_F, school_F, schoo…
## $ local_funcionamento_predio_escolar <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,…
## $ agua_filtrada                      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ agua_inexistente                   <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,…
## $ energia_inexistente                <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,…
## $ esgoto_inexistente                 <int> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,…
## $ banheiro_pne                       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ biblioteca                         <int> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,…
## $ cozinha                            <int> 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,…
## $ laboratorio_ciencias               <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ laboratorio_informatica            <int> 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0,…
## $ quadra_esportes                    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ sala_diretoria                     <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,…
## $ sala_professor                     <int> 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,…
## $ sala_atendimento_especial          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ dependencia_pne                    <int> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_computador             <int> 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,…
## $ equipamento_copiadora              <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ equipamento_impressora             <int> 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0,…
## $ equipamento_dvd                    <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,…
## $ equipamento_tv                     <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0,…
## $ internet                           <int> 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,…
## $ banheiro_full                      <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,…

m_2pl_FM_schools <- mirt(F_M_schools[,c(-1:-2)], 1, itemtype = "2PL", verbose = T) 
## 
Iteration: 1, Log-Lik: -134487.306, Max-Change: 2.64716
Iteration: 2, Log-Lik: -118088.585, Max-Change: 1.06315
Iteration: 3, Log-Lik: -114647.767, Max-Change: 0.70062
Iteration: 4, Log-Lik: -113477.298, Max-Change: 0.81727
Iteration: 5, Log-Lik: -112709.001, Max-Change: 0.45710
Iteration: 6, Log-Lik: -112203.691, Max-Change: 0.26833
Iteration: 7, Log-Lik: -112054.498, Max-Change: 0.15843
Iteration: 8, Log-Lik: -111963.513, Max-Change: 0.16453
Iteration: 9, Log-Lik: -111916.324, Max-Change: 0.08513
Iteration: 10, Log-Lik: -111890.830, Max-Change: 0.06931
Iteration: 11, Log-Lik: -111878.697, Max-Change: 0.08420
Iteration: 12, Log-Lik: -111869.551, Max-Change: 0.04423
Iteration: 13, Log-Lik: -111863.515, Max-Change: 0.04500
Iteration: 14, Log-Lik: -111860.478, Max-Change: 0.02985
Iteration: 15, Log-Lik: -111857.803, Max-Change: 0.02532
Iteration: 16, Log-Lik: -111853.700, Max-Change: 0.01155
Iteration: 17, Log-Lik: -111852.957, Max-Change: 0.00752
Iteration: 18, Log-Lik: -111852.366, Max-Change: 0.00692
Iteration: 19, Log-Lik: -111850.142, Max-Change: 0.00542
Iteration: 20, Log-Lik: -111850.022, Max-Change: 0.00395
Iteration: 21, Log-Lik: -111849.917, Max-Change: 0.00310
Iteration: 22, Log-Lik: -111849.699, Max-Change: 0.00549
Iteration: 23, Log-Lik: -111849.634, Max-Change: 0.00193
Iteration: 24, Log-Lik: -111849.599, Max-Change: 0.00156
Iteration: 25, Log-Lik: -111849.552, Max-Change: 0.00134
Iteration: 26, Log-Lik: -111849.530, Max-Change: 0.00124
Iteration: 27, Log-Lik: -111849.511, Max-Change: 0.00116
Iteration: 28, Log-Lik: -111849.434, Max-Change: 0.00141
Iteration: 29, Log-Lik: -111849.427, Max-Change: 0.00104
Iteration: 30, Log-Lik: -111849.417, Max-Change: 0.00130
Iteration: 31, Log-Lik: -111849.411, Max-Change: 0.00122
Iteration: 32, Log-Lik: -111849.403, Max-Change: 0.00032
Iteration: 33, Log-Lik: -111849.402, Max-Change: 0.00025
Iteration: 34, Log-Lik: -111849.401, Max-Change: 0.00021
Iteration: 35, Log-Lik: -111849.400, Max-Change: 0.00020
Iteration: 36, Log-Lik: -111849.399, Max-Change: 0.00019
Iteration: 37, Log-Lik: -111849.396, Max-Change: 0.00074
Iteration: 38, Log-Lik: -111849.394, Max-Change: 0.00065
Iteration: 39, Log-Lik: -111849.392, Max-Change: 0.00059
Iteration: 40, Log-Lik: -111849.389, Max-Change: 0.00071
Iteration: 41, Log-Lik: -111849.387, Max-Change: 0.00016
Iteration: 42, Log-Lik: -111849.387, Max-Change: 0.00046
Iteration: 43, Log-Lik: -111849.386, Max-Change: 0.00011
Iteration: 44, Log-Lik: -111849.386, Max-Change: 0.00039
Iteration: 45, Log-Lik: -111849.385, Max-Change: 0.00067
Iteration: 46, Log-Lik: -111849.385, Max-Change: 0.00020
Iteration: 47, Log-Lik: -111849.385, Max-Change: 0.00043
Iteration: 48, Log-Lik: -111849.385, Max-Change: 0.00022
Iteration: 49, Log-Lik: -111849.384, Max-Change: 0.00018
Iteration: 50, Log-Lik: -111849.384, Max-Change: 0.00042
Iteration: 51, Log-Lik: -111849.384, Max-Change: 0.00010

M2(m_2pl_FM_schools) 
##             M2  df p      RMSEA    RMSEA_5   RMSEA_95     SRMSR       TLI
## stats 15739.37 209 0 0.05980778 0.05901623 0.06060026 0.0498329 0.9292922
##             CFI
## stats 0.9360263

O TLI, CFI e SRMSR estão bons e o RMSEA está dentro do aceitável.

Avaliando os itens

summary(m_2pl_FM_schools) # should be >50
##                                        F1      h2
## local_funcionamento_predio_escolar  0.724 0.52398
## agua_filtrada                      -0.039 0.00152
## agua_inexistente                   -0.194 0.03772
## energia_inexistente                -0.680 0.46299
## esgoto_inexistente                 -0.718 0.51536
## banheiro_pne                        0.769 0.59072
## biblioteca                          0.776 0.60293
## cozinha                             0.594 0.35285
## laboratorio_ciencias                0.853 0.72713
## laboratorio_informatica             0.862 0.74276
## quadra_esportes                     0.765 0.58570
## sala_diretoria                      0.790 0.62469
## sala_professor                      0.625 0.39034
## sala_atendimento_especial           0.755 0.56989
## dependencia_pne                     0.738 0.54498
## equipamento_computador              0.922 0.85052
## equipamento_copiadora               0.745 0.55500
## equipamento_impressora              0.940 0.88346
## equipamento_dvd                     0.938 0.88003
## equipamento_tv                      0.941 0.88528
## internet                            0.896 0.80279
## banheiro_full                       0.792 0.62783
## 
## SS loadings:  12.758 
## Proportion Var:  0.58 
## 
## Factor correlations: 
## 
##    F1
## F1  1
itemfit(m_2pl_FM_schools)
##                                  item     S_X2 df.S_X2 RMSEA.S_X2 p.S_X2
## 1  local_funcionamento_predio_escolar  244.022       8      0.038  0.000
## 2                       agua_filtrada   71.452      14      0.014  0.000
## 3                    agua_inexistente  161.415      15      0.022  0.000
## 4                 energia_inexistente   50.695      12      0.012  0.000
## 5                  esgoto_inexistente 1040.334      11      0.067  0.000
## 6                        banheiro_pne   32.562      13      0.009  0.002
## 7                          biblioteca   27.214      12      0.008  0.007
## 8                             cozinha  246.288      12      0.031  0.000
## 9                laboratorio_ciencias   22.693       9      0.009  0.007
## 10            laboratorio_informatica  114.026      10      0.022  0.000
## 11                    quadra_esportes   25.179      13      0.007  0.022
## 12                     sala_diretoria  103.687      11      0.020  0.000
## 13                     sala_professor  130.183      13      0.021  0.000
## 14          sala_atendimento_especial   48.893      13      0.012  0.000
## 15                    dependencia_pne   45.371      13      0.011  0.000
## 16             equipamento_computador   90.298       9      0.021  0.000
## 17              equipamento_copiadora   51.427      12      0.013  0.000
## 18             equipamento_impressora   49.855       8      0.016  0.000
## 19                    equipamento_dvd  402.290       8      0.049  0.000
## 20                     equipamento_tv  224.435       8      0.036  0.000
## 21                           internet   71.239      11      0.016  0.000
## 22                      banheiro_full  360.320       8      0.046  0.000
params2PL_FM_schools <- coef(m_2pl_FM_schools, IRTpars = TRUE, simplify = TRUE)
round(params2PL_FM_schools$items, 2)
##                                        a     b g u
## local_funcionamento_predio_escolar  1.79 -2.50 0 1
## agua_filtrada                      -0.07 42.67 0 1
## agua_inexistente                   -0.34 -5.04 0 1
## energia_inexistente                -1.58 -1.79 0 1
## esgoto_inexistente                 -1.76 -2.03 0 1
## banheiro_pne                        2.04  2.62 0 1
## biblioteca                          2.10  1.93 0 1
## cozinha                             1.26 -2.09 0 1
## laboratorio_ciencias                2.78  3.23 0 1
## laboratorio_informatica             2.89  1.19 0 1
## quadra_esportes                     2.02  2.45 0 1
## sala_diretoria                      2.20  0.67 0 1
## sala_professor                      1.36  1.63 0 1
## sala_atendimento_especial           1.96  3.07 0 1
## dependencia_pne                     1.86  2.73 0 1
## equipamento_computador              4.06  0.60 0 1
## equipamento_copiadora               1.90  2.04 0 1
## equipamento_impressora              4.69  0.76 0 1
## equipamento_dvd                     4.61  0.44 0 1
## equipamento_tv                      4.73  0.34 0 1
## internet                            3.43  1.68 0 1
## banheiro_full                       2.21 -2.06 0 1

A análise de fator e a discriminação deram bons resultados para todos os itens. O X2 deu bastante alto. Bastante mesmo. E nenhum item foi não significativo, de modo que tivemos o mesmo problema.

Avaliando os individuos

Essa é a parte que mais importa. É definitivamente, a infraestrutura das escolas.

ind_ability_2pl_FM<-personfit(m_2pl_FM_schools) 
ind_ability_2pl_FM %>% 
  glimpse()
## Rows: 20,775
## Columns: 5
## $ outfit   <dbl> 0.0394305, 1.2637153, 0.7351119, 0.0394305, 0.7220451, 0.3744…
## $ z.outfit <dbl> -0.92791190, 0.64353165, 0.26458664, -0.92791190, 0.25317505,…
## $ infit    <dbl> 0.1045913, 1.9187621, 1.5089868, 0.1045913, 1.3225306, 1.0646…
## $ z.infit  <dbl> -1.3291368, 1.1559920, 1.2163528, -1.3291368, 0.8727072, 0.34…
## $ Zh       <dbl> 0.85401298, -1.05497940, -0.74765176, 0.85401298, -0.59632189…

personfitPlot(m_2pl_FM_schools)


plot_histogram(ind_ability_2pl_FM$Zh)

A abilidade do indivíduo é traduzida em três medidas: z.outfit, z.infit e zh. Outfit é quando a abilidade é estimada sendo sensível a respostas sem padrões. Infit é quando a abilidade é estimada e não é sensível a alterações de padrões. E zh é a escala de infraestrutura escolar, propriamente falando.

De maneira geral, a primeira imagem mostra que a maioria da “abilidade” das escolas foram capturadas pelo modelo. No entanto, é importante a gente o segundo gráfico para notar que existem escolas com uma infraestrutura muito negativa. Isso pode significar realmente, a inexistência de infraestrutura. Mas também, pode ser devido a ausência de algumas respostas a itens específicos que tenham uma discriminação muito forte. Assim, antes de poder usar a escala, precisamos identificar melhor esses pontos.

Identificando as escolas

Para facilitar, escolhi arbitrariamente o intervalo de 2.0 para separar as escolas. Embora, Soares tenha escolhido 4, aqui não temos o modelo refinado ainda. De modo que, usar uma sequência de 2.0 vai facilitar entender o que uma escola tem ou deixa de ter para ser considerada com mais ou menos infraestrutura.

summary(ind_ability_2pl_FM$Zh)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -11.43038  -0.31449   0.21065   0.09119   0.85401   1.31561
#mim -11.43038
#max 1.31
#median 0.21

seq(from = -11.43038, to = 1.31, by = 2)
## [1] -11.43038  -9.43038  -7.43038  -5.43038  -3.43038  -1.43038   0.56962


F_M_schools %>%
  cbind(ind_ability_2pl_FM$Zh) %>% 
  rename("zh"=`ind_ability_2pl_FM$Zh`) %>% 
  mutate(sequencia=case_when(
    zh >= -11.43038 & zh < -9.43037 ~ "negative_11_09",
    zh >= -9.43038 & zh < -7.43037 ~ "negative_09_07",
    zh >= -7.43038 & zh < -5.43037 ~ "negative_07_05",
    zh >= -5.43038 & zh < -3.43037 ~ "negative_05_03",
    zh >= -3.43038 & zh < -1.43037 ~ "negative_03_01",
    zh >= -1.43038 & zh < 0.56961 ~ "negative01_positive0.5",
    zh >= 0.56962 & zh < 1.315608 ~ "positive0.5_02")) %>% 
  group_by(sequencia) %>% 
  summarise(freq_id=sum(length(id_escola)))
## # A tibble: 7 × 2
##   sequencia              freq_id
##   <chr>                    <int>
## 1 negative01_positive0.5   10625
## 2 negative_03_01            1357
## 3 negative_05_03             222
## 4 negative_07_05              45
## 5 negative_09_07               9
## 6 negative_11_09               6
## 7 positive0.5_02            8511


# escolas de -11 a -9 de infraestrutura
F_M_schools %>%
  cbind(ind_ability_2pl_FM$Zh) %>% 
  rename("zh"=`ind_ability_2pl_FM$Zh`) %>% 
  mutate(sequencia=case_when(
    zh >= -11.43038 & zh < -9.43037 ~ "negative_11_09",
    zh >= -9.43038 & zh < -7.43037 ~ "negative_09_07",
    zh >= -7.43038 & zh < -5.43037 ~ "negative_07_05",
    zh >= -5.43038 & zh < -3.43037 ~ "negative_05_03",
    zh >= -3.43038 & zh < -1.43037 ~ "negative_03_01",
    zh >= -1.43038 & zh < 0.56961 ~ "negative01_positive0.5",
    zh >= 0.56962 & zh < 1.315608 ~ "positive0.5_02")) %>%
  filter(sequencia=="negative_11_09") %>% 
  glimpse
## Rows: 6
## Columns: 26
## $ id_escola                          <fct> 29401720, 23462345, 24074110, 26548…
## $ levels_schools                     <fct> school_F, school_M, school_F, schoo…
## $ local_funcionamento_predio_escolar <int> 1, 1, 1, 1, 0, 1
## $ agua_filtrada                      <int> 0, 0, 0, 0, 1, 1
## $ agua_inexistente                   <int> 0, 0, 1, 0, 0, 0
## $ energia_inexistente                <int> 0, 0, 0, 0, 0, 0
## $ esgoto_inexistente                 <int> 0, 0, 0, 0, 0, 0
## $ banheiro_pne                       <int> 0, 1, 1, 1, 0, 1
## $ biblioteca                         <int> 1, 0, 0, 1, 1, 1
## $ cozinha                            <int> 0, 0, 1, 0, 1, 1
## $ laboratorio_ciencias               <int> 1, 1, 1, 1, 1, 1
## $ laboratorio_informatica            <int> 1, 1, 1, 1, 1, 1
## $ quadra_esportes                    <int> 1, 0, 0, 0, 1, 1
## $ sala_diretoria                     <int> 0, 1, 1, 1, 1, 1
## $ sala_professor                     <int> 1, 1, 0, 1, 1, 1
## $ sala_atendimento_especial          <int> 1, 0, 1, 0, 1, 0
## $ dependencia_pne                    <int> 0, 1, 0, 1, 0, 1
## $ equipamento_computador             <int> 0, 1, 1, 1, 0, 1
## $ equipamento_copiadora              <int> 0, 1, 1, 1, 0, 1
## $ equipamento_impressora             <int> 0, 1, 1, 1, 0, 0
## $ equipamento_dvd                    <int> 1, 1, 1, 0, 0, 1
## $ equipamento_tv                     <int> 0, 1, 1, 0, 0, 1
## $ internet                           <int> 0, 1, 0, 0, 0, 1
## $ banheiro_full                      <dbl> 1, 0, 0, 1, 1, 0
## $ zh                                 <dbl> -10.811034, -10.163907, -9.496771, …
## $ sequencia                          <chr> "negative_11_09", "negative_11_09",…

# escolas de -9 a -7 de infraestrutura
F_M_schools %>%
  cbind(ind_ability_2pl_FM$Zh) %>% 
  rename("zh"=`ind_ability_2pl_FM$Zh`) %>% 
  mutate(sequencia=case_when(
    zh >= -11.43038 & zh < -9.43037 ~ "negative_11_09",
    zh >= -9.43038 & zh < -7.43037 ~ "negative_09_07",
    zh >= -7.43038 & zh < -5.43037 ~ "negative_07_05",
    zh >= -5.43038 & zh < -3.43037 ~ "negative_05_03",
    zh >= -3.43038 & zh < -1.43037 ~ "negative_03_01",
    zh >= -1.43038 & zh < 0.56961 ~ "negative01_positive0.5",
    zh >= 0.56962 & zh < 1.315608 ~ "positive0.5_02")) %>%
  filter(sequencia=="negative_09_07") %>% 
  glimpse
## Rows: 9
## Columns: 26
## $ id_escola                          <fct> 29397731, 26166470, 29040027, 29579…
## $ levels_schools                     <fct> school_F, school_F, school_F, schoo…
## $ local_funcionamento_predio_escolar <int> 1, 0, 1, 0, 1, 1, 1, 0, 1
## $ agua_filtrada                      <int> 1, 1, 0, 1, 1, 1, 1, 1, 1
## $ agua_inexistente                   <int> 0, 1, 0, 1, 0, 0, 0, 0, 0
## $ energia_inexistente                <int> 0, 0, 0, 0, 0, 0, 0, 1, 0
## $ esgoto_inexistente                 <int> 0, 1, 0, 1, 0, 1, 1, 1, 0
## $ banheiro_pne                       <int> 0, 0, 0, 0, 1, 0, 0, 0, 1
## $ biblioteca                         <int> 0, 0, 1, 0, 1, 0, 0, 0, 1
## $ cozinha                            <int> 0, 0, 0, 0, 0, 1, 0, 0, 1
## $ laboratorio_ciencias               <int> 1, 0, 1, 0, 1, 0, 0, 0, 1
## $ laboratorio_informatica            <int> 1, 0, 1, 0, 1, 1, 0, 0, 1
## $ quadra_esportes                    <int> 1, 0, 0, 0, 0, 1, 0, 0, 1
## $ sala_diretoria                     <int> 0, 0, 0, 0, 1, 1, 0, 0, 1
## $ sala_professor                     <int> 0, 0, 0, 0, 1, 0, 0, 0, 1
## $ sala_atendimento_especial          <int> 0, 0, 0, 0, 1, 0, 1, 0, 0
## $ dependencia_pne                    <int> 0, 0, 0, 0, 1, 0, 0, 0, 1
## $ equipamento_computador             <int> 1, 1, 0, 1, 0, 1, 0, 0, 1
## $ equipamento_copiadora              <int> 0, 0, 0, 0, 0, 0, 0, 0, 1
## $ equipamento_impressora             <int> 1, 1, 0, 0, 0, 0, 1, 0, 0
## $ equipamento_dvd                    <int> 0, 0, 0, 0, 1, 0, 0, 1, 1
## $ equipamento_tv                     <int> 1, 0, 0, 0, 1, 0, 0, 1, 0
## $ internet                           <int> 0, 0, 0, 0, 0, 1, 0, 0, 1
## $ banheiro_full                      <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 1
## $ zh                                 <dbl> -8.234387, -8.538319, -9.315584, -7…
## $ sequencia                          <chr> "negative_09_07", "negative_09_07",…

Das 20.775 escolas, 19.136 estão no quadrante superior (i.e. entre -1 e 2). É um número bem expressivo e indica que a maior parte das escolas da caatinga de ensino fundamental e médio estão em bons termos de infraeturura. No entanto, os outliers negativos podem ter um papel importante puxando a infraestrutura para baixo e homogeneizando a parte de cima. Buscando entender o que diferencia uma escolas de -11 da de uma 1.31, vamos avaliar resposta das variáveis em cada uma e como o modelo está levando em consideração.
As piores escolas em termos de infraestrutura vão de -11 até -9 e são 6. Segundo nossa análise de fator e a descriminação das variáveis, esperamos que computador, impressora, dvd, tv e internet sejam pontos importantes para determinar a infraestrutura. Note que para o soares, esse mesmo resultado foi encontrado também. A nossa pior escola (-11.430376) não apresentam esses materiais. Ela é a única escola que não apresenta prédio escolar próprio. Embora isso não seja uma variável usada por Soares e que não tenha valores altos de a e F1. Nesses dados, note que escolas que não tem acesso a água tem valores de (-9.496771) pois apresentam pc, dvd ,tv, etc.

As escolas de -9 a -7 são 9 ao todo. E o interessante aqui é mostrar que a escolas com -9.315584 tem até menos coisa que a escola -11 (note coluna 3 - terceiro glimpse). Isso se deve ao fato de que o modelo não consegue capturar essas diferenças muito largas. Isso fica mmais claro quando olhamos o gráfico do outfit novamente (veja acima). Até -2 o modelo consegue ser sensível a outliers. Mas acima disso, o nível de confiança do modelo decai pq ele deixa de se encaixar nos dados.

O Soares cria uma curva de informação para ajustar isso. Pelo que entendi, essa curva é para dar certeza ao leitor de que os pontos centrais tem maior chance de serem correspondidos pelo modelo enquanto que os pontos mais distantes (positivos e negativos) tem maior chance de erro.

Curva de informação

Até o momento, eu não consegui produzir essa curva. Acho que o lance tá em entender o que ele chama de informação (eixo y). Achava que poderia ser o F1 de cada variável, mas acho que não faz mais sentido. Próximo tentativa vai ser colocar o y como o acumulo da força de cada variável.

F_M_schools %>%
  cbind(ind_ability_2pl_FM$Zh) %>% 
  rename("zh"=`ind_ability_2pl_FM$Zh`) %>% 
  mutate(sequencia=case_when(
    zh >= -11.43038 & zh < -9.43037 ~ "negative_11_09",
    zh >= -9.43038 & zh < -7.43037 ~ "negative_09_07",
    zh >= -7.43038 & zh < -5.43037 ~ "negative_07_05",
    zh >= -5.43038 & zh < -3.43037 ~ "negative_05_03",
    zh >= -3.43038 & zh < -1.43037 ~ "negative_03_01",
    zh >= -1.43038 & zh < 0.56961 ~ "negative01_positive0.5",
    zh >= 0.56962 & zh < 1.315608 ~ "positive0.5_02")) %>%
  #filter(sequencia %in% c("negative_03_01", "negative01_positive0.5", "positive0.5_02")) %>% # isso faz com que eu removesse  282 escolas apenas
  mutate(zh_scaled= 50 + ((zh - median(zh)) / sd(zh)) * 10) %>% 
  glimpse->data_zh_FM


# Define a range of proficiency levels you want to analyze
proficiency_levels <- seq(min(data_zh_FM$zh_scaled), max(data_zh_FM$zh_scaled), length.out = 100)

# Calculate information for each proficiency level
information_curve <- data.frame(Proficiency = numeric(0), Information = numeric(0))

for (proficiency_level in proficiency_levels) {
  info <- fscores(m_2pl_FM_schools, pattern = proficiency_level)
  information_curve <- rbind(information_curve, data.frame(Proficiency = proficiency_level, Information = info))
}

ggplot(information_curve, aes(x = Proficiency, y = F1)) +
  geom_line() +
  xlab("School Proficiency on Infrastructure Scale") +
  ylab("Information") +
  ggtitle("Information Curve")