Análise - Escribo Panamá - Regressão Logística

1. Carregamento da base de dados

Aqui iniciamos a importação da base de dados onde foi necessário utilizar o pacote read_spss para realizar a importação no formato .sav do SPSS.

#importando a base de dados
dadosGeral <- read_spss("data/Mathematics - Final.sav")

2. Pré-processamento dos dados

Realizamos um pré processamento: limitando apenas alunos em um intervalo de idade; apenas alunos do Panamá; alunos que jogaram os games de matemática (grupo experimental); Apenas características gerais, pré-pós-teste e interação com os jogos e por fim retiramos todos os alunos que deixaram de fazer um dos testes (pré ou pós)

#Pré-processamento

dados <- dadosGeral %>%
  filter(age >= 4 & age <= 7) %>% #Alunos entre 4 à 7 anos.
  filter(Math_Games == 1) %>% # Apenas grupo experimental.
  mutate(Gain_Math = POS_Math_Score - PRE_Math_Score,
         Gain_Math_Cat = case_when(Gain_Math <= 0~0, Gain_Math > 0~1))  #Criação da variável de ganho.

dadosYear4 <- dadosGeral %>%
  filter(age == 4) %>% #Apenas alunos de 4 anos.
  filter(Math_Games == 1) %>% # Apenas grupo experimental.
  filter(child_school != "otro") %>% 
  filter(child_school_grade != "otro") %>% 
  mutate(Gain_Math = POS_Math_Score - PRE_Math_Score,
         Gain_Math_Cat = case_when(Gain_Math <= 0~0, Gain_Math > 0~1))  #Criação da variável de ganho.
  
dadosYear5 <- dadosGeral %>%
  filter(age == 5) %>% #Apenas alunos de 5 anos.
  filter(Math_Games == 1) %>% # Apenas grupo experimental.
  filter(child_school != "otro") %>% 
  filter(child_school_grade != "otro") %>%
  filter(finances != "4000-5000") %>% 
  mutate(Gain_Math = POS_Math_Score - PRE_Math_Score,
         Gain_Math_Cat = case_when(Gain_Math <= 0~0, Gain_Math > 0~1))  #Criação da variável de ganho.
  
dadosYear6 <- dadosGeral %>%
  filter(age == 6) %>% #Apenas alunos de 6 anos.
  filter(Math_Games == 1) %>% # Apenas grupo experimental.
  filter(finances != "5000-7500") %>% 
  mutate(Gain_Math = POS_Math_Score - PRE_Math_Score,
         Gain_Math_Cat = case_when(Gain_Math <= 0~0, Gain_Math > 0~1))  #Criação da variável de ganho.

dadosYear7 <- dadosGeral %>%
  filter(age == 7) %>% #Apenas alunos de 7 anos.
  filter(Math_Games == 1) %>% # Apenas grupo experimental.
  filter(finances != "2500-3000") %>%
  filter(finances != "4000-5000") %>%
  mutate(Gain_Math = POS_Math_Score - PRE_Math_Score,
         Gain_Math_Cat = case_when(Gain_Math <= 0~0, Gain_Math > 0~1))  #Criação da variável de ganho.

3. Análise Descritiva

Nesta seção mostraremos as tabela de contingência para as variáveis qualitativas, bem como testes de relação entre as variáveis….

3.1 Base de dados

Aqui apresentamos a base de dados utilizada para as análises após o pré-processamento dos dados

#library(rmarkdown)
paged_table(dados)

3.2 Tabela de contingência

Nesta tabela de contingência fizemos uma dupla entrada entre as variáveis qualitativas cruzando com uma única variável escolhida. É apresentado os valores de p-valor referente ao teste de relação de qui-quadrado.

Geral

dados %>% 
  select( #aqui ta selecionando todas as variáveis na tabela
    special,
    child_school,
    child_school_grade,
    age,
    gender,
    PRE_Math_Score,
    POS_Math_Score) %>% 
  tbl_summary(statistic = list(all_continuous() ~ "{mean} ({sd})"))
Characteristic N = 6981
special
no 629 (90%)
not-informed 50 (7.2%)
yes 19 (2.7%)
child_school
centro-educativo-particular 135 (19%)
centro-educativo-publico 550 (79%)
otro 13 (1.9%)
child_school_grade
kinder 171 (24%)
otro 44 (6.3%)
pre-kinder 72 (10%)
primary-basica-general 212 (30%)
secondary-basica-general 199 (29%)
age
4 94 (13%)
5 192 (28%)
6 210 (30%)
7 202 (29%)
gender
f 353 (51%)
m 345 (49%)
PRE_Math_Score 0.96 (0.07)
POS_Math_Score 0.98 (0.05)

