mcpField
E
experimental-design

experimental-design

github.com/kalarislabs数据与数据库7972 次安装6 天前更新
代码仓库

关于 experimental-design

experimental-design 是一项研究技能,帮助在收集数据前规划实验。它提供设计选择指导,以及用于生成带种子随机分配表和 DOE 布局的脚本。

主要功能

  1. 01随机化、重复与区组设计指导
  2. 02实验设计类型选择
  3. 03带种子的随机分配表生成
  4. 04含随机运行顺序的 DOE 矩阵
  5. 05避免伪重复与混杂的建议

适用场景

  1. 01将参与者或样本分配到实验组
  2. 02规划因子实验或响应面实验
  3. 03随机安排板位、批次或运行位置
  4. 04选择重复测量或集群设计

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill experimental-design

安装后在 Claude Code 中输入/experimental-design确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
design_types.md
factorial_and_doe.md
randomization_and_blocking.md
sequential_and_adaptive.md
scripts/
doe_designs.py
randomization.py

详细介绍

实验设计

概述

研究设计——如何将单位分配到各个条件、哪些因素保持不变、哪些因素发生变化,以及采用何种结构——决定了数据能够回答哪些问题。事后再进行任何分析,都无法弥补混杂或伪重复的设计。本技能关注数据收集前的决策:选择能隔离目标效应的设计,采用随机化以支持因果结论,通过区组设计消除已知的干扰变异,并构建多因素实验,使效应可以估计,而不是相互纠缠。

几乎所有优秀设计背后的三项原则(Fisher 原则):

  • 随机化——随机分配处理,使已知和未知的混杂因素在期望上得到平衡。这是将比较转化为因果结论的关键。
  • 重复——在恰当的层级进行独立重复,以便估计变异性,确保效应不是单个单位造成的假象。最常见的致命错误是伪重复:将同一单位上的重复测量视为独立重复。
  • 区组设计/局部控制——按批次、日期、地点、窝群等将相似单位分组,并在区组内随机分配;将干扰变异从误差项中去除,而不是任其增加噪声。

本技能可帮助你在各种设计类型中做出选择,生成实际的随机化方案或 DOE 布局(附带可复现脚本),并避免导致数据无法解读的结构性错误。

何时使用此技能

  • 规划任何比较实验或试验,并决定如何分配单位
  • 将受试者/样本随机分配到各组(简单、区组、分层或整群)
  • 通过区组设计或分层消除干扰变异
  • 设计多因素实验:全因子或部分因子设计、筛选设计
  • 优化连续因子下的响应(响应面设计)
  • 受试者内/重复测量、交叉、裂区或拉丁方设计
  • 整群或组随机设计(地点、诊所、教室、窝群)
  • 确定重复次数和层级,并避免伪重复
  • 带有期中分析的序贯、组序贯或自适应设计
  • 规划板位/批次,并随机安排运行顺序以避免漂移

安装

uv pip install "numpy>=1.26" "pandas>=2.0" pyDOE3

pyDOE3 是 pyDOE/pyDOE2 的维护版后继项目,提供全因子、部分因子、Plackett-Burman、中心复合、Box-Behnken 和拉丁超立方生成器。附带脚本对其进行封装,返回采用实际因子单位、带命名列且运行顺序已随机化的设计。


选择设计

从研究问题和单位结构出发,而不是从偏好的设计类型出发。

What are you trying to learn?
│
├─ Compare a few predefined conditions (A vs B vs C)?
│   ├─ Units independent, possibly with a known nuisance factor (day, batch, site)?
│   │     → Completely randomized (no nuisance) or RANDOMIZED BLOCK design.
│   ├─ Each unit can receive every condition in sequence (washout possible)?
│   │     → CROSSOVER / repeated-measures design (more power, watch carry-over).
│   └─ You can only randomize groups, not individuals (schools, clinics)?
│         → CLUSTER-randomized design (analyze at the cluster level; see pseudoreplication).
│
├─ Screen MANY factors (5+) to find the few that matter?
│     → FRACTIONAL FACTORIAL or PLACKETT-BURMAN screening design.
│
├─ Quantify main effects AND interactions among a handful of factors?
│     → FULL 2^k FACTORIAL design.
│
├─ Find the settings that OPTIMIZE a response (curvature matters)?
│     → RESPONSE-SURFACE design: central composite or Box-Behnken.
│
└─ Explore a simulation/computer model over a continuous space?
      → SPACE-FILLING design: Latin hypercube.

