Carregamento de Pacotes e Dados

# Carregamento dos pacotes necessários
library(haven)        # Para ler arquivos .sav
library(dplyr)        # Manipulação de dados
library(ggplot2)      # Visualização
library(broom)        # Para organizar resultados dos modelos
library(knitr)        # Para tabelas
library(purrr)        # Para programação funcional
library(tidyr)        # Para reorganização de dados
library(gridExtra)    # Para arranjar gráficos
# Carregamento da base de dados
dados <- read_sav("../2-base-de-analise/PISA2022_LATAM_resiliencia.sav")

# Remover casos com valores missing nas variáveis principais
dados_limpos <- dados %>%
  filter(!is.na(CNT) & !is.na(ICTEFFIC) & 
         !is.na(resil_math) & !is.na(resil_read) & !is.na(resil_scie))

# Verificação da estrutura dos dados
str(dados_limpos[c("CNT", "resil_math", "resil_read", "resil_scie", "ICTEFFIC")])
## tibble [5,866 × 5] (S3: tbl_df/tbl/data.frame)
##  $ CNT       : chr+lbl [1:5866] ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG, ARG...
##    ..@ label        : chr "Country code 3-character"
##    ..@ format.spss  : chr "A3"
##    ..@ display_width: int 3
##    ..@ labels       : Named chr [1:81] "MDA" "THA" "BRA" "FRA" ...
##    .. ..- attr(*, "names")= chr [1:81] "Republic of Moldova" "Thailand" "Brazil" "France" ...
##  $ resil_math: num [1:5866] 0 0 0 0 0 0 0 0 0 0 ...
##   ..- attr(*, "format.spss")= chr "F8.0"
##  $ resil_read: num [1:5866] 0 0 0 0 0 0 0 0 0 0 ...
##   ..- attr(*, "format.spss")= chr "F8.0"
##  $ resil_scie: num [1:5866] 0 0 0 0 0 0 0 0 0 0 ...
##   ..- attr(*, "format.spss")= chr "F8.0"
##  $ ICTEFFIC  : dbl+lbl [1:5866] -0.153,  0.244, -1.275, -1.091, -0.283, -1.222, -0.70...
##    ..@ label      : chr "Self-efficacy in digital competencies (WLE)"
##    ..@ format.spss: chr "F7.4"
##    ..@ labels     : Named num [1:4] 95 97 98 99
##    .. ..- attr(*, "names")= chr [1:4] "Valid Skip" "Not Applicable" "Invalid" "No Response"
# Resumo das variáveis principais
summary(dados_limpos[c("CNT", "resil_math", "resil_read", "resil_scie", "ICTEFFIC")])
##      CNT              resil_math       resil_read       resil_scie    
##  Length:5866        Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
##  Class :character   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Mode  :character   Median :0.0000   Median :0.0000   Median :0.0000  
##                     Mean   :0.1221   Mean   :0.1308   Mean   :0.1287  
##                     3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:0.0000  
##                     Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
##     ICTEFFIC      
##  Min.   :-2.6482  
##  1st Qu.:-1.0314  
##  Median :-0.5568  
##  Mean   :-0.4617  
##  3rd Qu.:-0.1053  
##  Max.   : 2.2885

Análise Exploratória

# Contagem de países
cat("Países na amostra:\n")
## Países na amostra:
table(dados_limpos$CNT)
## 
##  ARG  BRA  CHL  DOM  PAN  URY 
## 1314 1340 1046  994  471  701
# Verificar variação nas variáveis dependentes por país
verificacao_variacao <- dados_limpos %>%
  group_by(CNT) %>%
  summarise(
    n = n(),
    resil_math_var = var(resil_math, na.rm = TRUE),
    resil_read_var = var(resil_read, na.rm = TRUE),
    resil_scie_var = var(resil_scie, na.rm = TRUE),
    resil_math_prop = mean(resil_math, na.rm = TRUE),
    resil_read_prop = mean(resil_read, na.rm = TRUE),
    resil_scie_prop = mean(resil_scie, na.rm = TRUE),
    ICTEFFIC_media = mean(ICTEFFIC, na.rm = TRUE),
    ICTEFFIC_dp = sd(ICTEFFIC, na.rm = TRUE),
    .groups = 'drop'
  )

kable(verificacao_variacao, digits = 3, 
      caption = "Verificação de Dados por País")
