Librerías requeridas: dplyr, flextable, plotly7 Replicación en R de caso de estudio: Narukulla et al. (2024)
Comparative study between the Full Factorial, Box–Behnken, and Central Composite Designs in the optimization of metronidazole immediate release tablet
8 Artículo de estudio
El artículo de Narukulla et al. (2024) tiene como objetivo la optimización y el análisis del proceso de fabricación de tabletas de metronidazol dentro del marco de Calidad por Diseño (QbD).
En este estudio se emplea un diseño central compuesto, considerando como factores experimentales la cantidad de Povidona K30 (K30), la cantidad de Crospovidona (`CROS`) y la cantidad de estearato de magnesio (`MG_STE`) (véase la Tabla 16.1).
Las matrices del diseño, tanto en unidades codificadas como en unidades naturales, se presentan en la Tabla 16.2. Las variables respuesta analizadas son el tiempo de desintegración (DT) y la Disolución (DIS30).
A continuación, se muestra la réplica del experimento reportado por Narukulla et al. (2024) para la respuesta tiempo de desintegración (DT).
Véase “Guía para la implementación de diseños experimentales en la industria farmacéutica” para una explicación detallada de los cálculos presentados.
| Variables | -alfa | Nivel (-1) | Nivel (0) | Nivel (1) | +alfa | 
|---|---|---|---|---|---|
| Povidone K30 | 4.89 | 10 | 17.5 | 25 | 30.11 | 
| Crospovidone | 6.52 | 13 | 22.5 | 32 | 38.48 | 
| Mg. Stearate | 1.12 | 1.6 | 2.3 | 3 | 3.48 | 
9 Construcción de Diseño Central Compuesto
A continuación se presenta la réplica del artículo presentado por Narukulla et al. (2024)
Código
# Definir alfa
alpha <- 1.414
# Puntos factoriales 
x1 <- c(-1,  1, -1,  1, -1,  1, -1, 1)
x2 <- c(-1, -1,  1,  1, -1, -1, 1, 1)
x3 <- c(-1, -1, -1, -1,  1, 1, 1, 1)
factoriales <- cbind(x1, x2, x3)
# Puntos axiales 
axiales <- rbind(
  c(-alpha, 0, 0),
  c( alpha, 0, 0),
  c(0, -alpha, 0),
  c(0,  alpha, 0),
  c(0, 0, -alpha),
  c(0, 0,  alpha))
# Puntos centro 
centrales <- matrix(0, nrow = 6, ncol = 3)
# Combinar todo
des <- rbind(factoriales, axiales, centrales)| TRAT | K30(c) | CROS(c) | MG_STE(c) | K30(n) | CROS(n) | MG_STE(n) | DT | DIS30 | 
|---|---|---|---|---|---|---|---|---|
| TRAT 1 | -1.000 | -1.000 | -1.000 | 10.00 | 13.00 | 1.60 | 55 | 93.0 | 
| TRAT 2 | 1.000 | -1.000 | -1.000 | 25.00 | 13.00 | 1.60 | 69 | 83.5 | 
| TRAT 3 | -1.000 | 1.000 | -1.000 | 10.00 | 32.00 | 1.60 | 51 | 95.0 | 
| TRAT 4 | 1.000 | 1.000 | -1.000 | 25.00 | 32.00 | 1.60 | 61 | 88.7 | 
| TRAT 5 | -1.000 | -1.000 | 1.000 | 10.00 | 13.00 | 3.00 | 72 | 82.4 | 
| TRAT 6 | 1.000 | -1.000 | 1.000 | 25.00 | 13.00 | 3.00 | 80 | 79.0 | 
| TRAT 7 | -1.000 | 1.000 | 1.000 | 10.00 | 32.00 | 3.00 | 56 | 92.9 | 
| TRAT 8 | 1.000 | 1.000 | 1.000 | 25.00 | 32.00 | 3.00 | 58 | 91.0 | 
| TRAT 9 | -1.414 | 0.000 | 0.000 | 4.89 | 22.50 | 2.30 | 53 | 94.4 | 
| TRAT 10 | 1.414 | 0.000 | 0.000 | 30.11 | 22.50 | 2.30 | 67 | 83.8 | 
| TRAT 11 | 0.000 | -1.414 | 0.000 | 17.50 | 6.52 | 2.30 | 75 | 81.8 | 
| TRAT 12 | 0.000 | 1.414 | 0.000 | 17.50 | 38.48 | 2.30 | 55 | 92.6 | 
| TRAT 13 | 0.000 | 0.000 | -1.414 | 17.50 | 22.50 | 1.12 | 58 | 90.4 | 
| TRAT 14 | 0.000 | 0.000 | 1.414 | 17.50 | 22.50 | 3.48 | 61 | 89.0 | 
| TRAT 15 | 0.000 | 0.000 | 0.000 | 17.50 | 22.50 | 2.30 | 63 | 85.9 | 
| TRAT 16 | 0.000 | 0.000 | 0.000 | 17.50 | 22.50 | 2.30 | 66 | 84.7 | 
| TRAT 17 | 0.000 | 0.000 | 0.000 | 17.50 | 22.50 | 2.30 | 65 | 85.5 | 
| TRAT 18 | 0.000 | 0.000 | 0.000 | 17.50 | 22.50 | 2.30 | 66 | 83.0 | 
| TRAT 19 | 0.000 | 0.000 | 0.000 | 17.50 | 22.50 | 2.30 | 62 | 87.0 | 
| TRAT 20 | 0.000 | 0.000 | 0.000 | 17.50 | 22.50 | 2.30 | 67 | 84.0 | 
10 Modelo de regresión
Código
Analysis of Variance Table
Response: DT
          Df Sum Sq Mean Sq F value    Pr(>F)    