各分支的详细指南:

  • 随机化、区组设计、分层、对照 → references/randomization_and_blocking.md
  • 全因子、部分因子、筛选、响应面、DOE 概念(混杂、分辨率) → references/factorial_and_doe.md
  • 交叉、重复测量、裂区、拉丁方、整群、嵌套设计 → references/design_types.md
  • 序贯、组序贯和自适应设计(期中分析) → references/sequential_and_adaptive.md

生成设计

两个脚本可生成可直接使用、可复现的布局。从本技能的 scripts/ 目录运行,或将其添加到 sys.path。所有内容均采用固定随机种子,因此可以归档并重新生成完全相同的安排——这是试验注册和良好实验室实践的要求。

随机化/分配安排 — scripts/randomization.py
from randomization import (
    simple_randomization, block_randomization,
    stratified_block_randomization, cluster_randomization,
    assign_factorial_runs, arm_balance,
)

# Permuted blocks keep the arms balanced throughout enrollment (use for n < ~100
# or sequential intake — simple randomization can drift out of balance with small n)
sched = block_randomization(n=60, arms=["treatment", "control"], seed=42)

# Balance a prognostic variable across arms by randomizing within each stratum
sched = stratified_block_randomization({"siteA": 30, "siteB": 30},
                                       arms=["drug", "placebo"], ratio=(2, 1), seed=42)

# Randomize whole clusters, not individuals (the cluster is the unit)
sched = cluster_randomization(["clinic1", "clinic2", "clinic3", "clinic4"], seed=42)

arm_balance(sched)            # sanity-check the counts per arm
sched.to_csv("allocation_schedule.csv", index=False)

如何选择:对于较大的 n,简单随机化即可,但 n 较小时可能导致不平衡;区组随机化可确保全程保持平衡;分层区组随机化还可平衡已知的预后因素;当干预在群体层级实施时,必须采用整群随机化。参见 references/randomization_and_blocking.md。

DOE 矩阵 — scripts/doe_designs.py
from doe_designs import (
    full_factorial, two_level_factorial, fractional_factorial,
    plackett_burman, central_composite, box_behnken, latin_hypercube,
)

# Factors as real-world (low, high) ranges -> design comes back in real units
factors = {"temp_C": (20, 60), "conc_mM": (1, 10), "pH": (6, 8)}

# Full 2^3: all main effects + all interactions (8 runs), run order randomized
design = two_level_factorial(factors, seed=42)

# Screen 7 factors cheaply (main effects only)
many = {f"factor_{i}": (0, 1) for i in range(7)}
design = plackett_burman(many, seed=42)

# Optimize over 2 factors with curvature (response-surface)
design = central_composite({"temp_C": (20, 60), "conc_mM": (1, 10)}, seed=42)

design.to_csv("experimental_runs.csv", index=False)

默认情况下,运行顺序会随机化,以免因素与时间/漂移(设备预热、试剂老化)混杂。关于如何选择生成元、解读混杂结构以及选择分辨率,请参阅 references/factorial_and_doe.md。


会毁掉研究的错误

这些都是设计层面的错误——只能通过设计来避免,无法在分析阶段弥补。

  1. 伪重复。 将对同一个体的重复测量视为独立重复:每只小鼠有 100 个细胞,共 3 只小鼠,对于任何施加于小鼠的处理,n = 3(小鼠),而不是 n = 300(细胞)。重复必须处于处理随机分配的层级。这个错误会使大量已发表实验失效。在正确的层级进行随机化和重复;分析时应考虑嵌套结构(混合模型)。请参阅 references/design_types.md。
  2. 与干扰变量混杂。 周一运行所有处理组样本、周二运行所有对照组样本,会使处理与日期混杂。对所有可识别的干扰因素(批次、日期、板、技术人员、仪器、位置)进行随机化或区组设计。
  3. 没有随机化,或随机化不当。 便利分配(先到先得 → 处理组)会让混杂因素乘虚而入。使用带随机种子的方案并严格遵循。
  4. 缺少适当的对照。 若没有同期对照(并在适用时设置载体/假处理对照和盲法),就无法区分处理效应与时间、安慰剂或操作效应。
  5. 将批次效应误认为生物学效应。 尤其是在组学研究中,应以随机或区组顺序跨批次处理样本;切勿让批次与实验条件一致。
  6. 板上的边缘/位置效应。 蒸发和温度梯度会造成板边缘与其他位置不同。对样本位置进行随机化或区组设计;不要把所有对照都放在第 1 列。
  7. 忽略分部设计中的混杂。 低分辨率的分部因子设计会使主效应与交互作用混杂;在断定某个因素“没有效应”之前,应先了解其混杂结构。
  8. 未考虑曲率就进行优化。 两水平因子设计无法检测曲线响应,因此会错过内部最优点。请使用响应面设计。

