Bloqueio da bainha dos músculos retos abdominais guiado por ultrassom em hernioplastias umbilicais ambulatoriais: uma análise comparativa do uso de clonidina como adjuvante — estudo clínico prospectivo randomizado

1 🏥 Introdução

As hérnias umbilicais constituem uma das indicações cirúrgicas mais prevalentes, sendo frequentemente tratadas em regime ambulatorial. O bloqueio da bainha dos músculos retos abdominais (BMRA) guiado por ultrassom tem se destacado como técnica promissora. A clonidina, um agonista α2-adrenérgico, é investigada como adjuvante para potencializar a analgesia.

2 🔄 Fluxograma CONSORT

O diagrama abaixo detalha o fluxo de participantes através do ensaio clínico.

# --- Leitura e Limpeza dos Dados ---
data_path <- "RSB_clonidine_39.csv" 

if(file.exists(data_path)) {
  dados <- readr::read_csv(data_path, show_col_types = FALSE)
} else {
  stop(paste("ERRO FATAL: Arquivo", data_path, "não encontrado."))
}

# Tratamento das Variáveis
dados <- dados %>%
  mutate(
    group = factor(randomization_group, levels = c(0, 1), labels = c("BMRA", "BMRA-CLO")),
    sexo   = factor(sex, levels = c(1, 0), labels = c("M", "F")),
    idade  = age,
    peso   = weight,
    altura = height,
    imc    = bmi, 
    asa    = factor(asa_ps, levels = c(1, 2), labels = c("I", "II"), ordered = TRUE),
    fentanyl_per_kg = fentanyl / weight
  )

# Comorbidades
get_bin <- function(x) factor(x, levels = c(0, 1), labels = c("Nao", "Sim"))

dados <- dados %>%
  mutate(
    HAS = get_bin(HAS),
    DM = get_bin(DM),
    Asma = get_bin(Asma),
    Dislipidemia = get_bin(Dislipidemia),
    Hipotireoidismo = get_bin(Hipotireoidismo),
    Hipertireoidismo = get_bin(Hipertireoidismo),
    IRC = get_bin(`Insuficiência Renal`),
    Epilepsia = get_bin(Epilepsia),
    Ansiedade = get_bin(Ansiedade),
    Depressao = get_bin(`Depressão`),
    Anemia = get_bin(Anemia),
    ArtriteReumatoide = get_bin(`Artrite Reumatóide`),
    Obesidade = get_bin(Obesidade)
  )

3 👥 Caracterização da Amostra

A tabela abaixo resume as características demográficas e clínicas dos pacientes.

# --- Funções Auxiliares ---
fmt_mean_sd <- function(x) {
  if (all(is.na(x))) return("—")
  sprintf("%.2f ± %.2f", mean(x, na.rm=TRUE), sd(x, na.rm=TRUE))
}
fmt_n_pct <- function(n, d) {
  if (is.na(n) || d == 0) return("0 (0.0%)")
  sprintf("%d (%.1f%%)", n, 100*n/d)
}
fmt_p_sym <- function(p, sym) {
  if(is.na(p)) return("")
  txt <- ifelse(p < 0.001, "<0.001", sprintf("%.3f", p))
  if(p < 0.05) txt <- paste0("**", txt, "**")
  paste0(txt, "<sup>", sym, "</sup>")
}

# Testes Estatísticos
get_test_cont <- function(x, g) {
  if(all(is.na(x))) return(list(p=NA, sym=""))
  norm <- tryCatch(tapply(x, g, function(v) shapiro.test(v)$p.value > 0.05), error=function(e) FALSE)
  if(all(unlist(norm), na.rm=TRUE)) {
    list(p = t.test(x ~ g)$p.value, sym = "&dagger;") 
  } else {
    list(p = wilcox.test(x ~ g)$p.value, sym = "&Dagger;") 
  }
}

get_test_cat <- function(x, g) {
  tbl <- table(x, g)
  if(length(tbl) < 4) return(list(p=NA, sym=""))
  if(any(chisq.test(tbl)$expected < 5, na.rm=TRUE)) {
    list(p = fisher.test(tbl, simulate.p.value=TRUE)$p.value, sym = "&sect;") 
  } else {
    list(p = chisq.test(tbl)$p.value, sym = "*") 
  }
}