x1         1 241.19  241.19 41.9925 7.071e-05 ***
x2         1 510.70  510.70 88.9146 2.716e-06 ***
x3         1  97.72   97.72 17.0133  0.002061 ** 
I(x1^2)    1  22.27   22.27  3.8773  0.077263 .  
I(x2^2)    1   6.06    6.06  1.0556  0.328423    
I(x3^2)    1  27.12   27.12  4.7219  0.054892 .  
x1:x2      1  12.50   12.50  2.1763  0.170927    
x1:x3      1  24.50   24.50  4.2656  0.065798 .  
x2:x3      1  84.50   84.50 14.7118  0.003289 ** 
Residuals 10  57.44    5.74                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 111 Gráficos de superficie
A continaución, se muestra el código del gráfico relacionado Povidona K30 y crospovidona para la variable respuesta Tiempo de desintegración:
Código
# 1. Crear secuencia codificada
x1_vals <- seq(-1.414, 1.414, length.out = 50)
x2_vals <- seq(-1.414, 1.414, length.out = 50)
x3_fixed <- 0  # Mg. Stearate codificado
# 2. Expandir grid
grid <- expand.grid(x1 = x1_vals,
                    x2 = x2_vals)
grid$x3 <- x3_fixed
# 3. Predecir DT
grid$DT_hat <- predict(mod1, newdata = grid)
# 4. Convertir a matriz
z_matrix <- matrix(grid$DT_hat, nrow = length(x2_vals), ncol = length(x1_vals), byrow = TRUE)
# 5. Transformar codificados a valores naturales (de la tabla)
decode <- function(x_cod, low, high) {
  center <- (as.numeric(high) + as.numeric(low)) / 2
  half_range <- (as.numeric(high) - as.numeric(low)) / 2
  return(x_cod * half_range + center)
}
# Valores naturales para ejes
x1_nat <- decode(x1_vals, 10, 25)     # Povidone K30
x2_nat <- decode(x2_vals, 13, 32)     # Crospovidone
# 6. Graficar superficie
fig <- plot_ly(
  x = ~x1_nat,
  y = ~x2_nat,
  z = ~z_matrix,
  type = "surface",
  contours = list(
    z = list(
      show = TRUE,
      usecolormap = TRUE,
      highlightcolor = "black",
      project = list(z = TRUE),
      width = 3  # más grueso
    )
  ),
  showscale = TRUE
)
# 7. Etiquetas con nombres naturales
fig <- fig %>% layout(
  title = "Superficie de DT: Povidone K30 vs Crospovidone",
  scene = list(
    xaxis = list(title = "Povidone K30 (%)"),
    yaxis = list(title = "Crospovidone (%)"),
    zaxis = list(title = "Tiempo de desintegración (s)")
  )
)
fig