工作流

  1. 说明问题、实验单位和响应变量。 随机分配的是什么?测量的是什么?真正独立的重复处于哪个层级?这些决定了后续所有内容。
  2. 列出干扰因素(批次、日期、地点、操作人员、位置)——计划针对每个因素进行区组设计、分层或随机化。
  3. 使用决策树和参考文件选择设计。
  4. 在正确的层级确定重复次数(并使用所选设计对应的 statistical-power 技能计算 n)。
  5. 使用 randomization.py / doe_designs.py 生成布局,并设置随机种子。
  6. 对运行/处理顺序以及板上/批次中的位置进行随机化。
  7. 记录设计、随机种子和方案(如可行,进行预注册),使分析具有验证性,且布局可审计。
  8. 使分析与设计相匹配——模型中必须体现区组、分层、聚类和嵌套结构(交由 statistical-analysis / statsmodels 处理)。

资源

脚本
  • scripts/randomization.py — 带随机种子的分配方案:simple_randomization、block_randomization、stratified_block_randomization、cluster_randomization、assign_factorial_runs、arm_balance。
  • scripts/doe_designs.py — 以实际单位表示的 DOE 矩阵:full_factorial、two_level_factorial、fractional_factorial、plackett_burman、central_composite、box_behnken、latin_hypercube。
参考资料
  • references/randomization_and_blocking.md — 随机化方法、区组设计、 分层、对照、盲法、批次/板布局。
  • references/factorial_and_doe.md — 析因设计和部分析因设计、分辨率 与混杂、筛选以及响应面方法。
  • references/design_types.md — 完全随机设计、随机区组设计、交叉设计、 重复测量设计、裂区设计、拉丁方设计、整群设计和嵌套设计;深入探讨 伪重复问题。
  • references/sequential_and_adaptive.md — 组序贯设计、α 消耗、 中期停止以及自适应样本量重新估算。
相关技能
  • statistical-power — 为所选设计确定所需样本量/统计功效。
  • statistical-analysis — 收集数据后执行并报告分析。
  • statsmodels / pymc — 拟合设计所隐含的模型。
关键参考文献
  • Fisher, R. A. (1935). 实验设计。
  • Montgomery, D. C. (2019). 实验设计与分析(第 10 版)。
  • Hurlbert, S. H. (1984). 伪重复与生态野外实验设计。Ecological Monographs,54(2),187–211。
  • Lazic, S. E. (2016). 实验室生物学家的实验设计。

Agent 操作流程

  1. 检查环境。 明确研究目标、约束条件(预算、时间、伦理)以及用户需要做出的决策。
  2. 明确输入。 确认数据或用户提供的格式、标识符和参数。任何会影响结果的数值都应询问,不要猜测。
  3. 先运行小规模版本。 在扩展任何选项之前,提出一份简短的备选方案清单,并明确说明假设。
  4. 执行完整任务,使用上述说明和参考资料。
  5. 验证结果。 说明假设,按明确标准比较备选方案,并确保统计计划包含功效和分析选项。
  6. 报告。 说明运行了什么(版本、命令、参数)、检查了什么,以及仍有哪些不确定之处。
如果出现这种情况请这样做
设计选择取决于未知的效应量或成本提供乐观、预期和悲观情景,不要只给出单一猜测。
这些说明中的函数、标志或端点在已安装版本中不存在查阅已安装版本自身的文档(help()、--help、官方文档),调整做法并告知用户。切勿虚构 API。
必需的输入、标识符或参数存在歧义询问用户,或在运行前明确说明所依据的假设。

诚信准则

  • 切勿捏造结果、参数、标识符、引文或统计数据。如果无法运行或验证某项内容,请坦诚说明。
  • 将推测标注为推测;区分已有证据与新假设。
  • 将此处针对特定版本的细节视为可能过时:请对照已安装版本的官方文档加以确认。
  • 对于会产生费用、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,必须事先征求同意。

评论

支持 Markdown