1 n (%); Mean (SD)

Sexo

dados %>% 
  select( #aqui ta selecionando todas as variáveis na tabela
    special,
    child_school,
    child_school_grade,
    age,
    gender,
    PRE_Math_Score,
    POS_Math_Score) %>% 
  tbl_summary(
    by = gender,
    statistic = list(all_continuous() ~ "{mean} ({sd})")) %>% #o by informa a varilavel do cruzamento
  add_p() #adiciona os p-valores dos testes de qui-quadrado
Characteristic f, N = 3531 m, N = 3451 p-value2
special 0.013
no 328 (93%) 301 (87%)
not-informed 21 (5.9%) 29 (8.4%)
yes 4 (1.1%) 15 (4.3%)
child_school 0.5
centro-educativo-particular 64 (18%) 71 (21%)
centro-educativo-publico 284 (80%) 266 (77%)
otro 5 (1.4%) 8 (2.3%)
child_school_grade 0.3
kinder 89 (25%) 82 (24%)
otro 23 (6.5%) 21 (6.1%)
pre-kinder 36 (10%) 36 (10%)
primary-basica-general 95 (27%) 117 (34%)
secondary-basica-general 110 (31%) 89 (26%)
age 0.085
4 49 (14%) 45 (13%)
5 93 (26%) 99 (29%)
6 95 (27%) 115 (33%)
7 116 (33%) 86 (25%)
PRE_Math_Score 0.96 (0.08) 0.96 (0.06) 0.2
POS_Math_Score 0.97 (0.05) 0.98 (0.05) >0.9

1 n (%); Mean (SD)

2 Pearson's Chi-squared test; Wilcoxon rank sum test

Especial

dados %>% 
  select( #aqui ta selecionando todas as variáveis na tabela
    special,
    child_school,
    child_school_grade,
    age,
    gender,
    PRE_Math_Score,
    POS_Math_Score) %>% 
  tbl_summary(
    by = special,
    statistic = list(all_continuous() ~ "{mean} ({sd})")) %>% #o by informa a varilavel do cruzamento
  add_p() #adiciona os p-valores dos testes de qui-quadrado
Characteristic no, N = 6291 not-informed, N = 501 yes, N = 191 p-value2
child_school 0.11
centro-educativo-particular 123 (20%) 8 (16%) 4 (21%)
centro-educativo-publico 497 (79%) 39 (78%) 14 (74%)
otro 9 (1.4%) 3 (6.0%) 1 (5.3%)
child_school_grade
kinder 152 (24%) 13 (26%) 6 (32%)
otro 41 (6.5%) 1 (2.0%) 2 (11%)
pre-kinder 61 (9.7%) 9 (18%) 2 (11%)
primary-basica-general 193 (31%) 16 (32%) 3 (16%)
secondary-basica-general 182 (29%) 11 (22%) 6 (32%)
age 0.2
4 82 (13%) 9 (18%) 3 (16%)
5 167 (27%) 16 (32%) 9 (47%)
6 194 (31%) 14 (28%) 2 (11%)
7 186 (30%) 11 (22%) 5 (26%)
gender 0.013
f 328 (52%) 21 (42%) 4 (21%)
m 301 (48%) 29 (58%) 15 (79%)
PRE_Math_Score 0.96 (0.08) 0.96 (0.06) 0.95 (0.07) 0.064
POS_Math_Score 0.97 (0.05) 0.98 (0.03) 0.98 (0.05) >0.9

1 n (%); Mean (SD)

2 Fisher's exact test; Pearson's Chi-squared test; Kruskal-Wallis rank sum test

Tipo Escola

dados %>% 
  select( #aqui ta selecionando todas as variáveis na tabela
    special,
    child_school,
    child_school_grade,
    age,
    gender,
    PRE_Math_Score,
    POS_Math_Score) %>% 
  tbl_summary(
    by = child_school,
    statistic = list(all_continuous() ~ "{mean} ({sd})")) %>% #o by informa a varilavel do cruzamento
  add_p() #adiciona os p-valores dos testes de qui-quadrado