# --- Construção da Tabela ---
N_grupo <- table(dados$group)
col_g1 <- sprintf("BMRA (n=%d)", N_grupo["BMRA"])
col_g2 <- sprintf("BMRA-CLO (n=%d)", N_grupo["BMRA-CLO"])
linhas <- list()

vars_cont <- c("idade", "peso", "altura", "imc")
labs_cont <- c("Idade (anos)", "Peso (kg)", "Altura (m)", "IMC (kg/m²)")

for(i in 1:4) {
  v <- vars_cont[i]
  res <- get_test_cont(dados[[v]], dados$group)
  linhas[[v]] <- tibble(
    Var = labs_cont[i],
    G1 = fmt_mean_sd(dados[[v]][dados$group=="BMRA"]),
    G2 = fmt_mean_sd(dados[[v]][dados$group=="BMRA-CLO"]),
    P  = fmt_p_sym(res$p, res$sym)
  )
}

res_sex <- get_test_cat(dados$sexo, dados$group)
linhas[["sex_m"]] <- tibble(Var="Sexo Masculino", 
                            G1=fmt_n_pct(sum(dados$sexo=="M" & dados$group=="BMRA"), N_grupo[1]),
                            G2=fmt_n_pct(sum(dados$sexo=="M" & dados$group=="BMRA-CLO"), N_grupo[2]),
                            P = fmt_p_sym(res_sex$p, res_sex$sym))

res_asa <- get_test_cat(dados$asa, dados$group)
linhas[["asa_1"]] <- tibble(Var="ASA I",
                            G1=fmt_n_pct(sum(dados$asa=="I" & dados$group=="BMRA"), N_grupo[1]),
                            G2=fmt_n_pct(sum(dados$asa=="I" & dados$group=="BMRA-CLO"), N_grupo[2]),
                            P = fmt_p_sym(res_asa$p, res_asa$sym))

vars_com <- c("HAS","DM","Asma","Dislipidemia","Hipotireoidismo","Hipertireoidismo","IRC","Epilepsia","Ansiedade","Depressao","Anemia","Obesidade")
labs_com <- c("Hipertensão","Diabetes","Asma","Dislipidemia","Hipotireoidismo","Hipertireoidismo","Insuf. Renal","Epilepsia","Ansiedade","Depressão","Anemia","Obesidade")

for(i in 1:length(vars_com)) {
  v <- vars_com[i]
  if(!v %in% names(dados)) next
  n_tot <- sum(dados[[v]] == "Sim", na.rm=TRUE)
  if(n_tot == 0) next 
  
  res <- get_test_cat(dados[[v]], dados$group)
  n1 <- sum(dados[[v]] == "Sim" & dados$group=="BMRA", na.rm=TRUE)
  n2 <- sum(dados[[v]] == "Sim" & dados$group=="BMRA-CLO", na.rm=TRUE)
  
  linhas[[v]] <- tibble(
    Var = labs_com[i],
    G1 = fmt_n_pct(n1, N_grupo[1]),
    G2 = fmt_n_pct(n2, N_grupo[2]),
    P = fmt_p_sym(res$p, res$sym)
  )
}

Tabela1_Final <- bind_rows(linhas)
names(Tabela1_Final) <- c("Variável", col_g1, col_g2, "Valor-p")
Tabela1_Final <- Tabela1_Final %>% mutate(across(everything(), ~iconv(as.character(.), to="UTF-8")))
names(Tabela1_Final) <- iconv(names(Tabela1_Final), to="UTF-8")

Tabela1_Final %>%
  kbl(align = c("l","c","c","c"), booktabs = TRUE, escape = FALSE, 
      caption = "<span style='font-size:16px; color:#2C3E50; font-weight:bold'>Tabela 1 — Características Basais</span>") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE, font_size = 14) %>%
  row_spec(0, bold = TRUE, color = "white", background = "#2C3E50") %>%
  column_spec(1, bold = TRUE, width = "20em", color = "#2C3E50") %>%
  footnote(general = "Dados: média &plusmn; DP ou n (%). <sup>&dagger;</sup> T-Student; <sup>*</sup> Qui-quadrado.", escape = FALSE)