Verificação de Dados por País
CNT n resil_math_var resil_read_var resil_scie_var resil_math_prop resil_read_prop resil_scie_prop ICTEFFIC_media ICTEFFIC_dp
ARG 1314 0.099 0.109 0.108 0.111 0.124 0.123 -0.595 1.083
BRA 1340 0.105 0.120 0.111 0.119 0.140 0.128 -0.599 1.174
CHL 1046 0.095 0.099 0.092 0.106 0.111 0.102 -0.153 1.038
DOM 994 0.126 0.114 0.125 0.148 0.131 0.147 -0.463 1.162
PAN 471 0.087 0.093 0.095 0.096 0.104 0.106 -0.598 1.044
URY 701 0.130 0.144 0.142 0.153 0.174 0.171 -0.316 1.106
# Identificar países com problemas potenciais
paises_problematicos <- verificacao_variacao %>%
  filter(n < 30 | resil_math_var == 0 | resil_read_var == 0 | resil_scie_var == 0 |
         resil_math_prop %in% c(0, 1) | resil_read_prop %in% c(0, 1) | resil_scie_prop %in% c(0, 1))

if(nrow(paises_problematicos) > 0) {
  cat("\nPaíses com dados insuficientes ou sem variação:\n")
  print(paises_problematicos$CNT)
}
# Gráfico de distribuição do ICTEFFIC por país
p1 <- ggplot(dados_limpos, aes(x = CNT, y = ICTEFFIC)) +
  geom_boxplot(fill = "lightblue", alpha = 0.7) +
  theme_minimal() +
  labs(title = "Distribuição do ICTEFFIC por País",
       x = "País", y = "ICTEFFIC") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Proporção de resiliência por país
dados_prop <- dados_limpos %>%
  group_by(CNT) %>%
  summarise(
    Matemática = mean(resil_math, na.rm = TRUE),
    Leitura = mean(resil_read, na.rm = TRUE),
    Ciências = mean(resil_scie, na.rm = TRUE),
    .groups = 'drop'
  ) %>%
  pivot_longer(cols = -CNT, names_to = "Disciplina", values_to = "Proporcao")

p2 <- ggplot(dados_prop, aes(x = CNT, y = Proporcao, fill = Disciplina)) +
  geom_bar(stat = "identity", position = "dodge") +
  theme_minimal() +
  labs(title = "Proporção de Resiliência por País e Disciplina",
       x = "País", y = "Proporção de Resiliência") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Set2")

grid.arrange(p1, p2, ncol = 1)

Regressão Logística Global

Matemática

# Modelo global para resiliência em matemática
modelo_global_math <- glm(resil_math ~ ICTEFFIC, 
                         data = dados_limpos, 
                         family = binomial(link = "logit"))

# Resumo do modelo
summary(modelo_global_math)
## 
## Call:
## glm(formula = resil_math ~ ICTEFFIC, family = binomial(link = "logit"), 
##     data = dados_limpos)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.89350    0.04086 -46.336  < 2e-16 ***
## ICTEFFIC     0.22593    0.03372   6.701 2.08e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4352.7  on 5865  degrees of freedom
## Residual deviance: 4309.1  on 5864  degrees of freedom
## AIC: 4313.1
## 
## Number of Fisher Scoring iterations: 4
# Tabela completa: OR + p-value
resultado_math <- tidy(modelo_global_math) %>%
  filter(term == "ICTEFFIC") %>%
  mutate(
    OR = exp(estimate),
    OR_lower = exp(estimate - 1.96 * std.error),
    OR_upper = exp(estimate + 1.96 * std.error)
  ) %>%
  select(term, estimate, std.error, OR, OR_lower, OR_upper, statistic, p.value)

kable(resultado_math, digits = 4,
      caption = "Resultados Completos - Matemática (Global)")
Resultados Completos - Matemática (Global)
term estimate std.error OR OR_lower OR_upper statistic p.value
ICTEFFIC 0.2259 0.0337 1.2535 1.1733 1.3391 6.7006 0

Leitura

# Modelo global para resiliência em leitura
modelo_global_read <- glm(resil_read ~ ICTEFFIC, 
                         data = dados_limpos, 
                         family = binomial(link = "logit"))