Characteristic centro-educativo-particular, N = 1351 centro-educativo-publico, N = 5501 otro, N = 131 p-value2
special 0.11
no 123 (91%) 497 (90%) 9 (69%)
not-informed 8 (5.9%) 39 (7.1%) 3 (23%)
yes 4 (3.0%) 14 (2.5%) 1 (7.7%)
child_school_grade
kinder 35 (26%) 133 (24%) 3 (23%)
otro 10 (7.4%) 32 (5.8%) 2 (15%)
pre-kinder 17 (13%) 51 (9.3%) 4 (31%)
primary-basica-general 39 (29%) 171 (31%) 2 (15%)
secondary-basica-general 34 (25%) 163 (30%) 2 (15%)
age
4 24 (18%) 64 (12%) 6 (46%)
5 39 (29%) 150 (27%) 3 (23%)
6 34 (25%) 174 (32%) 2 (15%)
7 38 (28%) 162 (29%) 2 (15%)
gender 0.5
f 64 (47%) 284 (52%) 5 (38%)
m 71 (53%) 266 (48%) 8 (62%)
PRE_Math_Score 0.96 (0.06) 0.96 (0.08) 0.93 (0.06) 0.019
POS_Math_Score 0.97 (0.05) 0.98 (0.05) 0.99 (0.02) 0.4

1 n (%); Mean (SD)

2 Fisher's exact test; Pearson's Chi-squared test; Kruskal-Wallis rank sum test

Série

dados %>% 
  select( #aqui ta selecionando todas as variáveis na tabela
    special,
    child_school,
    child_school_grade,
    age,
    gender,
    PRE_Math_Score,
    POS_Math_Score) %>% 
  tbl_summary(
    by = child_school_grade,
    statistic = list(all_continuous() ~ "{mean} ({sd})")) %>% #o by informa a varilavel do cruzamento
  add_p() #adiciona os p-valores dos testes de qui-quadrado
Characteristic kinder, N = 1711 otro, N = 441 pre-kinder, N = 721 primary-basica-general, N = 2121 secondary-basica-general, N = 1991 p-value2
special
no 152 (89%) 41 (93%) 61 (85%) 193 (91%) 182 (91%)
not-informed 13 (7.6%) 1 (2.3%) 9 (12%) 16 (7.5%) 11 (5.5%)
yes 6 (3.5%) 2 (4.5%) 2 (2.8%) 3 (1.4%) 6 (3.0%)
child_school
centro-educativo-particular 35 (20%) 10 (23%) 17 (24%) 39 (18%) 34 (17%)
centro-educativo-publico 133 (78%) 32 (73%) 51 (71%) 171 (81%) 163 (82%)
otro 3 (1.8%) 2 (4.5%) 4 (5.6%) 2 (0.9%) 2 (1.0%)
age <0.001
4 27 (16%) 2 (4.5%) 65 (90%) 0 (0%) 0 (0%)
5 144 (84%) 4 (9.1%) 6 (8.3%) 38 (18%) 0 (0%)
6 0 (0%) 0 (0%) 1 (1.4%) 170 (80%) 39 (20%)
7 0 (0%) 38 (86%) 0 (0%) 4 (1.9%) 160 (80%)
gender 0.3
f 89 (52%) 23 (52%) 36 (50%) 95 (45%) 110 (55%)
m 82 (48%) 21 (48%) 36 (50%) 117 (55%) 89 (45%)
PRE_Math_Score 0.94 (0.11) 0.97 (0.04) 0.94 (0.07) 0.97 (0.06) 0.97 (0.06) 0.002
POS_Math_Score 0.97 (0.06) 0.97 (0.06) 0.98 (0.04) 0.98 (0.04) 0.98 (0.05) 0.4

1 n (%); Mean (SD)

2 Pearson's Chi-squared test; Kruskal-Wallis rank sum test

Idade

dados %>% 
  select( #aqui ta selecionando todas as variáveis na tabela
    special,
    child_school,
    child_school_grade,
    age,
    gender,
    PRE_Math_Score,
    POS_Math_Score) %>% 
  tbl_summary(
    by = age,
    statistic = list(all_continuous() ~ "{mean} ({sd})")) %>% #o by informa a varilavel do cruzamento
  add_p() #adiciona os p-valores dos testes de qui-quadrado