Table 3.1: Tabela 1 — Características Basais
Variável BMRA (n=19) BMRA-CLO (n=20) Valor-p
Idade (anos) 44.95 ± 10.46 43.55 ± 12.24 0.703
Peso (kg) 77.47 ± 15.02 73.48 ± 12.21 0.371
Altura (m) 1.67 ± 0.09 1.66 ± 0.08 0.830
IMC (kg/m²) 27.61 ± 3.78 26.45 ± 3.47 0.329
Sexo Masculino 9 (47.4%) 11 (55.0%) 0.876*
ASA I 4 (21.1%) 6 (30.0%) 0.716§
Hipertensão 9 (47.4%) 5 (25.0%) 0.262*
Diabetes 1 (5.3%) 2 (10.0%) 1.000§
Asma 1 (5.3%) 0 (0.0%) 0.487§
Dislipidemia 1 (5.3%) 0 (0.0%) 0.487§
Hipertireoidismo 0 (0.0%) 1 (5.0%) 1.000§
Ansiedade 0 (0.0%) 2 (10.0%) 0.487§
Depressão 0 (0.0%) 2 (10.0%) 0.487§
Obesidade 2 (10.5%) 0 (0.0%) 0.231§
Note:
Dados: média ± DP ou n (%). T-Student; * Qui-quadrado.
Nota: Os grupos foram homogêneos em relação às características demográficas e clínicas basais (p > 0.05).

4 📊 Visualizações e Análise Longitudinal

Perfil Etário

5 Evolução da Dor (EVN)

Interpretação: Os escores de dor mantiveram-se baixos (< 4) em ambos os grupos. Não houve diferença estatística consistente entre os grupos.

6 Qualidade de Recuperação (QoR-15)

Relevância Clínica: Apesar da recuperação progressiva, a diferença entre os grupos permaneceu dentro da margem de irrelevância clínica (MCID < 8 pontos).

7 💊 Desfechos do Estudo (Tabela 2)

Esta tabela sumariza os principais resultados intra e pós-operatórios.

# --- Funções de Formatação (Estilo Híbrido) ---
fmt_np <- function(x) {
  x <- as.numeric(x[!is.na(x)])
  if(length(x)==0) return("—")
  if(all(floor(x)==x)) sprintf("%.0f (%.0f-%.0f) [%.0f-%.0f]", median(x), quantile(x,0.25), quantile(x,0.75), min(x), max(x))
  else sprintf("%.1f (%.1f-%.1f) [%.1f-%.1f]", median(x), quantile(x,0.25), quantile(x,0.75), min(x), max(x))
}
fmt_p <- function(x) {
  x <- as.numeric(x[!is.na(x)])
  if(length(x)==0) return("—")
  sprintf("%.2f ± %.2f", mean(x), sd(x))
}

get_row_t2 <- function(lbl, col, type="auto") {
  if(!col %in% names(dados)) return(NULL)
  x <- dados[[col]]; g <- dados$group
  v1 <- x[g=="BMRA"]; v2 <- x[g=="BMRA-CLO"]
  if(type == "np") {
    p <- tryCatch(wilcox.test(x ~ g)$p.value, error=function(e) NA)
    t1 <- fmt_np(v1); t2 <- fmt_np(v2); s <- "&Dagger;"
  } else {
    p <- tryCatch(t.test(x ~ g)$p.value, error=function(e) NA)
    t1 <- fmt_p(v1); t2 <- fmt_p(v2); s <- "&dagger;"
  }
  ptxt <- ifelse(p < 0.001, "<0.001", sprintf("%.3f", p))
  if(!is.na(p) && p < 0.05) ptxt <- paste0("**", ptxt, "**")
  tibble(Var = lbl, !!col_g1 := t1, !!col_g2 := t2, `Valor-p` = paste0(ptxt, "<sup>", s, "</sup>"))
}

