Código
# =============================================================================
# SETUP E PREPARAÇÃO DOS DADOS
# =============================================================================
## Carregamento e verificação de pacotes necessários
pkgs <- c(
"tidyverse", # manipulação de dados e visualização
"gtsummary", # tabelas estatísticas
"readxl", # leitura de arquivos Excel
"janitor", # limpeza de nomes de variáveis
"performance", # diagnósticos de modelos
"qqplotr", # gráficos Q-Q
"PupillometryR" # gráficos violin plot
)
# Verificar se todos os pacotes estão instalados
missing_pkgs <- pkgs[!vapply(pkgs, requireNamespace, logical(1), quietly = TRUE)]
if (length(missing_pkgs) > 0) {
stop("Pacotes ausentes: ", paste(missing_pkgs, collapse = ", "))
}
# Carregar pacotes
invisible(lapply(pkgs, library, character.only = TRUE))
# Configura<U+00E7><U+00F5>es de reprodutibilidade e tema
set.seed(123)
theme_set(theme_minimal())
## Leitura dos dados
df_raw <- readxl::read_excel(
"data/dataset_escoliose_00.xlsx",
sheet = "dados",
na = "" # tratar células vazias como NA
)
## Limpeza dos nomes das variáveis (snake_case)
df <- df_raw |> janitor::clean_names()
# =============================================================================
# CRIAÇÃO DE VARIÁVEIS DERIVADAS
# =============================================================================
## Classificação do escoliômetro: identificar regi<U+00F5>es com deformidade > 10°
# Esta variável indica onde a gibosidade é mais pronunciada
df <- df |>
mutate(
escoliometro_maior_10_graus = case_when(
# Múltiplas regi<U+00F5>es afetadas
(escoliometro_cervical > 10) & (escoliometro_torarica > 10) & (escoliometro_lombar > 10) ~
"cervical_toracica_lombar",
(escoliometro_cervical > 10) & (escoliometro_torarica > 10) ~
"cervical_toracica",
(escoliometro_cervical > 10) & (escoliometro_lombar > 10) ~
"cervical_lombar",
(escoliometro_torarica > 10) & (escoliometro_lombar > 10) ~
"toracica_lombar",
# Região única afetada
(escoliometro_cervical > 10) ~ "cervical",
(escoliometro_torarica > 10) ~ "toracica",
(escoliometro_lombar > 10) ~ "lombar",
# Nenhuma região > 10° (referência)
TRUE ~ "normal"
)
)
# Variáveis categóricas não são mais utilizadas nos modelos finais
# (mantendo apenas as variáveis numéricas conforme plano de análise)
## Cálculo do Índice de Massa Corporal (IMC)
df <- df |>
mutate(imc = peso / (altura)^2) # altura deve estar em metros
# =============================================================================
# DEFINIÇÃO DOS DESFECHOS PRIMÁRIOS
# =============================================================================
## Identificação da maior curva no baseline
# Compara as três regi<U+00F5>es e identifica o maior ângulo de Cobb inicial
df <- df |>
mutate(
# Maior curva entre todas as regi<U+00F5>es medidas
cobb_inicial_maior = pmax(
cobb_toracico_proximal,
cobb_toracica,
cobb_lombar,
na.rm = TRUE
),
# Identificar qual região apresenta a maior curva (para referência)
regiao_cobb_inicial = case_when(
cobb_inicial_maior == cobb_toracico_proximal ~ "toracico_proximal",
cobb_inicial_maior == cobb_toracica ~ "toracica",
cobb_inicial_maior == cobb_lombar ~ "lombar",
TRUE ~ NA_character_
)
)
# =============================================================================
# CRIAÇÃO DAS VARIÁVEIS DE DESFECHO
# =============================================================================
## Variáveis de desfecho para os dois modelos principais
df <- df |>
# DESFECHO CONTÍNUO: Mudan<U+00E7>a na maior curva (em graus)
# Valores negativos = melhora, valores positivos = piora
mutate(delta = maior_curva_6_meses - cobb_inicial_maior) |>
# MODELO 1: MELHORA CLÍNICA (delta ≤ -5°)
mutate(
delta_cat = if_else(delta <= -5, 1, 0),
delta_cat_f = factor(
delta_cat,
levels = c(0, 1),
labels = c("Sem melhora (MCID)", "Melhora (MCID)")
)
) |>
# MODELO 2: PROGRESS<U+00C3>O CLÍNICA (delta ≥ +5°)
mutate(
delta_progression = if_else(delta >= 5, 1, 0),
delta_progression_f = factor(
delta_progression,
levels = c(0, 1),
labels = c("Não progrediu", "Progrediu")
)
)
# Conversão de variáveis para tipos adequados nos modelos
df <- df |>
mutate(
# Variáveis numéricas
idade = as.double(idade),
# Variáveis categóricas (fatores com níveis específicos)
lenke = as.factor(lenke),
risser = as.factor(risser),
sexo = as.factor(sexo),
flexibilidade = as.factor(flexibilidade),
# Escoliômetro: definir "normal" como categoria de referência
escoliometro_maior_10_graus = forcats::fct_relevel(
as.factor(escoliometro_maior_10_graus),
"normal"
)
)