Characteristic 4, N = 941 5, N = 1921 6, N = 2101 7, N = 2021 p-value2
special 0.2
no 82 (87%) 167 (87%) 194 (92%) 186 (92%)
not-informed 9 (9.6%) 16 (8.3%) 14 (6.7%) 11 (5.4%)
yes 3 (3.2%) 9 (4.7%) 2 (1.0%) 5 (2.5%)
child_school
centro-educativo-particular 24 (26%) 39 (20%) 34 (16%) 38 (19%)
centro-educativo-publico 64 (68%) 150 (78%) 174 (83%) 162 (80%)
otro 6 (6.4%) 3 (1.6%) 2 (1.0%) 2 (1.0%)
child_school_grade <0.001
kinder 27 (29%) 144 (75%) 0 (0%) 0 (0%)
otro 2 (2.1%) 4 (2.1%) 0 (0%) 38 (19%)
pre-kinder 65 (69%) 6 (3.1%) 1 (0.5%) 0 (0%)
primary-basica-general 0 (0%) 38 (20%) 170 (81%) 4 (2.0%)
secondary-basica-general 0 (0%) 0 (0%) 39 (19%) 160 (79%)
gender 0.085
f 49 (52%) 93 (48%) 95 (45%) 116 (57%)
m 45 (48%) 99 (52%) 115 (55%) 86 (43%)
PRE_Math_Score 0.94 (0.10) 0.95 (0.09) 0.97 (0.06) 0.97 (0.06) <0.001
POS_Math_Score 0.97 (0.05) 0.97 (0.06) 0.98 (0.04) 0.97 (0.05) 0.3

1 n (%); Mean (SD)

2 Fisher's exact test; Pearson's Chi-squared test; Kruskal-Wallis rank sum test

3.3 Análise de Densidade do Pré e Pós teste

Análise gráfica utilizando gráficos de densidade para verificar a diferença entre o pré e pós teste de acordo com as características: geral, idade, sexo, escola e série.

Geral

Plotando a densidade para os scores de pré e pós teste.

#gráfico de densidade
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_density(alpha=0.5) +
  xlim(0.75,1)

Idade

Plotando a densidade para os scores de pré e pós teste de acordo com a idade do estudante

dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_density(alpha=0.5) +
  xlim(0.75,1) + 
  facet_wrap(~age,1)

Sexo

Plotando a densidade para os scores de pré e pós teste em relação ao sexo.

#gráfico de densidade em relação ao sexo
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_density(alpha=0.5) +
  xlim(0.75,1) + 
  facet_wrap(~gender,1)

Escola

Plotando a densidade para os scores de pré e pós teste em relação ao tipo de escola.

#gráfico de densidade em relação a escola
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_density(alpha=0.5) +
  xlim(0.75,1) + 
  facet_wrap(~child_school,1)

Série

Plotando a densidade para os scores de pré e pós teste em relação a série do estudante.

#gráfico de densidade em relação a escola
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_density(alpha=0.5) +
  xlim(0.75,1) + 
  facet_wrap(~child_school_grade,1)

3.4 Análise com BoxPlot do Pré e Pós teste

Análise gráfica utilizando gráficos de boxplot para verificar a diferença entre o pré e pós teste de acordo com as características: geral, idade, sexo, escola e série.

Geral

Plotando a densidade para os scores de pré e pós teste.

#gráfico de boxplot geral
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_boxplot(alpha=0.5) +
  coord_flip() +
  xlim(0.75,1)

Idade

Plotando o boxplot para os scores de pré e pós teste de acordo com a idade do estudante

#gráfico de boxplot em relação a idade
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_boxplot(alpha=0.5) +
  xlim(0.75,1) + 
  coord_flip() +
  facet_wrap(~age, 1)

Sexo

Plotando o boxplot para os scores de pré e pós teste em relação ao sexo.

#gráfico de boxplot em relação ao sexo
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_boxplot(alpha=0.5) +
  xlim(0.75,1) + 
  coord_flip() +
  facet_wrap(~gender,1)

Escola

Plotando o boxplot para os scores de pré e pós teste em relação ao tipo de escola.

#gráfico de boxplot em relação a escola
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_boxplot(alpha=0.5) +
  xlim(0.75,1) + 
  coord_flip() +
  facet_wrap(~child_school,1)

Série

Plotando o boxplot para os scores de pré e pós teste em relação a série do estudante.

#gráfico de boxplot em relação a escola
dados %>% 
  gather(PRE_Math_Score,
         POS_Math_Score,
         key = test, value = scores) %>% 
  ggplot(aes(scores, fill = test)) +
  geom_boxplot(alpha=0.5) +
  xlim(0.75,1) + 
  coord_flip() +
  facet_wrap(~child_school_grade,1)

4. Análise de Regressão Logística

4.1 Construção do Modelo

