Template de Código R:

Regressão Logística para Fatores de Risco Este script utiliza o banco de dados nativo Pima.tr para identificar os fatores de risco (glicose, IMC e gestações) para o desfecho diabetes, ajustado pela idade.

  1. Preparação: Pacotes e Carregamento de Dados O primeiro passo é garantir que o ambiente R esteja pronto e que o conjunto de dados seja carregado em apenas duas linhas, eliminando o problema de importação de arquivos.
# ----------------------------------------------------
# 1. INSTALACAO E CARREGAMENTO DE PACOTES
# ----------------------------------------------------

# O pacote MASS contem o dataset Pima.tr
# O pacote gtsummary facilita a criacao de tabelas prontas para publicacao
# O pacote broom é util para extrair dados do modelo para o Forest Plot

#install.packages("MASS")
#install.packages("gtsummary")
#install.packages("broom")
#install.packages("dplyr") # Para manipulacao de dados simples
#install.packages("ggplot2") # Para o Forest Plot (base grafica)

# Carregar os pacotes instalados
library(MASS)
library(gtsummary)
## 
## Anexando pacote: 'gtsummary'
## O seguinte objeto é mascarado por 'package:MASS':
## 
##     select
library(broom)
library(dplyr)
## 
## Anexando pacote: 'dplyr'
## 
## O seguinte objeto é mascarado por 'package:MASS':
## 
##     select
## Os seguintes objetos são mascarados por 'package:stats':
## 
##     filter, lag
## Os seguintes objetos são mascarados por 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)

# ----------------------------------------------------
# 2. CARREGAMENTO E INSPECÃO DO DATASET PIMA.TR
# ----------------------------------------------------

# Carrega o conjunto de dados Pima.tr (200 observacoes de mulheres Pima)
data(Pima.tr)

# Inspecao inicial da estrutura dos dados
# O 'type' é nosso DESFECHO (Yes/No para Diabetes)
str(Pima.tr)
## 'data.frame':    200 obs. of  8 variables:
##  $ npreg: int  5 7 5 0 0 5 3 1 3 2 ...
##  $ glu  : int  86 195 77 165 107 97 83 193 142 128 ...
##  $ bp   : int  68 70 82 76 60 76 58 50 80 78 ...
##  $ skin : int  28 33 41 43 25 27 31 16 15 37 ...
##  $ bmi  : num  30.2 25.1 35.8 47.9 26.4 35.6 34.3 25.9 32.4 43.3 ...
##  $ ped  : num  0.364 0.163 0.156 0.259 0.133 ...
##  $ age  : int  24 55 35 26 23 52 25 24 63 31 ...
##  $ type : Factor w/ 2 levels "No","Yes": 1 2 1 1 1 2 1 1 1 2 ...
head(Pima.tr)
##   npreg glu bp skin  bmi   ped age type
## 1     5  86 68   28 30.2 0.364  24   No
## 2     7 195 70   33 25.1 0.163  55  Yes
## 3     5  77 82   41 35.8 0.156  35   No
## 4     0 165 76   43 47.9 0.259  26   No
## 5     0 107 60   25 26.4 0.133  23   No
## 6     5  97 76   27 35.6 0.378  52  Yes
# ----------------------------------------------------
# 3. CONSTRUÇÃO DO MODELO MULTIVARIADO DE REGRESSÃO LOGÍSTICA
# ----------------------------------------------------

# Variável Dependente (Desfecho): 'type' (Diabetes Yes/No)
# Variáveis Independentes (Fatores de Risco): glu, bmi, npreg
# Variável de Ajuste: age (idade, como confundidora)

# O comando 'glm' (Generalized Linear Model) com family=binomial
# ajusta o modelo de Regressão Logística.
modelo_logistico <- glm(
  type ~ glu + bmi + npreg + age,
  data = Pima.tr,
  family = binomial
)

# Visualizacao dos resultados do modelo (coeficientes log-odds)
summary(modelo_logistico)
## 
## Call:
## glm(formula = type ~ glu + bmi + npreg + age, family = binomial, 
##     data = Pima.tr)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -9.347438   1.486917  -6.286 3.25e-10 ***
## glu          0.031245   0.006468   4.830 1.36e-06 ***
## bmi          0.094569   0.032700   2.892  0.00383 ** 
## npreg        0.084203   0.062386   1.350  0.17711    
## age          0.036648   0.020302   1.805  0.07105 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 256.41  on 199  degrees of freedom
## Residual deviance: 186.55  on 195  degrees of freedom
## AIC: 196.55
## 
## Number of Fisher Scoring iterations: 5
# ----------------------------------------------------
# 4. TABELA PRONTA PARA PUBLICAÇÃO (Odds Ratio e IC 95%)
# ----------------------------------------------------