# Resumo do modelo
summary(modelo_global_read)
## 
## Call:
## glm(formula = resil_read ~ ICTEFFIC, family = binomial(link = "logit"), 
##     data = dados_limpos)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.80126    0.03950 -45.601   <2e-16 ***
## ICTEFFIC     0.28406    0.03256   8.724   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4549.9  on 5865  degrees of freedom
## Residual deviance: 4476.0  on 5864  degrees of freedom
## AIC: 4480
## 
## Number of Fisher Scoring iterations: 4
# Tabela completa: OR + p-value
resultado_read <- tidy(modelo_global_read) %>%
  filter(term == "ICTEFFIC") %>%
  mutate(
    OR = exp(estimate),
    OR_lower = exp(estimate - 1.96 * std.error),
    OR_upper = exp(estimate + 1.96 * std.error)
  ) %>%
  select(term, estimate, std.error, OR, OR_lower, OR_upper, statistic, p.value)

kable(resultado_read, digits = 4,
      caption = "Resultados Completos - Leitura (Global)")
Resultados Completos - Leitura (Global)
term estimate std.error OR OR_lower OR_upper statistic p.value
ICTEFFIC 0.2841 0.0326 1.3285 1.2464 1.4161 8.7242 0

Ciências

# Modelo global para resiliência em ciências
modelo_global_scie <- glm(resil_scie ~ ICTEFFIC, 
                         data = dados_limpos, 
                         family = binomial(link = "logit"))

# Resumo do modelo
summary(modelo_global_scie)
## 
## Call:
## glm(formula = resil_scie ~ ICTEFFIC, family = binomial(link = "logit"), 
##     data = dados_limpos)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.82891    0.03992 -45.818  < 2e-16 ***
## ICTEFFIC     0.24037    0.03295   7.295 2.98e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4504.2  on 5865  degrees of freedom
## Residual deviance: 4452.5  on 5864  degrees of freedom
## AIC: 4456.5
## 
## Number of Fisher Scoring iterations: 4
# Tabela completa: OR + p-value
resultado_scie <- tidy(modelo_global_scie) %>%
  filter(term == "ICTEFFIC") %>%
  mutate(
    OR = exp(estimate),
    OR_lower = exp(estimate - 1.96 * std.error),
    OR_upper = exp(estimate + 1.96 * std.error)
  ) %>%
  select(term, estimate, std.error, OR, OR_lower, OR_upper, statistic, p.value)

kable(resultado_scie, digits = 4,
      caption = "Resultados Completos - Ciências (Global)")
Resultados Completos - Ciências (Global)
term estimate std.error OR OR_lower OR_upper statistic p.value
ICTEFFIC 0.2404 0.0329 1.2717 1.1922 1.3566 7.2952 0

Regressão Logística por País

# Função para ajustar modelo logístico por país com tratamento de erros
ajustar_modelo_pais_seguro <- function(dados, variavel_resposta) {
  # Filtrar países com dados suficientes
  dados_filtrados <- dados %>%
    group_by(CNT) %>%
    filter(n() >= 30) %>%  # Pelo menos 30 observações
    mutate(
      variacao = var(get(variavel_resposta), na.rm = TRUE),
      proporcao = mean(get(variavel_resposta), na.rm = TRUE)
    ) %>%
    filter(variacao > 0 & proporcao > 0 & proporcao < 1) %>%  # Deve haver variação
    ungroup()

  # Ajustar modelos por país
  resultados <- dados_filtrados %>%
    group_by(CNT) %>%
    do({
      tryCatch({
        modelo <- glm(get(variavel_resposta) ~ ICTEFFIC, 
                     data = ., 
                     family = binomial(link = "logit"))

        # Verificar convergência
        if(modelo$converged) {
          coefs <- tidy(modelo)

          data.frame(
            sucesso = TRUE,
            coeficientes = I(list(coefs)),
            n_obs = nrow(.),
            stringsAsFactors = FALSE
          )
        } else {
          data.frame(
            sucesso = FALSE,
            coeficientes = I(list(NULL)),
            n_obs = nrow(.),
            erro = "Modelo não convergiu",
            stringsAsFactors = FALSE
          )
        }
      }, error = function(e) {
        data.frame(
          sucesso = FALSE,
          coeficientes = I(list(NULL)),
          n_obs = nrow(.),
          erro = as.character(e$message),
          stringsAsFactors = FALSE
        )
      })
    })

  return(resultados)
}