m1Year4 <- glm(Gain_Math_Cat ~ gender + child_school + child_school_grade + finances, data = dadosYear4, family = binomial(link = "logit"))
m1Year5 <- glm(Gain_Math_Cat ~ gender + child_school + child_school_grade + finances, data = dadosYear5, family = binomial(link = "logit"))
m1Year6 <- glm(Gain_Math_Cat ~ gender + child_school + finances, data = dadosYear6, family = binomial(link = "logit"))
m1Year7 <- glm(Gain_Math_Cat ~ gender + child_school + child_school_grade + finances, data = dadosYear7, family = binomial(link = "logit"))

4.2 Tabela de Significância

4 Anos

tab_model(m1Year4)
  Gain Math Cat
Predictors Odds Ratios CI p
(Intercept) 1.84 0.39 – 9.67 0.448
gender [m] 1.28 0.45 – 3.81 0.646
child school
[centro-educativo-publico]
1.01 0.29 – 3.24 0.981
child school grade
[pre-kinder]
0.70 0.22 – 2.09 0.539
finances1000-1500 1.11 0.21 – 6.73 0.900
finances1500-2500 2.69 0.29 – 61.19 0.429
finances2500-3000 0.84 0.10 – 8.44 0.872
finances3000-3500 0.77 0.02 – 24.94 0.871
finances500-1000 2.48 0.65 – 10.92 0.199
finances [not-informed] 2.19 0.60 – 8.66 0.243
Observations 87
R2 Tjur 0.045

5 Anos

tab_model(m1Year5)
  Gain Math Cat
Predictors Odds Ratios CI p
(Intercept) 4.41 1.53 – 13.56 0.007
gender [m] 0.86 0.46 – 1.63 0.649
child school
[centro-educativo-publico]
0.45 0.18 – 1.05 0.075
child school grade
[pre-kinder]
3.76 0.51 – 78.69 0.259
child school grade
[primary-basica-general]
1.33 0.61 – 3.02 0.478
finances1000-1500 0.59 0.17 – 2.12 0.403
finances1500-2500 0.28 0.06 – 1.13 0.076
finances2500-3000 0.18 0.01 – 5.49 0.271
finances3000-3500 0.34 0.01 – 9.43 0.468
finances500-1000 0.58 0.23 – 1.48 0.255
finances [not-informed] 0.76 0.35 – 1.66 0.498
Observations 185
R2 Tjur 0.041

6 anos

tab_model(m1Year6)
  Gain Math Cat
Predictors Odds Ratios CI p
(Intercept) 1.26 0.46 – 3.48 0.651
gender [m] 1.01 0.57 – 1.78 0.971
child school
[centro-educativo-publico]
0.93 0.40 – 2.10 0.857
child school [otro] 0.63 0.02 – 17.63 0.759
finances1000-1500 1.64 0.51 – 5.63 0.413
finances1500-2500 1.38 0.30 – 7.46 0.689
finances2500-3000 0.82 0.09 – 7.47 0.851
finances4000-5000 0.82 0.03 – 21.90 0.889
finances500-1000 0.88 0.39 – 2.00 0.766
finances [not-informed] 1.25 0.61 – 2.58 0.539
Observations 209
R2 Tjur 0.010

7 anos

tab_model(m1Year7)
  Gain Math Cat
Predictors Odds Ratios CI p
(Intercept) 0.83 0.26 – 2.59 0.748
gender [m] 1.41 0.77 – 2.58 0.266
child school
[centro-educativo-publico]
1.56 0.70 – 3.52 0.281
child school [otro] 0.79 0.02 – 26.23 0.889
child school grade
[primary-basica-general]
3.87 0.36 – 112.05 0.311
child school grade
[secondary-basica-general]
1.59 0.76 – 3.38 0.220
finances1000-1500 0.73 0.23 – 2.41 0.605
finances1500-2500 0.93 0.21 – 4.98 0.927
finances3000-3500 0.51 0.02 – 14.35 0.652
finances500-1000 0.59 0.24 – 1.43 0.249
finances [not-informed] 0.52 0.23 – 1.11 0.094
Observations 200
R2 Tjur 0.049

4.3 Gráfico de Odd Ratio

4 Anos

plot_model(m1Year4, show.values = TRUE, value.offset = .3)

5 Anos

plot_model(m1Year5, show.values = TRUE, value.offset = .3)

6 anos

plot_model(m1Year6, show.values = TRUE, value.offset = .3)

7 anos

plot_model(m1Year7, show.values = TRUE, value.offset = .3)