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 个百分点带来的效率提升最明显,表面活性剂次之,助溶剂单独作用较弱。

2³ 全因子:主效应图(示例数据) 清洗效率 η (%) 随因素水平变化 76 72 68 64 62 −1 +1 因素水平(编码) A 主溶剂 B 表面活性剂 C 助溶剂 效应绝对值排序 A +7.4 B +4.6 C +1.9 AB −1.2 AC +0.9 BC −0.6 ABC +0.4 单位:百分点

方差分析:把效应和噪声分开

主效应图只能看大小,不能判断是否显著。用两次重复的差异构造纯误差平方和,再对每个效应做 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,四个交互项均不显著。这意味着在当前实验范围内,清洗效率主要由主溶剂和表面活性剂浓度驱动,助溶剂单独作用有限,交互作用可暂不纳入模型。

若纯误差自由度不足或重复间差异异常大,先检查测量重复性。清洗效率的称重法对残留膜厚敏感,重复间极差超过 2 个百分点时,应优先排查干燥与称量条件,而不是急着解释效应。

结果如何落到配方决策

  • 保留显著主效应:A、B 进入下一轮优化;C 可固定在低成本水平(如 2%)以简化配方。
  • 方向判断:A、B 效应为正,说明提高浓度有利,但需结合成本与漂洗残留约束确定上限,不能无限外推。
  • 交互项处理:本例交互不显著,可先按可加模型理解;若后续在更高浓度区发现交互,再补充设计。
  • 验证:在 A 高、B 高、C 低的组合附近做 2~3 次确认实验,若效率落在模型预测区间内,则主效应结论可信。

本例的产出不是最终配方,而是一张“哪些因素值得继续调”的筛选结论:主溶剂与表面活性剂是后续响应面优化的重点变量,助溶剂暂时降为固定组分。