## ── 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

Dados da CAPES sobre avaliação da pós-graduação

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,…

Produção e produtividade de artigos

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)

Agora produtividade

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?.

Análise descritiva

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]

Modelos

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

Primeiro Modelo

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>

Simplificação 01

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>

Simplificação 02

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.

Segundo Modelo

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>

Simplificação 01

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.

Análise Residual

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.

Conclusão

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.