本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》缓释制剂工艺实验室规模包衣工艺优化的R语言解决方案。
实验室规模的包衣工艺优化
进行优化研究以优化前面识别的三个CPP。用工艺筛选相同的设备进行研究。因为雾化气压没有显著影响所以固定为1.6bar。
三因子三水平带6个中心点的完全析因设计需要33次实验。虽然完全析因实验可以获得最高分辨率,面中心的中心复合设计可以减少实验次数并拟合二次模型以评估每个因子的三个水平。设计有一个中心点,没有重复,α = 1.0 ,总共15次实验。表72是实验设计和可接受标准。响应为药物的释放(T20%, T50% and T80%), 细粒和聚集,工艺效率。表73是实验结果的汇总。
影响T20的显著因子
基于ANOVA的结果,影响T20的显著因子为B,C。产品温度和喷雾速度对T20的影响见图41。
影响工艺效率的显著因子
影响工艺效率的显著因子为B,C。二次效应见图42.
基于筛选和优化DOE研究的结果,产品温度,喷雾速率,气流量识别为CPP。设计空间来自多个CQA的共同区域。可接受的范围见表74。
library(rsm)
study5 <- ccd(3, n0 = c(0,1),alpha = "faces",oneblock=TRUE, randomize = FALSE)
> study5
run.order std.order x1.as.is x2.as.is x3.as.is
1 1 1 -1 -1 -1
2 2 2 1 -1 -1
3 3 3 -1 1 -1
4 4 4 1 1 -1
5 5 5 -1 -1 1
6 6 6 1 -1 1
7 7 7 -1 1 1
8 8 8 1 1 1
9 1 1 -1 0 0
10 2 2 1 0 0
11 3 3 0 -1 0
12 4 4 0 1 0
13 5 5 0 0 -1
14 6 6 0 0 1
15 7 7 0 0 0
study5 <- study5[ , 3:5]
library(Vdgraph)
Vdgraph(study5)
y1=c(2.8,2.6,2.5,2.4,3.1,3.0,2.7,2.6,2.7,2.6,2.7,2.5,2.6,2.7,2.6)
y4=c(94,95,93,93,90,90,88,88,93,93,92,91,96,91,93)
study5 <-data.frame(y1,y4,study5)
print( study5, std.order=TRUE)
mod1 <- rsm(y1 ~ SO(x1, x2, x3), data = study5)
summary (mod1)
> summary(mod1)
Call:
rsm(formula = y1 ~ SO(x1, x2, x3), data = study5)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.5955556 0.0340171 76.3016 7.326e-09 ***
x1 -0.0600000 0.0200139 -2.9979 0.0301713 *
x2 -0.1500000 0.0200139 -7.4948 0.0006684 ***
x3 0.1200000 0.0200139 5.9958 0.0018519 **
x1:x2 0.0125000 0.0223762 0.5586 0.6005067
x1:x3 0.0125000 0.0223762 0.5586 0.6005067
x2:x3 -0.0375000 0.0223762 -1.6759 0.1546090
x1^2 0.0555556 0.0394679 1.4076 0.2182707
x2^2 0.0055556 0.0394679 0.1408 0.8935536
x3^2 0.0555556 0.0394679 1.4076 0.2182707
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Multiple R-squared: 0.9573, Adjusted R-squared: 0.8805
F-statistic: 12.46 on 9 and 5 DF, p-value: 0.006289
Analysis of Variance Table
Response: y1
Df Sum Sq Mean Sq F value Pr(>F)
FO(x1, x2, x3) 3 0.40500 0.135000 33.7032 0.0009652
TWI(x1, x2, x3) 3 0.01375 0.004583 1.1442 0.4163274
PQ(x1, x2, x3) 3 0.03056 0.010185 2.5428 0.1698961
Residuals 5 0.02003 0.004006
Lack of fit 5 0.02003 0.004006
Pure error 0 0.00000
Stationary point of response surface:
x1 x2 x3
4.329975 -24.016110 -9.672559
Eigenanalysis:
eigen() decomposition
$`values`
[1] 0.063918333 0.054537370 -0.001789037
$vectors
[,1] [,2] [,3]
x1 0.4706037 0.8716215 0.1371429
x2 -0.2238013 0.2682622 -0.9369890
x3 0.8534900 -0.4102578 -0.3213152
exa<-data.frame(x1=4.329975,x2=-24.016110,x3=-9.672559)
lm.pred<-predict(mod1,exa,interval="prediction",level=0.95)
lm.pred
> lm.pred
fit lwr upr
1 3.686511 -54.1455 61.51852
par(mfrow=c(2,2))
contour(mod1, ~ x1+x2+x3)
par(mfrow=c(1,3))
persp(mod1, ~ x1+x2+x3, zlab=" y1", contours=list(z="bottom"))
ridge<-steepest(mod1, dist=seq(0, 1.7, by=.1),descent=FALSE)
ridge
mod1 <- lm(y1 ~ x1+x2+x3, data = study5)
anova(mod1)
> anova(mod1)
Analysis of Variance Table
Response: y1
Df Sum Sq Mean Sq F value Pr(>F)
x1 1 0.036000 0.036000 6.1554 0.0305186 *
x2 1 0.225000 0.225000 38.4715 6.692e-05 ***
x3 1 0.144000 0.144000 24.6218 0.0004274 ***
Residuals 11 0.064333 0.005848
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
x1.num <-study5$x1
levels(x1.num) <- c(80,140)
x2.num <- study5$x2
levels(x2.num) <- c(28,36)
x3.num <- study5$x3
levels(x3.num) <- c(10,30)
x1.num <- as.numeric(as.character(x1.num))
x2.num <- as.numeric(as.character(x2.num))
x3.num <- as.numeric(as.character(x3.num))
mod1 <- lm(y1 ~ x1.num+x2.num+x3.num, data = study5)
par(mfrow=c(1,3))
contour(mod1, ~ x1.num+x2.num+x3.num)
mod2 <- rsm(y4 ~ SO(x1, x2, x3), data = study5)
summary(mod2)
> summary(mod2)
Call:
rsm(formula = y4 ~ SO(x1, x2, x3), data = study5)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 93.222222 0.164692 566.0398 3.266e-13 ***
x1 0.100000 0.096896 1.0320 0.3493687
x2 -0.800000 0.096896 -8.2563 0.0004251 ***
x3 -2.400000 0.096896 -24.7688 2.001e-06 ***
x1:x2 -0.125000 0.108333 -1.1538 0.3007176
x1:x3 -0.125000 0.108333 -1.1538 0.3007176
x2:x3 -0.125000 0.108333 -1.1538 0.3007176
x1^2 -0.277778 0.191082 -1.4537 0.2057679
x2^2 -1.777778 0.191082 -9.3037 0.0002414 ***
x3^2 0.222222 0.191082 1.1630 0.2973239
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Multiple R-squared: 0.9938, Adjusted R-squared: 0.9827
F-statistic: 89.39 on 9 and 5 DF, p-value: 5.499e-05
Analysis of Variance Table
Response: y4
Df Sum Sq Mean Sq F value Pr(>F)
FO(x1, x2, x3) 3 64.100 21.3667 227.5740 9.158e-06
TWI(x1, x2, x3) 3 0.375 0.1250 1.3314 0.3628147
PQ(x1, x2, x3) 3 11.056 3.6852 39.2505 0.0006722
Residuals 5 0.469 0.0939
Lack of fit 5 0.469 0.0939
Pure error 0 0.000
Stationary point of response surface:
x1 x2 x3
-0.8725810 -0.3718624 5.0500003
Eigenanalysis:
eigen() decomposition
$`values`
[1] 0.2313959 -0.2822389 -1.7824903
$vectors
[,1] [,2] [,3]
x1 -0.11849976 0.99203017 -0.04282469
x2 -0.02719034 -0.04635429 -0.99855494
x3 0.99258173 0.11716411 -0.03246661
exa<-data.frame(x1=-0.8725810,x2=-0.3718624,x3=-1.7824903)
lm.pred<-predict(mod2,exa,interval="prediction",level=0.95)
lm.pred
> lm.pred
fit lwr upr
1 97.64132 95.94078 99.34186
par(mfrow=c(2,2))
contour(mod2, ~ x1+x2+x3)
par(mfrow=c(1,3))
persp(mod2, ~ x1+x2+x3, zlab=" y4", contours=list(z="bottom"))
ridge<-steepest(mod2, dist=seq(0, 1.7, by=.1),descent=FALSE)
ridge