Descripción

En este documento se muestra una propuesta de cálculo de tamaño muestral basado en precisión para ensayos controlados aleatorizados. El objetivo es estimar la muestra necesaria para un valor deseado de la mitad de la amplitud del intervalo de confianza (95%) de una diferencia de medias ajustada entre dos tratamientos (diseño ANCOVA). El cálculo permite tener en cuenta una corrección para comparaciones múltiples según Bonferroni.

El cálculo se basa en diferencias ajustadas entre dos tratamientos debido a que esas diferencias de medias ajustadas son en las que normalmente se basan los investigadores para concluir en sus estudios, y los clínicos para tomar decisiones en su práctica, más que basarse en los valores de eta cuadrado parcial de las interacciones tiempo-por-grupo.

Con las fórmulas se puede obtener:

La propuesta esta basada en simulaciones de MonteCarlo con 10,000 replicaciones. Se asume un ratio de asignación entre los grupos de 1:1, una misma desviación típica para las mediciones basales y post-tratamiento en ambos grupos, y la distribución normal.

NOTA IMPORTANTE: El tamaño muestral es para dos grupos, es decir, si se especifica 100 sujetos, son 50 por grupo. Esto es así aunque se utilice la opcion de corrección de Bonferroni. De manera que, si se usan tres grupos y el tamaño muestral especificado es de 100 y con ese obtenemos la amplitud de intervalo deseada, la muestral final no serían 100 sujetos, sino 150 sujetos (ya que son 50 por grupo).

Guía de utilización

Para poder utilizar las funciones creadas es necesario instalar previamente los siguientes paquetes, mediante el siguiente código:

install.packages("MASS")
install.packages("randomizr")
install.packages("MonteCarlo")
library(MASS)
library(randomizr)
library(MonteCarlo)

Se debe copiar el código de cada función de los tamaños muestrales de este documento para poder utilizarlas luego en R, es decir, instalación manual, no como cuando se instala un paquete de R.

Hay dos funciones, la primera SimANCOVA() no se utilizará directamente, pero es necesaria para que funcione adecuadamente la segunda función. La segunda, SampleSizeADJMeanCI() es la que se utilizará para estimar la muestra necesaria.

Dentro de SampleSizeADJMeanCI() deben especificarse los siguientes parámetros: cor, sd, ci, nmin, nmax, by, comparisons = 1

Explicación del procedimiento a seguir

Debido al tiempo necesario para realizar los cálculos, no recomiendo usar rangos amplios de valores de tamaño muestral, sino probar con un valor concreto para estimar el valor de la mediana de la mitad de la amplitud del IC al 95% y a partir de ahí seleccionar el rango de valores para hacer los cálculos para obtener las distintas probabilidades y selecionar la muestral final.

Para especificar que los cálculos solo se hagan con un valor de tamaño muestral, debemos poner el mismo valor en nmin y nmax y especificar by = 1. Por ejemplo: nimn = 50, nmax = 50, by = 1.

El razonamiento a seguir es el siguiente. Si deseamos > 50% de probabilidad de un obtener una amplitud igual o menor al valor deseado (ci), entonces el valor de nmin debe ser uno cuyo valor de la mediana de la mitad de la amplitud del IC al 95% para n = nmin sea inferior a ci.

Por ejemplo, imaginemos que tenemos los siguientes valores esperados y deseado de ci:

  • cor = 0.5
  • sd = 20
  • ci = 8

Queremos una probabilidad de obtener un ci igual o menor a 8 del 80%, entonces, probamos con un valor de tamaño muestral = 60 sujetos, para ver que valor estimado tenemos de la mediana de ci, obteniendo como resultado: 8.97. Ya sabemos que es un valor demasiado pequeño. De modo que incrementamos la muestra bastante, a por ejemplo 100 sujetos, obteniendo ahora una mediana de: 6.89, con una probabilidad de un valor de ci igual o inferior a 8 de 98.58%. Este valor ya está por debajo del deseado de 8, de forma que ahora ya especificamos un rango de valores para estimar las probabilidades de obtener ese ci = 8, por ejemplo, de 70 a 90 sujetos, con incrementos de by = 10, obteniendo las siguientes probabilidades:

  • n = 70, probabilidad = 35.07%
  • n = 80, probabilidad = 66.85%
  • n = 90, probabilidad = 90.13%