l_intra <- bind_rows(
  get_row_t2("Propofol (mg)", "propofol", "np"),
  get_row_t2("Fentanil (µg)", "fentanyl", "auto"),
  get_row_t2("Fentanil (µg/kg)", "fentanyl_per_kg", "auto"),
  get_row_t2("Tempo Cirurgia (min)", "surgery_time_min", "auto")
)
l_hemo <- bind_rows(
  get_row_t2("PAS Inicial", "sys_bp_start", "auto"),
  get_row_t2("PAM Inicial", "mean_bp_start", "auto"),
  get_row_t2("FC Inicial", "hr_start", "auto"),
  get_row_t2("PAS Final", "sys_bp_end", "auto"),
  get_row_t2("PAM Final", "mean_bp_end", "auto"),
  get_row_t2("FC Final", "hr_end", "auto")
)
l_recup <- bind_rows(
  get_row_t2("RASS (SRPA)", "rass_rpa", "np"),
  get_row_t2("QoR-15 (24h)", "QoR-15 24h", "np"),
  get_row_t2("EVN Movimento (24h)", "NRS 24h m", "np")
)

Tab2 <- bind_rows(l_intra, l_hemo, l_recup) %>% mutate(across(everything(), ~iconv(as.character(.), to="UTF-8")))

Tab2 %>%
  kbl(align=c("l","c","c","c"), booktabs=T, escape=F, caption="<span style='color:#2C3E50;font-weight:bold'>Tabela 2 — Desfechos Clínicos</span>") %>%
  kable_styling(bootstrap_options=c("striped","hover"), full_width=F, font_size=14) %>%
  row_spec(0, bold=T, color="white", background="#2C3E50") %>%
  column_spec(1, bold=T, width="18em", color="#2C3E50") %>%
  pack_rows("Intraoperatório", 1, 4, label_row_css = "background-color: #ecf0f1; color: #2C3E50; font-weight: bold;") %>%
  pack_rows("Hemodinâmica", 5, 10, label_row_css = "background-color: #ecf0f1; color: #2C3E50; font-weight: bold;") %>%
  pack_rows("Pós-Operatório", 11, 13, label_row_css = "background-color: #ecf0f1; color: #2C3E50; font-weight: bold;") %>%
  footnote(general="Média &plusmn; DP ou Mediana (IQR) [Min-Max]. <sup>&dagger;</sup> T-test; <sup>&Dagger;</sup> Mann-Whitney.", escape=F)
Table 7.1: Tabela 2 — Desfechos Clínicos
Var BMRA (n=19) BMRA-CLO (n=20) Valor-p
Intraoperatório
Propofol (mg) 0 (0-0) [0-60] 0 (0-0) [0-30] 0.523
Fentanil (µg) 109.74 ± 34.01 61.00 ± 20.49 <0.001
Fentanil (µg/kg) 1.44 ± 0.44 0.84 ± 0.26 <0.001
Tempo Cirurgia (min) 50.47 ± 15.85 47.75 ± 20.05 0.640
Hemodinâmica
PAS Inicial 138.26 ± 18.93 136.85 ± 15.80 0.802
PAM Inicial 104.51 ± 12.67 102.45 ± 14.37 0.637
FC Inicial 72.42 ± 12.79 79.05 ± 19.91 0.223
PAS Final 115.00 ± 19.40 109.30 ± 15.19 0.316
PAM Final 89.98 ± 15.94 83.57 ± 12.91 0.177
FC Final 68.53 ± 14.22 67.50 ± 13.05 0.816
Pós-Operatório
RASS (SRPA) -1 (-1–1) [-2-0] -1 (-1-0) [-3-0] 0.276
QoR-15 (24h) 144 (138-147) [123-150] 146 (143-149) [135-150] 0.158
EVN Movimento (24h) 3 (3-4) [0-7] 3 (3-4) [0-6] 0.896
Note:
Média ± DP ou Mediana (IQR) [Min-Max]. T-test; Mann-Whitney.
Resultado Principal: Houve uma redução estatisticamente significativa no consumo de Fentanil no grupo com Clonidina (p < 0.001), sem repercussão hemodinâmica grave ou atraso na recuperação (RASS).

8 ✅ Conclusão

A adição de clonidina ao bloqueio da bainha do reto em hernioplastias umbilicais resultou em uma poupança significativa de opioides intraoperatórios, sem aumentar o tempo de cirurgia ou causar instabilidade hemodinâmica severa. No entanto, não houve benefício clínico adicional na qualidade da recuperação (QoR-15) ou nos escores de dor pós-operatória em comparação ao bloqueio isolado.