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.
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.
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.
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.
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.
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.
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.
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.
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")