# Modelos por país para cada disciplina
cat("Ajustando modelos para Matemática...\n")
## Ajustando modelos para Matemática...
modelos_math_pais <- ajustar_modelo_pais_seguro(dados_limpos, "resil_math")

cat("Ajustando modelos para Leitura...\n")
## Ajustando modelos para Leitura...
modelos_read_pais <- ajustar_modelo_pais_seguro(dados_limpos, "resil_read")

cat("Ajustando modelos para Ciências...\n")
## Ajustando modelos para Ciências...
modelos_scie_pais <- ajustar_modelo_pais_seguro(dados_limpos, "resil_scie")

# Verificar sucessos e falhas
cat("\nResumo dos ajustes:\n")
## 
## Resumo dos ajustes:
cat("Matemática - Sucessos:", sum(modelos_math_pais$sucesso), "/ Falhas:", sum(!modelos_math_pais$sucesso), "\n")
## Matemática - Sucessos: 6 / Falhas: 0
cat("Leitura - Sucessos:", sum(modelos_read_pais$sucesso), "/ Falhas:", sum(!modelos_read_pais$sucesso), "\n")
## Leitura - Sucessos: 6 / Falhas: 0
cat("Ciências - Sucessos:", sum(modelos_scie_pais$sucesso), "/ Falhas:", sum(!modelos_scie_pais$sucesso), "\n")
## Ciências - Sucessos: 6 / Falhas: 0

Resultados por País - Matemática

# Filtrar apenas modelos bem-sucedidos
modelos_math_ok <- modelos_math_pais %>% filter(sucesso == TRUE)

if(nrow(modelos_math_ok) > 0) {
  # Extrair resultados completos para matemática
  resultados_math_pais <- modelos_math_ok %>%
    select(CNT, coeficientes) %>%
    unnest(coeficientes) %>%
    filter(term == "ICTEFFIC") %>%
    mutate(
      OR = exp(estimate),
      OR_lower = exp(estimate - 1.96 * std.error),
      OR_upper = exp(estimate + 1.96 * std.error)
    ) %>%
    select(CNT, estimate, std.error, OR, OR_lower, OR_upper, statistic, p.value)

  kable(resultados_math_pais, digits = 4, 
        caption = "Resultados Completos ICTEFFIC por País - Matemática")

  # Para os gráficos (manter compatibilidade)
  or_math_pais <- resultados_math_pais %>%
    select(CNT, or_ICTEFFIC = OR)

} else {
  cat("Nenhum modelo de matemática convergiu adequadamente.\n")
}

# Mostrar países com problemas
if(sum(!modelos_math_pais$sucesso) > 0) {
  problemas_math <- modelos_math_pais %>% 
    filter(sucesso == FALSE) %>%
    select(CNT, n_obs, erro)

  cat("\nPaíses com problemas na modelagem (Matemática):\n")
  kable(problemas_math, caption = "Problemas - Matemática")
}

Resultados por País - Leitura

# Filtrar apenas modelos bem-sucedidos
modelos_read_ok <- modelos_read_pais %>% filter(sucesso == TRUE)

if(nrow(modelos_read_ok) > 0) {
  # Extrair resultados completos para leitura
  resultados_read_pais <- modelos_read_ok %>%
    select(CNT, coeficientes) %>%
    unnest(coeficientes) %>%
    filter(term == "ICTEFFIC") %>%
    mutate(
      OR = exp(estimate),
      OR_lower = exp(estimate - 1.96 * std.error),
      OR_upper = exp(estimate + 1.96 * std.error)
    ) %>%
    select(CNT, estimate, std.error, OR, OR_lower, OR_upper, statistic, p.value)

  kable(resultados_read_pais, digits = 4, 
        caption = "Resultados Completos ICTEFFIC por País - Leitura")

  # Para os gráficos (manter compatibilidade)
  or_read_pais <- resultados_read_pais %>%
    select(CNT, or_ICTEFFIC = OR)

} else {
  cat("Nenhum modelo de leitura convergiu adequadamente.\n")
}

# Mostrar países com problemas
if(sum(!modelos_read_pais$sucesso) > 0) {
  problemas_read <- modelos_read_pais %>% 
    filter(sucesso == FALSE) %>%
    select(CNT, n_obs, erro)

  cat("\nPaíses com problemas na modelagem (Leitura):\n")
  kable(problemas_read, caption = "Problemas - Leitura")
}

Resultados por País - Ciências

