El presente documento tiene un doble propósito: analizar críticamente los resultados de la prueba piloto inicial (N=10) y establecer los cimientos metodológicos para un ensayo clínico a mayor escala (N=100) metodológicamente irreprochable.
Los hallazgos del Estudio Piloto La prueba piloto demostró la factibilidad de la intervención, pero el análisis de sus datos revela trampas estadísticas críticas que impiden sacar conclusiones definitivas: 1. Falta de Potencia y Falsos Negativos: Con solo 5 pacientes por brazo, las pruebas estadísticas son “ciegas” ante mejoras clínicas reales (Error Tipo II). 2. Sesgo de Selección Severo: El grupo control no es comparable al de intervención. Es una década más viejo y concentra casi la totalidad de la nefropatía diabética. Cualquier análisis indicará que la intervención es un “éxito”, cuando en realidad solo estamos comparando pacientes jóvenes de progresión lenta contra pacientes mayores diabéticos de declive rápido. 3. Colapso del Ajuste Multivariado: Es matemáticamente imposible “limpiar” el efecto de la diabetes o la edad del efecto del tratamiento usando modelos de regresión en solo 10 pacientes; hacerlo genera colinealidad y estimaciones fisiológicamente imposibles.
La Solución: El Protocolo Ideal Para generar evidencia clínica de alto impacto, proponemos transitar hacia un Ensayo Clínico Controlado Aleatorizado (ECCA) con un tamaño de muestra robusto (N=100). A través de una aleatorización estratificada, garantizaremos que la edad y la diabetes se distribuyan equitativamente. Finalmente, reemplazaremos las limitadas pruebas T por un Modelo Lineal Mixto para Medidas Repetidas (MMRM), el estándar de oro actual para evaluar el verdadero cambio longitudinal en la Tasa de Filtración Glomerular.
A continuación, presentamos el desglose de los datos preliminares y la propuesta estructural del nuevo protocolo.
Con 10 pacientes se formaron dos grupos de la siguiente manera:
A todos los 10 pacientes se les hicieron exámenes de laboratorio antes y después de los 6 meses que duró el estudio (julio 2024 a enero 2025). El dato usado para comparar fue la TASA DE FILTRACIÓN GLOMERULAR (TFG) calculada mediante CKD-EPI (2021 update).
# 1. Cargar librerías necesarias
library(tidyverse)
library(gtsummary)
# 2. Crear base de datos
datos <- data.frame(
id = factor(1:10),
grupo = rep(c("Intervencion", "Control"), each = 5),
edad = c(61, 44, 25, 69, 74, 71, 70, 58, 79, 75),
sexo = factor(c("M", "M", "M", "F", "M", "F", "M", "M", "M", "F")),
comorbilidad = factor(c("IRC sola", "IRC sola", "IRC sola", "HTA", "HTA",
"HTA", "DM+HTA", "HTA", "DM+HTA", "DM+HTA")),
tfg_inicial = c(28.9, 23.1, 74.1, 50.5, 34.4, 28.2, 40.3, 76.1, 67.5, 65.8),
tfg_final = c(26.8, 26.6, 82.0, 55.0, 38.8, 22.2, 39, 66.1, 51.1, 53.0)
) %>%
mutate(delta_tfg = tfg_final - tfg_inicial)
NOTA METODOLÓGICA: Correr pruebas de normalidad (Shapiro-Wilk) o de varianzas (Levene) en n=5 crea un falso sentido de rigor científico. Las pruebas asumen normalidad no por evidencia, sino por falta de potencia estadística para rechazarla.
# 3. Generar la tabla univariada
tabla_univariado <- datos %>%
select(grupo, edad, sexo, comorbilidad, tfg_inicial) %>%
tbl_summary(
by = grupo,
statistic = list(all_continuous() ~ "{median} ({p25}, {p75})",
all_categorical() ~ "{n} ({p}%)"),
label = list(tfg_inicial ~ "TFG Basal (ml/min)")
) %>%
add_p() %>%
bold_labels()
# Imprimir la tabla en el visor
tabla_univariado
| Characteristic | Control N = 51 |
Intervencion N = 51 |
p-value2 |
|---|---|---|---|
| edad | 71 (70, 75) | 61 (44, 69) | 0.2 |
| sexo | >0.9 | ||
| F | 2 (40%) | 1 (20%) | |
| M | 3 (60%) | 4 (80%) | |
| comorbilidad | 0.10 | ||
| DM+HTA | 3 (60%) | 0 (0%) | |
| HTA | 2 (40%) | 2 (40%) | |
| IRC sola | 0 (0%) | 3 (60%) | |
| TFG Basal (ml/min) | 66 (40, 68) | 34 (29, 51) | 0.4 |
| 1 Median (Q1, Q3); n (%) | |||
| 2 Wilcoxon rank sum exact test; Fisher’s exact test | |||
# A. Comparación Intra-grupo (¿Mejoraron los de la intervención?)
res_intervencion <- wilcox.test(
datos$tfg_final[datos$grupo == "Intervencion"],
datos$tfg_inicial[datos$grupo == "Intervencion"],
paired = TRUE
)
# B. Comparación Inter-grupo (¿Es mejor la intervención que el control?)
res_comparativo <- wilcox.test(delta_tfg ~ grupo, data = datos)
cat("P-valor cambio intra-grupo intervencion:", res_intervencion$p.value, "\n")
## P-valor cambio intra-grupo intervencion: 0.125
cat("P-valor diferencia de deltas entre grupos:", res_comparativo$p.value, "\n")
## P-valor diferencia de deltas entre grupos: 0.01587302
Para aislar el efecto de la intervención, intentaríamos ajustar por las variables de confusión (edad, diabetes). La regla empírica exige de 10 a 15 sujetos por cada variable. Intentar meter 5 variables en 10 pacientes genera sobreajuste (Overfitting) y colinealidad perfecta.
library(ggplot2)
# Ajuste solo por TFG inicial (El único que el modelo tolera levemente)
modelo_multivariado <- lm(tfg_final ~ grupo + tfg_inicial, data = datos)
summary(modelo_multivariado)
##
## Call:
## lm(formula = tfg_final ~ grupo + tfg_inicial, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -6.6316 -2.5464 0.2799 1.9646 7.3996
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.11593 5.45723 -1.304 0.23349
## grupoIntervencion 12.41422 3.46533 3.582 0.00895 **
## tfg_inicial 0.96070 0.08903 10.791 1.29e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.145 on 7 degrees of freedom
## Multiple R-squared: 0.9433, Adjusted R-squared: 0.9271
## F-statistic: 58.23 on 2 and 7 DF, p-value: 4.341e-05
# Visualización del Efecto Real
ggplot(datos, aes(x = grupo, y = delta_tfg, fill = grupo)) +
geom_boxplot(alpha = 0.7) +
geom_jitter(width = 0.1, size = 3, color = "black") +
theme_minimal() +
labs(title = "Efecto Aparente de la Intervención en la TFG",
subtitle = "Cambio absoluto (Delta) a los 6 meses condicionado por sesgo base",
y = "Cambio en TFG (Final - Inicial)",
x = "Grupo de Estudio") +
theme(legend.position = "none")
Si ignoramos la matemática y forzamos un modelo ajustando por Edad y
Comorbilidad
(lm(tfg_final ~ grupo + tfg_inicial + edad + comorbilidad)),
el software nos daría resultados absurdos (ej. afirmando que tener “IRC
sola” disminuye la TFG en 23 puntos comparado con tener Diabetes). El
programa compensa matemáticamente el desequilibrio de los grupos
“castigando” variables, demostrando que este sesgo es incurable
a través de estadística en muestras pequeñas.
Para superar estas limitaciones, se planifica un nuevo estudio con evaluaciones al inicio, 3, 6, 9 y 12 meses.
Se llevará a cabo un Ensayo Clínico Controlado Aleatorizado (ECCA), de grupos paralelos, doble ciego y controlado con placebo (o intervención simulada/manejo estándar activo). Este diseño es elegido para minimizar los sesgos de selección, realización y detección. El protocolo será registrado en una plataforma internacional (ej. ClinicalTrials.gov) antes del reclutamiento inicial.
La población objetivo serán pacientes adultos con diagnóstico confirmado de Insuficiencia Renal Crónica (IRC) estadios 3a a 4.
Para detectar una diferencia clínicamente relevante de 5 ml/min en la TFGe entre los grupos a los 6 meses, asumiendo una desviación estándar de 8 ml/min, con un poder estadístico (Beta) del 80% y un nivel de significancia (Alfa) del 5% a dos colas, se requieren 41 pacientes por brazo. Anticipando una tasa de pérdida de seguimiento (abandono) del 20%, el tamaño de muestra total planificado será de 100 pacientes (50 por brazo).
Para evitar el desequilibrio que produzca sesgo de confusión, se realizará una aleatorización estratificada por bloques.
Se establecerá un Comité Independiente de Monitoreo de Datos y Seguridad (DSMB). Este comité realizará un análisis interino a la mitad del reclutamiento. Si la Intervención X demuestra una toxicidad inaceptable o, por el contrario, un beneficio abrumador e innegable, el comité tiene la autoridad ética de detener el ensayo prematuramente.
El siguiente bloque documenta la ejecución del MMRM en el entorno R, simulando los 100 pacientes bien aleatorizados para demostrar que el error de colinealidad desaparece:
library(lme4)
library(lmerTest)
# Simulamos la base "data_tfg" con 100 pacientes aleatorizados estratificadamente
set.seed(123)
data_tfg <- data.frame(
id = factor(1:100),
grupo = factor(rep(c("Control", "Intervencion"), each = 50), levels = c("Control", "Intervencion")),
edad = round(rnorm(100, mean = 60, sd = 10)),
comorbilidad = factor(sample(c("IRC sola", "HTA", "DM+HTA"), 100, replace = TRUE),
levels = c("DM+HTA", "HTA", "IRC sola")),
tfg_inicial = round(rnorm(100, mean = 40, sd = 12), 1)
)
data_tfg$tfg_final <- round(data_tfg$tfg_inicial -
(data_tfg$edad * 0.1) +
ifelse(data_tfg$grupo == "Intervencion", 5, -3) +
rnorm(100, 0, 5), 1)
# FASE DE MMRM (Formato Largo)
data_tfg_larga <- data_tfg %>%
pivot_longer(cols = c(tfg_inicial, tfg_final),
names_to = "tiempo",
values_to = "tfg") %>%
mutate(tiempo = factor(tiempo, levels = c("tfg_inicial", "tfg_final"),
labels = c("Basal", "Mes_6")))
# Ejecución de MMRM
modelo_mmrm_real <- lmer(tfg ~ grupo * tiempo + edad + comorbilidad + (1 | id), data = data_tfg_larga)
print("--- RESULTADOS DEL MMRM (N=100) ---")
## [1] "--- RESULTADOS DEL MMRM (N=100) ---"
summary(modelo_mmrm_real)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: tfg ~ grupo * tiempo + edad + comorbilidad + (1 | id)
## Data: data_tfg_larga
##
## REML criterion at convergence: 1383.1
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.94596 -0.48429 -0.01999 0.52023 2.06227
##
## Random effects:
## Groups Name Variance Std.Dev.
## id (Intercept) 165.71 12.873
## Residual 12.56 3.544
## Number of obs: 200, groups: id, 100
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 46.96766 9.51312 95.26402 4.937 3.37e-06
## grupoIntervencion -1.95344 2.67721 101.89464 -0.730 0.467
## tiempoMes_6 -8.64600 0.70874 98.00000 -12.199 < 2e-16
## edad -0.05428 0.14636 95.00000 -0.371 0.712
## comorbilidadHTA -2.65496 3.59531 95.00000 -0.738 0.462
## comorbilidadIRC sola -4.84454 3.37674 95.00000 -1.435 0.155
## grupoIntervencion:tiempoMes_6 7.05000 1.00231 98.00000 7.034 2.74e-10
##
## (Intercept) ***
## grupoIntervencion
## tiempoMes_6 ***
## edad
## comorbilidadHTA
## comorbilidadIRC sola
## grupoIntervencion:tiempoMes_6 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) grpInt tmpM_6 edad cmrHTA cmIRCs
## grpIntrvncn -0.078
## tiempoMes_6 -0.037 0.132
## edad -0.948 -0.059 0.000
## comrblddHTA -0.346 -0.013 0.000 0.135
## cmrblddIRCs -0.240 -0.035 0.000 0.013 0.618
## grpIntr:M_6 0.026 -0.187 -0.707 0.000 0.000 0.000
Declaración de uso de Inteligencia Artificial: > Para la estructuración metodológica, el diseño del plan de análisis estadístico y la redacción de la sección de Materiales y Métodos de este protocolo, el equipo investigador utilizó como herramienta de asistencia el modelo de lenguaje de Inteligencia Artificial Gemini (Google). Posterior a su uso, los autores humanos revisaron críticamente, editaron y aprobaron exhaustivamente todo el contenido generado, asumiendo la responsabilidad total, ética y científica del diseño del estudio y de la información aquí presentada.