4. 三因素两水平全因子实验识别显著主效应
为什么选 2³ 全因子
本例要回答一个很具体的问题:在主溶剂、表面活性剂、助溶剂三个配方变量中,哪些对清洗效率有显著主效应。三个因素各取两个水平,全因子共 2³ = 8 个配方点,每个点做 2 次重复,共 16 次实验。两水平全因子能同时估计 3 个主效应和 4 个交互项(3 个两因素交互 + 1 个三因素交互),自由度刚好够用,是筛选阶段最经济的方案。
因素与水平按清洗剂配方实际可调范围设定(示例参数,需按实际体系校准):
| 代号 | 因素 | 低水平 (−1) | 高水平 (+1) |
|---|---|---|---|
| A | 主溶剂质量分数 | 8% | 16% |
| B | 表面活性剂质量分数 | 1.0% | 3.0% |
| C | 助溶剂质量分数 | 2% | 6% |
响应变量为清洗效率 η(%,按例 2 定义的称重法测定),重复两次取均值,同时记录两次的极差用于估计纯误差。
实验矩阵与编码
用标准顺序(Yates 顺序)排列 8 个处理组合,编码列由 −1/+1 组成,交互列直接相乘得到。这样排列的好处是每个主效应的对比系数都是 ±1 且正交,主效应可直接由高低水平均值之差算出。
import numpy as np
import pandas as pd
from itertools import product
# 1) 构造 2^3 设计矩阵(编码 -1/+1)
factors = ['A', 'B', 'C']
design = pd.DataFrame(list(product([-1, 1], repeat=3)), columns=factors)
design['AB'] = design.A * design.B
design['AC'] = design.A * design.C
design['BC'] = design.B * design.C
design['ABC'] = design.A * design.B * design.C
# 2) 示例响应:两次重复的清洗效率(%),此处为教学示例数据
design['run1'] = [61.2, 68.5, 64.8, 72.1, 63.5, 70.2, 66.9, 74.6]
design['run2'] = [60.5, 69.3, 65.6, 71.4, 62.8, 71.0, 67.5, 75.2]
design['mean'] = design[['run1', 'run2']].mean(axis=1)
print(design.round(2))
注意:上表响应值是教学示例数据,用于演示计算与判读流程,不代表任何真实配方实测结果。实际执行时应替换为按标准方法测得的清洗效率。
主效应计算
主效应 = 该因素取高水平时响应均值 − 取低水平时响应均值。由于设计正交,可直接用编码列与响应均值做点积再除以 4(8 个点中每个水平各 4 个)。
n = len(design)
effects = {}
for col in ['A', 'B', 'C', 'AB', 'AC', 'BC', 'ABC']:
effects[col] = (design[col] * design['mean']).sum() / (n / 2)
eff = pd.Series(effects).sort_values(key=abs, ascending=False)
print(eff.round(3))
按示例数据计算,主效应大致为:A ≈ +7.4、B ≈ +4.6、C ≈ +1.9(单位:百分点),交互项绝对值均小于 1.5。也就是说,主溶剂浓度提高 8 个百分点带来的效率提升最明显,表面活性剂次之,助溶剂单独作用较弱。
方差分析:把效应和噪声分开
主效应图只能看大小,不能判断是否显著。用两次重复的差异构造纯误差平方和,再对每个效应做 F 检验。2³ 设计每个效应占 1 个自由度,纯误差占 8 个自由度(8 个点 × (2−1))。
from scipy import stats
# 纯误差:每个处理组合内两次重复的离差平方和
ss_pe = ((design['run1'] - design['mean'])**2 +
(design['run2'] - design['mean'])**2).sum()
df_pe = n * (2 - 1)
ms_pe = ss_pe / df_pe
rows = []
for col in ['A', 'B', 'C', 'AB', 'AC', 'BC', 'ABC']:
ss = (effects[col]**2) * n / 4 # 单自由度效应的平方和
ms = ss / 1
F = ms / ms_pe
p = 1 - stats.f.cdf(F, 1, df_pe)
rows.append([col, ss, F, p])
anova = pd.DataFrame(rows, columns=['项', 'SS', 'F', 'p'])
print(anova.round(4))
判读规则:取 α = 0.05,p < 0.05 判为显著。按示例数据,A 与 B 的 p 值应明显小于 0.05,C 处于边缘或略高于 0.05,四个交互项均不显著。这意味着在当前实验范围内,清洗效率主要由主溶剂和表面活性剂浓度驱动,助溶剂单独作用有限,交互作用可暂不纳入模型。
结果如何落到配方决策
- 保留显著主效应:A、B 进入下一轮优化;C 可固定在低成本水平(如 2%)以简化配方。
- 方向判断:A、B 效应为正,说明提高浓度有利,但需结合成本与漂洗残留约束确定上限,不能无限外推。
- 交互项处理:本例交互不显著,可先按可加模型理解;若后续在更高浓度区发现交互,再补充设计。
- 验证:在 A 高、B 高、C 低的组合附近做 2~3 次确认实验,若效率落在模型预测区间内,则主效应结论可信。
本例的产出不是最终配方,而是一张“哪些因素值得继续调”的筛选结论:主溶剂与表面活性剂是后续响应面优化的重点变量,助溶剂暂时降为固定组分。