# Filtrar apenas modelos bem-sucedidos
modelos_scie_ok <- modelos_scie_pais %>% filter(sucesso == TRUE)

if(nrow(modelos_scie_ok) > 0) {
  # Extrair resultados completos para ciências
  resultados_scie_pais <- modelos_scie_ok %>%
    select(CNT, coeficientes) %>%
    unnest(coeficientes) %>%
    filter(term == "ICTEFFIC") %>%
    mutate(
      OR = exp(estimate),
      OR_lower = exp(estimate - 1.96 * std.error),
      OR_upper = exp(estimate + 1.96 * std.error)
    ) %>%
    select(CNT, estimate, std.error, OR, OR_lower, OR_upper, statistic, p.value)

  kable(resultados_scie_pais, digits = 4, 
        caption = "Resultados Completos ICTEFFIC por País - Ciências")

  # Para os gráficos (manter compatibilidade)
  or_scie_pais <- resultados_scie_pais %>%
    select(CNT, or_ICTEFFIC = OR)

} else {
  cat("Nenhum modelo de ciências convergiu adequadamente.\n")
}

# Mostrar países com problemas
if(sum(!modelos_scie_pais$sucesso) > 0) {
  problemas_scie <- modelos_scie_pais %>% 
    filter(sucesso == FALSE) %>%
    select(CNT, n_obs, erro)

  cat("\nPaíses com problemas na modelagem (Ciências):\n")
  kable(problemas_scie, caption = "Problemas - Ciências")
}

Visualização dos Resultados

# Combinar todos os odds ratios (apenas modelos bem-sucedidos)
todos_or <- bind_rows()

if(exists("or_math_pais") && nrow(or_math_pais) > 0) {
  todos_or <- bind_rows(todos_or, or_math_pais %>% mutate(Disciplina = "Matemática"))
}
if(exists("or_read_pais") && nrow(or_read_pais) > 0) {
  todos_or <- bind_rows(todos_or, or_read_pais %>% mutate(Disciplina = "Leitura"))
}
if(exists("or_scie_pais") && nrow(or_scie_pais) > 0) {
  todos_or <- bind_rows(todos_or, or_scie_pais %>% mutate(Disciplina = "Ciências"))
}

if(nrow(todos_or) > 0) {
  # Gráfico dos odds ratios por país e disciplina
  ggplot(todos_or, aes(x = CNT, y = or_ICTEFFIC, fill = Disciplina)) +
    geom_bar(stat = "identity", position = "dodge") +
    geom_hline(yintercept = 1, linetype = "dashed", color = "red") +
    theme_minimal() +
    labs(title = "Odds Ratios do ICTEFFIC por País e Disciplina",
         x = "País", 
         y = "Odds Ratio",
         caption = "Linha vermelha indica OR = 1 (sem efeito)") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    scale_fill_brewer(palette = "Set2")
} else {
  cat("Não há dados suficientes para gerar gráficos de odds ratios por país.\n")
}

# Combinar todos os coeficientes (apenas modelos bem-sucedidos)
todos_coef <- bind_rows()

if(exists("resultados_math_pais") && nrow(resultados_math_pais) > 0) {
  todos_coef <- bind_rows(todos_coef, resultados_math_pais %>% mutate(Disciplina = "Matemática"))
}
if(exists("resultados_read_pais") && nrow(resultados_read_pais) > 0) {
  todos_coef <- bind_rows(todos_coef, resultados_read_pais %>% mutate(Disciplina = "Leitura"))
}
if(exists("resultados_scie_pais") && nrow(resultados_scie_pais) > 0) {
  todos_coef <- bind_rows(todos_coef, resultados_scie_pais %>% mutate(Disciplina = "Ciências"))
}

if(nrow(todos_coef) > 0) {
  # Gráfico dos coeficientes com intervalos de confiança
  ggplot(todos_coef, aes(x = CNT, y = estimate, color = Disciplina)) +
    geom_point(position = position_dodge(width = 0.3)) +
    geom_errorbar(aes(ymin = estimate - 1.96*std.error, 
                      ymax = estimate + 1.96*std.error),
                  position = position_dodge(width = 0.3), width = 0.2) +
    geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
    theme_minimal() +
    labs(title = "Coeficientes do ICTEFFIC por País e Disciplina",
         x = "País", 
         y = "Coeficiente (log-odds)",
         caption = "Barras representam IC 95%. Linha vermelha indica coeficiente = 0") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    scale_color_brewer(palette = "Set2")
} else {
  cat("Não há dados suficientes para gerar gráficos de coeficientes por país.\n")
}