Con esos datos, observamos que nuestra muestra deseada estará entre 80 y 90 sujetos, probamos ahora dentro de dicho rango de valores en incrementos de 4:

  • n = 84, probabilidad = 78.24%
  • n = 88, probabilidad = 87.11%

De modo que decidimos finalmente que la muestra a reclutar sea de 86 sujetos. NOTA! A este tamaño muestral habría que añadirle el porcentaje esperado de pérdidas. Por ejemplo, si asumimos un 15%, el tamaño muestral final para dos grupos es de 86/0.85 = 102 sujetos (51 por grupo).

Nota sobre el cálculo basado en una mediana de ic deseada, sin tener en cuenta probabilidad

Si deseamos calcular el tamaño muestral para una mediana de ic esperada, entonces el valor de ci a especificar en la función SampleSizeADJMeanCI() no es relevante, ya que ese valor solo se utiliza para calcular la probabilidad de obtener un valor igual o menor a ese ci. Entonces, en este caso, dejaríamos ese valor sin especificar, dejando el predefinido de 8.

Funciones para los cálculos

Función 1 SimANCOVA()

SimANCOVA <- function(n,cor,sd,comparisons){
  cov <- (sd^2)*cor
  dataAncova <- mvrnorm(n = n, mu = c(100,130), Sigma = matrix(ncol=2, nrow=2, c(sd^2,cov,cov,sd^2)))
  Treatment <- complete_ra(N = n)
  Baseline <- dataAncova[,1]
  Post <- dataAncova[,2]
  FrameAncova <- as.data.frame(cbind(Treatment, Baseline, Post))
  ancovamodel <- lm(Post ~ Baseline + Treatment, data = FrameAncova)
  sig <- 1-(0.05/comparisons)
  confinterval <- confint(ancovamodel, "Treatment", level = sig)
  halfwidthCI <- abs((confinterval[2] - confinterval[1])/2)
  return(list("halfwidthCI"=halfwidthCI))
}

Función 2 SampleSizeADJMeanCI()

SampleSizeADJMeanCI <- function(cor=0.5, sd, ci=8, nmin=60, nmax=60, by=10, comparisons = 1){
  require(MonteCarlo)
  require(MASS)
  require(randomizr)
  n <- seq(nmin, nmax, by)
  param_list <- list("n"=n, "cor"=cor, "sd"=sd, "comparisons"=comparisons)
  MC <- MonteCarlo(nrep = 10000, func = SimANCOVA, param_list = param_list)
  MC_Frame <- MakeFrame(MC)
  Probability <- c()
  median_half_width <- c()
  min_half_width <- c()
  max_half_width <- c()
  FirstQuartile <- c()
  ThirdQuartile <- c()
  for (i in 1:length(n)){
    Probability[i] <- sum(MC_Frame$halfwidthCI[MC_Frame$n == n[i]] <= ci)/10000*100
    median_half_width[i] <- median(MC_Frame$halfwidthCI[MC_Frame$n == n[i]])
    min_half_width[i] <- min(MC_Frame$halfwidthCI[MC_Frame$n == n[i]])
    max_half_width[i] <- max(MC_Frame$halfwidthCI[MC_Frame$n == n[i]])
    FirstQuartile[i] <- quantile(MC_Frame$halfwidthCI[MC_Frame$n == n[i]], 0.25)
    ThirdQuartile[i] <- quantile(MC_Frame$halfwidthCI[MC_Frame$n == n[i]], 0.75)
  }
  plot <- plot(x = n, y = Probability)
  results_unified <- as.data.frame(cbind(n, Probability, median_half_width, min_half_width, max_half_width, FirstQuartile, ThirdQuartile))
  return(list(results_unified, plot))
}

La función SampleSizeADJMeanCI() devuelve los siguientes resultados para cada tamaño muestral especificado:

  • Probabilidad para obtener un ci igual o inferior al valor especificado.
  • Mediana esperada de la mitad de la amplitud del IC al 95%.
  • Valor mínimo obtenido en las 10,000 replicaciones de la mitad de la amplitud del IC al 95%.
  • Valor máximo obtenido en las 10,000 replicaciones de la mitad de la amplitud del IC al 95%.
  • Primer y tercer cuartiles obtenidos en las 10,000 replicaciones de la mitad de la amplitud del IC al 95%.