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