Resumo dos Resultados

# Tabela resumo comparando modelos globais COM p-values
resumo_global <- bind_rows(
  tidy(modelo_global_math) %>% filter(term == "ICTEFFIC") %>% mutate(Disciplina = "Matemática"),
  tidy(modelo_global_read) %>% filter(term == "ICTEFFIC") %>% mutate(Disciplina = "Leitura"),
  tidy(modelo_global_scie) %>% filter(term == "ICTEFFIC") %>% mutate(Disciplina = "Ciências")
) %>%
  mutate(OR = exp(estimate)) %>%
  select(Disciplina, estimate, std.error, OR, statistic, p.value)

kable(resumo_global, digits = 4,
      caption = "Resumo dos Modelos Globais - Com p-values")
Resumo dos Modelos Globais - Com p-values
Disciplina estimate std.error OR statistic p.value
Matemática 0.2259 0.0337 1.2535 6.7006 0
Leitura 0.2841 0.0326 1.3285 8.7242 0
Ciências 0.2404 0.0329 1.2717 7.2952 0
# Estatísticas descritivas dos OR por país (se disponível)
if(nrow(todos_or) > 0) {
  resumo_or_pais <- todos_or %>%
    group_by(Disciplina) %>%
    summarise(
      Paises_analisados = n(),
      OR_min = min(or_ICTEFFIC, na.rm = TRUE),
      OR_max = max(or_ICTEFFIC, na.rm = TRUE),
      OR_media = mean(or_ICTEFFIC, na.rm = TRUE),
      OR_mediana = median(or_ICTEFFIC, na.rm = TRUE),
      .groups = 'drop'
    )

  kable(resumo_or_pais, digits = 3, 
        caption = "Estatísticas dos Odds Ratios por País")
} else {
  cat("Não foi possível calcular estatísticas dos OR por país devido a problemas de convergência.\n")
}
Estatísticas dos Odds Ratios por País
Disciplina Paises_analisados OR_min OR_max OR_media OR_mediana
Ciências 6 1.060 1.391 1.274 1.310
Leitura 6 1.071 1.567 1.310 1.310
Matemática 6 1.109 1.380 1.256 1.281
# Resumo de significância estatística
if(nrow(todos_coef) > 0) {
  significancia_pais <- todos_coef %>%
    mutate(
      significativo = ifelse(p.value < 0.05, "Sim", "Não"),
      efeito = case_when(
        OR > 1 & p.value < 0.05 ~ "Positivo significativo",
        OR < 1 & p.value < 0.05 ~ "Negativo significativo",
        p.value >= 0.05 ~ "Não significativo",
        TRUE ~ "Indefinido"
      )
    ) %>%
    group_by(Disciplina, efeito) %>%
    summarise(n_paises = n(), .groups = 'drop')

  kable(significancia_pais, 
        caption = "Resumo da Significância Estatística por País")
}
Resumo da Significância Estatística por País
Disciplina efeito n_paises
Ciências Não significativo 1
Ciências Positivo significativo 5
Leitura Não significativo 1
Leitura Positivo significativo 5
Matemática Não significativo 2
Matemática Positivo significativo 4

Interpretação

Os resultados mostram:

  1. Modelos Globais: O efeito do ICTEFFIC na resiliência varia entre as disciplinas
    • OR > 1: ICTEFFIC aumenta a probabilidade de resiliência
    • OR < 1: ICTEFFIC diminui a probabilidade de resiliência
    • p < 0.05: Efeito estatisticamente significativo
  2. Variação por País: Há heterogeneidade considerável nos efeitos entre países
    • Alguns países mostram efeitos positivos significativos
    • Outros podem mostrar efeitos negativos ou não significativos
  3. Intervalos de Confiança:
    • OR_lower e OR_upper: Limites do intervalo de confiança de 95%
    • Se o intervalo não inclui 1.0, o efeito é significativo

Notas Importantes: - p < 0.05: Efeito estatisticamente significativo - OR ≈ 1: Pouco ou nenhum efeito da variável preditora - Países com dados insuficientes ou sem variação foram excluídos automaticamente - Modelos que não convergiram são reportados separadamente com diagnósticos