# Gera uma tabela formatada, aplicando exponenciacao (eform=TRUE) para
# converter os coeficientes log-odds em Odds Ratios (OR) e seus IC 95%
tabela_publicacao <- modelo_logistico %>%
  tbl_regression(
    exponentiate = TRUE, # Converte o output para Odds Ratio (OR)
    label = list(
      glu ~ "Concentração de Glicose",
      bmi ~ "Índice de Massa Corporal (IMC)",
      npreg ~ "Número de Gestações",
      age ~ "Idade (anos)"
    ),
    conf.level = 0.95 # Define o Intervalo de Confiança de 95%
  ) %>%
  # Adiciona o titulo e a nota explicativa (padrao de publicacao)
  add_n() %>%
  add_global_p() %>%
  modify_caption("**Tabela 1. Regressão Logística Multivariada para Fatores de Risco de Diabetes (N=200)**") %>%
  modify_footnote(update = everything() ~ "OR = Odds Ratio; IC 95% = Intervalo de Confiança de 95%")
## Warning: The `update` argument of `modify_footnote()` is deprecated as of gtsummary
## 2.0.0.
## ℹ Use `modify_footnote(...)` input instead. Dynamic dots allow for syntax like
##   `modify_footnote(!!!list(...))`.
## ℹ The deprecated feature was likely used in the gtsummary package.
##   Please report the issue at <https://github.com/ddsjoberg/gtsummary/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Imprime a tabela no console R (para visualizar)
tabela_publicacao
Tabela 1. Regressão Logística Multivariada para Fatores de Risco de Diabetes (N=200)
Characteristic1 N1 OR1 95% CI1 p-value1
Concentração de Glicose 200 1.03 1.02, 1.05 <0.001
Índice de Massa Corporal (IMC) 200 1.10 1.03, 1.17 0.003
Número de Gestações 200 1.09 0.96, 1.23 0.2
Idade (anos) 200 1.04 1.00, 1.08 0.068
Abbreviations: CI = Confidence Interval, OR = Odds Ratio
1 OR = Odds Ratio; IC 95% = Intervalo de Confiança de 95%
# Você pode exportar esta tabela para Word (.docx)
# tabela_publicacao %>% as_flex_table() %>% flextable::save_as_docx(path = "Tabela_Regressao_Diabetes.docx")
# ----------------------------------------------------
# 5. VISUALIZAÇÃO GRÁFICA: FOREST PLOT
# ----------------------------------------------------

# 5.1. Extrair os dados do modelo no formato tidy (limpo)
dados_plot <- tidy(modelo_logistico, exponentiate = TRUE, conf.int = TRUE) %>%
  filter(term != "(Intercept)") # Remove a linha do Intercepto

# 5.2. Criacao do Forest Plot usando ggplot2
forest_plot <- dados_plot %>%
  # A coluna x e o OR (estimate), o y sao as variaveis (term)
  ggplot(aes(x = estimate, y = term)) +
  
  # Adiciona os Intervalos de Confianca (linhas horizontais)
  geom_errorbar(aes(xmin = conf.low, xmax = conf.high), width = 0.2, size = 1, color = "#1E88E5") +
  
  # Adiciona o Ponto Central (Odds Ratio)
  geom_point(shape = 23, size = 3, fill = "#1E88E5") +
  
  # Adiciona a Linha de Nulo (OR = 1.0)
  geom_vline(xintercept = 1, linetype = "dashed", color = "gray50", size = 1) +
  
  # Rotulos e Temas
  labs(
    title = "Forest Plot dos Fatores de Risco para Diabetes (Regressão Logística)",
    x = "Odds Ratio (OR) e Intervalo de Confiança de 95%",
    y = ""
  ) +
  scale_x_log10(limits = c(0.8, 4)) + # Eixo x em escala log (para simetria)
  theme_minimal() +
  # Destaca o tema
  theme(plot.title = element_text(face = "bold", hjust = 0.5))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Imprime o grafico
print(forest_plot)