7  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

Librerías requeridas: dplyr, flextable, plotly

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).

Nota

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

Tabla 8.1: Tabla 1. Factores y niveles considerados por Narukulla et al. (2024)

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)
Código
#Variables repuesta
DT = c(55, 69, 51, 61, 72, 80, 56, 58,
         53, 67, 75, 55, 58, 61, 63, 66, 65, 66, 62, 67)

DIS30 = c(93, 83.5, 95, 88.7, 82.4, 79, 92.9, 91, 94.4, 83.8, 
            81.8, 92.6, 90.4, 89, 85.9, 84.7, 85.5, 83, 87, 84)

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

Tabla 9.1: Tabla 2. Diseño Central Compuesto con la variable respusta DT reportada en el artículo de Narukulla et al. (2024)

10 Modelo de regresión

Código
desf <- data.frame(des, DT)
mod1 <- lm(DT ~ x1 + x2 + x3 + 
            x1:x2 + x1:x3 + x2:x3 +
            I(x1^2) + I(x2^2) + I(x3^2), data = desf)

anova(mod1)
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 ' ' 1

11 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
Narukulla, Sriram, Subhasri Bogadi, Vyshnavi Tallapaneni, Bharat Kumar Reddy Sanapalli, Sanju Sanju, Azmat Ali Khan, Abdul Malik, et al. 2024. «Comparative study between the Full Factorial, Box–Behnken, and Central Composite Designs in the optimization of metronidazole immediate release tablet». Microchemical Journal 207: 111875.
Volver arriba