## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
##
## Attaching package: 'modelr'
##
##
## The following object is masked from 'package:broom':
##
## bootstrap
##
##
##
## Attaching package: 'gridExtra'
##
##
## The following object is masked from 'package:dplyr':
##
## combine
A CAPES é um órgão do MEC que tem a atribuição de acompanhar a pós-graduação na universidade brasileira. Uma das formas que ela encontrou de fazer isso e pela qual ela é bastante criticada é através de uma avaliação quantitativa a cada x anos (era 3, mudou para 4).
Usaremos dados da penúltima avaliação da CAPES:
cacc_tudo = read_projectdata()
glimpse(cacc_tudo)
## Rows: 73
## Columns: 31
## $ Instituição <chr> "UNIVERSIDADE FEDERAL DO AMAZONAS", "UNIV…
## $ Programa <chr> "INFORMÁTICA (12001015012P2)", "CIÊNCIA D…
## $ Nível <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3, 3, 3,…
## $ Sigla <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FUFPI", …
## $ `Tem doutorado` <chr> "Sim", "Sim", "Não", "Não", "Não", "Sim",…
## $ `Docentes colaboradores` <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.00, 1.00,…
## $ `Docentes permanentes` <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 20.75, …
## $ `Docentes visitantes` <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.75, 0.50,…
## $ `Resumos em conf` <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24, 27, …
## $ `Resumos expandidos em conf` <int> 25, 24, 7, 10, 1, 68, 9, 13, 4, 6, 16, 5,…
## $ `Artigos em conf` <int> 390, 284, 115, 73, 150, 269, 179, 0, 120,…
## $ Dissertacoes <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3, …
## $ Teses <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0,…
## $ periodicos_A1 <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 44, 0, …
## $ periodicos_A2 <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, 23, 2,…
## $ periodicos_B1 <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 32, 4, …
## $ periodicos_B2 <int> 1, 12, 2, 6, 0, 0, 11, 0, 0, 2, 1, 0, 0, …
## $ periodicos_B3 <int> 3, 16, 2, 2, 3, 16, 15, 0, 4, 6, 9, 0, 2,…
## $ periodicos_B4 <int> 0, 4, 0, 3, 3, 0, 1, 3, 1, 6, 0, 0, 4, 5,…
## $ periodicos_B5 <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 11, 0, …
## $ periodicos_C <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 16, 1, …
## $ periodicos_NA <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14, 19, 0…
## $ per_comaluno_A1 <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, 0, 0, 2…
## $ per_comaluno_A2 <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, 0, 0, 1…
## $ per_comaluno_B1 <int> 4, 2, 5, 2, 2, 14, 6, 0, 2, 0, 17, 0, 1, …
## $ per_comaluno_B2 <int> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,…
## $ per_comaluno_B3 <int> 2, 2, 0, 1, 0, 7, 9, 0, 2, 0, 4, 0, 0, 1,…
## $ per_comaluno_B4 <int> 0, 0, 0, 0, 2, 0, 1, 0, 1, 3, 0, 0, 2, 0,…
## $ per_comaluno_B5 <int> 5, 0, 4, 0, 8, 3, 6, 0, 4, 0, 4, 0, 2, 5,…
## $ per_comaluno_C <int> 6, 5, 3, 1, 2, 3, 7, 1, 2, 4, 8, 0, 11, 3…
## $ per_comaluno_NA <int> 6, 14, 2, 2, 9, 3, 6, 4, 5, 1, 10, 0, 17,…
Uma das maneiras de avaliar a produção dos docentes que a CAPES utiliza é quantificando a produção de artigos pelos docentes. Os artigos são categorizados em extratos ordenados (A1 é o mais alto), e separados entre artigos em conferências e periódicos. Usaremos para esse lab a produção em periódicos avaliados com A1, A2 e B1.
cacc = cacc_tudo %>%
transmute(
docentes = `Docentes permanentes`,
producao = (periodicos_A1 + periodicos_A2 + periodicos_B1),
produtividade = producao / docentes,
mestrados = Dissertacoes,
doutorados = Teses,
tem_doutorado = tolower(`Tem doutorado`) == "sim",
mestrados_pprof = mestrados / docentes,
doutorados_pprof = doutorados / docentes
)
cacc_md = cacc %>%
filter(tem_doutorado)
Diferente de medirmos produção (total produzido), é medirmos produtividade (produzido / utilizado). Abaixo focaremos nessa análise. Para isso crie um modelo que investiga como um conjunto de fatores que você julga que são relevantes se relacionam com a produtividade dos programas. Crie um modelo que avalie como pelo menos 3 fatores se relacionam com a produtividade de um programa. Pode reutilizar fatores que já definimos e analizamos para produção. Mas cuidado para não incluir fatores que sejam função linear de outros já incluídos (ex: incluir A, B e um terceiro C=A+B)
Produza abaixo o modelo e um texto que comente (i) o modelo, tal como os que fizemos antes, e (ii) as implicações - o que aprendemos sobre como funcionam programas de pós no brasil?.
As relações entre a produção, produtivade e docentes/mestrados/doutorados/tem_doutorado podem ser visualizadas a partir dos gráficos abaixo:
dispersao <- function(data) {
grafico_docentes <- ggplot(data, aes(x = producao, y = produtividade, size = docentes)) +
geom_point(alpha = 0.8) +
labs(
x = "Produção",
y = "Produtividade",
size = "Docentes"
) +
theme_minimal()
grafico_mestrados <- ggplot(data, aes(x = producao, y = produtividade, size = mestrados)) +
geom_point(color="blue", alpha = 0.8) +
labs(
x = "Produção",
y = "Produtividade",
size = "Mestrados"
) +
theme_minimal()
grafico_doutorados <- ggplot(data, aes(x = producao, y = produtividade, size = doutorados)) +
geom_point(color="red", alpha = 0.8) +
labs(
x = "Produção",
y = "Produtividade",
size = "Doutorados"
) +
theme_minimal()
grafico_tem_doutorado <- ggplot(data, aes(x = producao, y = produtividade, color = tem_doutorado)) +
geom_point(size = 3, alpha = 0.8) +
scale_color_manual(
name = "Tem Doutorado",
values = c("TRUE" = "orange", "FALSE" = "gray"),
labels = c("TRUE" = "Sim", "FALSE" = "Não")
) +
labs(
x = "Produção",
y = "Produtividade",
color = "Tem Doutorado"
) +
theme_minimal()
# Organizando os gráficos em uma única imagem
grid.arrange(grafico_docentes, grafico_mestrados, grafico_doutorados, grafico_tem_doutorado, ncol = 2)
}
print(dispersao(cacc))
## TableGrob (2 x 2) "arrange": 4 grobs
## z cells name grob
## 1 1 (1-1,1-1) arrange gtable[layout]
## 2 2 (1-1,2-2) arrange gtable[layout]
## 3 3 (2-2,1-1) arrange gtable[layout]
## 4 4 (2-2,2-2) arrange gtable[layout]
Para criar um modelo de regressão com pelo menos três fatores, utilizaremos o método de seleção backward. Esse método começa com o modelo completo e remove uma variável de cada vez. Contudo, temos que as variáveis mestrados_pprof e doutorados_pprof são funções lineares das variáveis mestrados, doutorados e docentes. Portanto, podemos iniciar com dois modelos diferentes: Modelo MD (01) e Modelo MD_pprof (02).
O primeiro modelo, pode ser descrito da seguinte forma:
Modelo MD (01): produtividade ~ produção + docentes + mestrados + doutorados + tem_doutorado
modelo01 = lm(produtividade ~ producao + docentes + mestrados + doutorados + tem_doutorado, data = cacc)
tidy(modelo01, conf.int = TRUE, conf.level = 0.95) %>% arrange(-p.value)
## # A tibble: 6 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 mestrados 0.00311 0.00201 1.54 1.27e- 1 -0.000908 0.00713
## 2 doutorados -0.0146 0.00520 -2.80 6.62e- 3 -0.0249 -0.00419
## 3 tem_doutoradoTRUE 0.977 0.164 5.96 1.05e- 7 0.649 1.30
## 4 docentes -0.103 0.0149 -6.93 2.00e- 9 -0.133 -0.0733
## 5 (Intercept) 2.07 0.183 11.4 2.92e-17 1.71 2.44
## 6 producao 0.0335 0.00288 11.6 9.84e-18 0.0277 0.0392
glance(modelo01)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.840 0.828 0.569 70.3 2.65e-25 5 -59.3 133. 149.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
Inicialmente, o modelo explica aproximadamente 84% da variação na produtividade (R² = 0,8399). Para verificar se é possível melhorar o modelo, aplicaremos o método de seleção backward, simplificando-o ao remover a variável que apresentou o maior p-valor (mestrado, p-valor = 0,127).
Modelo MD (01) simplificado 1: produtividade ~ produção + docentes + doutorados + tem_doutorado
modelo01_simplificado1 = lm(produtividade ~ producao + docentes + doutorados + tem_doutorado, data = cacc)
tidy(modelo01_simplificado1, conf.int = TRUE, conf.level = 0.95) %>% arrange(-p.value)
## # A tibble: 5 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 doutorados -0.0107 0.00461 -2.33 2.29e- 2 -0.0199 -0.00153
## 2 tem_doutoradoTRUE 0.964 0.165 5.83 1.69e- 7 0.634 1.29
## 3 docentes -0.0923 0.0133 -6.95 1.73e- 9 -0.119 -0.0658
## 4 (Intercept) 2.11 0.183 11.5 1.38e-17 1.74 2.47
## 5 producao 0.0323 0.00280 11.5 1.20e-17 0.0267 0.0379
glance(modelo01_simplificado1)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.834 0.824 0.575 85.5 8.55e-26 4 -60.6 133. 147.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
A primeira simplificação do modelo resultou em uma leve diminuição na variação explicada, de 83,9% (original) para 83,4% (simplificado). No entanto, o R² ajustado praticamente não mudou, passando de 0,828 para 0,825. Assim, podemos considerar essa simplificação como uma melhoria, pois eliminou uma variável sem alterar significativamente a precisão do modelo. Prosseguindo com a simplificação, agora removeremos a variável doutorados, que possui o maior p-valor.
Modelo MD (01) simplificado 2: produtividade ~ produção + docentes + tem_doutorado
modelo01_simplificado2 = lm(produtividade ~ producao + docentes + tem_doutorado, data = cacc)
tidy(modelo01_simplificado2, conf.int = TRUE, conf.level = 0.95) %>% arrange(-p.value)
## # A tibble: 4 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 tem_doutoradoTRUE 0.951 0.170 5.58 4.36e- 7 0.611 1.29
## 2 docentes -0.0995 0.0133 -7.48 1.78e-10 -0.126 -0.0730
## 3 producao 0.0291 0.00253 11.5 1.01e-17 0.0241 0.0342
## 4 (Intercept) 2.28 0.172 13.3 1.06e-20 1.94 2.63
glance(modelo01_simplificado2)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.821 0.813 0.593 106. 1.01e-25 3 -63.4 137. 148.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
A segunda simplificação resultou em um valor de R² ajustado inferior (82,1%) ao do modelo anterior. Portanto, não devemos remover a variável doutorados do modelo. Dessa forma, podemos considerar o Modelo MD (01) simplificado 1 como a melhor opção, explicando 83,4% da variação na produtividade.
Estabelecendo a segunda relação de variáveis, temos o seguinte modelo:
Modelo MD_pprof (02): produtividade ~ produção + tem_doutorado + mestrados_pprof + doutorados_pprof
modelo02 = lm(produtividade ~ producao + tem_doutorado + mestrados_pprof + doutorados_pprof, data = cacc)
tidy(modelo02, conf.int = TRUE, conf.level = 0.95) %>% arrange(-p.value)
## # A tibble: 5 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 doutorados_pprof -0.0277 0.212 -0.131 0.896 -0.450 0.395
## 2 mestrados_pprof 0.0226 0.0524 0.432 0.667 -0.0820 0.127
## 3 tem_doutoradoTRUE 0.827 0.248 3.34 0.00137 0.333 1.32
## 4 (Intercept) 1.15 0.237 4.85 0.00000764 0.677 1.62
## 5 producao 0.0130 0.00223 5.86 0.000000147 0.00861 0.0175
glance(modelo02)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.677 0.658 0.803 35.6 5.03e-16 4 -85.0 182. 196.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
O modelo explica aproximadamente 67,7% da variação na produtividade (R² = 0,6768). Para simplificá-lo ainda mais, podemos utilizar novamente o método de seleção backward e removeremos a variável com o maior p-valor (doutorados_pprof).
Modelo MD_pprof (02) simplificado 1: produtividade ~ produção + tem_doutorado + mestrados_pprof
modelo02_simplificado1 = lm(produtividade ~ producao + tem_doutorado + mestrados_pprof, data = cacc)
tidy(modelo02_simplificado1, conf.int = TRUE, conf.level = 0.95) %>% arrange(-p.value)
## # A tibble: 4 × 7
## term estimate std.error statistic p.value conf.low conf.high
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 mestrados_pprof 0.0221 0.0519 0.425 6.72e- 1 -0.0814 0.126
## 2 tem_doutoradoTRUE 0.815 0.228 3.58 6.39e- 4 0.361 1.27
## 3 (Intercept) 1.16 0.231 5.01 4.01e- 6 0.696 1.62
## 4 producao 0.0129 0.00175 7.36 2.99e-10 0.00938 0.0164
glance(modelo02_simplificado1)
## # A tibble: 1 × 12
## r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.677 0.663 0.797 48.2 6.66e-17 3 -85.0 180. 191.
## # ℹ 3 more variables: deviance <dbl>, df.residual <int>, nobs <int>
Após a primeira simplificação, podemos observar que o R² ajustado (0,6767) é bem próximo ao R² original (0,6768). Portanto, podemos considerar que o modelo simplificado se torna melhor devidoa redução na quantidade de variáveis.
O gráfico abaixo mostra uma análise dos erros residuais para entender a diferença entre os valores reais e previstos da produtividade. É importante notar que resíduos próximos ao eixo X (ou seja, próximos de zero) indicam uma boa precisão do modelo. Considerando o melhor modelo para cada caso discutido (Modelo MD (01) simplificado 1 e Modelo MD_pprof (02) Simplificado 1), observamos o seguinte:
res = cacc %>% gather_residuals(modelo01_simplificado1,modelo02_simplificado1)
pastel_colors <- c("#FDBE85", "#B3CDE3")
# Crie o gráfico com as novas cores
res %>%
ggplot(aes(x = produtividade, y = resid, color = model)) +
geom_point(size = 3, alpha = 0.8) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
scale_color_manual(
name = "Modelo:",
labels = c("Modelo MD (01) simplificado 1", "Modelo MD_pprof (02) Simplificado 1"),
values = pastel_colors
) +
theme_minimal()
Apesar de não haver uma diferença visual significativa entre os dois modelos no gráfico apresentado acima, o Modelo MD (01) simplificado 1 explica aproximadamente 83,4% da variância e pode ser levado como o mais confiável dentre os modelos analisados nesse laboratório.o mais confiável dentre os analisados.
Nesse laboratório, utilizamos a técnica de regressão múltipla para analisar se as variáveis docentes, produção, tem_doutorado, doutorados têm uma associação significativa com a produtividade. Os resultados indicam que um modelo com esses quatro preditores, no formato:
\[ \text{produtividade} = 0.032 \times \text{produção} - 0.092 \times \text{docentes} - 0.01 \times \text{doutorados} + 0.963 \times \text{tem_doutorado} \]
Tal modelo linear explica aproximadamente 83,4% da variância da produtividade (R² = 0,834).
Segundo o modelo apresentado, podemos observar que a produtividade pode depender fortemente da variável tem_doutorado, já que apresenta o maior coeficiente. Já as demais variáveis influenciam pouco tanto positivamente quanto negativamente.