experimental-design について
experimental-designは、データ収集前の実験計画を支援する研究スキルです。設計選択の指針に加え、シード付きの割り付け表やDOEレイアウトを作るスクリプトを備えています。
主な機能
- 01ランダム化・反復・ブロック化の指針
- 02実験デザインの選択
- 03シード付き割り付け表の生成
- 04実行順をランダム化したDOE行列
- 05疑似反復と交絡を避けるための助言
活用シーン
- 01参加者やサンプルの群への割り付け
- 02要因実験や応答曲面実験の計画
- 03プレート・バッチ・実行位置のランダム化
- 04反復測定またはクラスター設計の選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill experimental-designインストール後、Claude Code で/experimental-designを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/design_types.mdfactorial_and_doe.mdrandomization_and_blocking.mdsequential_and_adaptive.mdscripts/doe_designs.pyrandomization.py詳細
実験デザイン
概要
研究のデザイン、つまりユニットを条件にどう割り当てるか、何を一定に保ち何を変化させるか、どのような構造で実施するかによって、データから答えられる問いが決まります。交絡や疑似反復のあるデザインは、事後の解析では救済できません。このスキルでは、データ収集前に行う判断を扱います。関心のある効果を切り分けるデザインの選択、因果的な主張を可能にするためのランダム化、既知の不要な変動を取り除くブロック化、そして効果を複雑に絡み合わせず推定できるように多因子実験を構成する方法について説明します。
ほぼすべての優れたデザインを支える3つの考え方(フィッシャーの原則)は次のとおりです。
- ランダム化 — 交絡因子が既知か未知かにかかわらず、期待値として均衡するように処理を無作為に割り当てます。これにより、比較から因果的な主張が可能になります。
- 反復 — 適切なレベルで独立に反復し、変動を推定できるようにします。これにより、効果が単一のユニットだけに由来するものではなくなります。最もよくある致命的な誤りは疑似反復です。同じユニットでの反復測定を独立した反復として数えてしまうことです。
- ブロック化/局所管理 — 類似したユニット(バッチ、日、施設、同腹群など)をグループ化して、ブロック内で無作為化します。これにより、不要な変動を誤差項に含めてノイズを増大させるのではなく、取り除けます。
このスキルでは、デザインの種類を選び、実際のランダム化または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
デザインの生成
すぐに使える再現可能なレイアウトを2つのスクリプトで生成できます。スキルの
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)
使い分け:サンプルサイズが大きい場合は単純ランダム化で問題ありませんが、小さい場合は不均衡になることがあります。ブロックランダム化では常に均衡が保証されます。層別ブロックランダム化では、さらに既知の予後因子も均衡させます。介入がグループ単位で実施される場合は、クラスターランダム化が必須です。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 つの実験単位に対する反復測定を独立した反復として扱うことです。1 匹のマウスに 100 個ずつ細胞があるマウス 3 匹の場合、マウスに適用した処置についての n は 300(細胞)ではなく 3(マウス)です。反復単位は、処置がランダム化される単位と一致していなければなりません。この単一の誤りによって、公表された実験の多くが無効になります。適切な単位でランダム化と反復を行い、入れ子構造を考慮して解析してください(混合モデル)。
references/design_types.mdを参照してください。 - 交絡因子による交絡。 すべての処置サンプルを月曜日に、すべての対照サンプルを火曜日に実施すると、処置と実施日が交絡します。特定できる交絡因子(バッチ、日、プレート、技術者、装置、位置)すべてについて、要因間でランダム化するか、ブロック化してください。
- ランダム化がない、または不適切なランダム化。 先着順で処置群に割り当てるなどの都合による割り当てでは、交絡因子が入り込む余地が生まれます。シード付きの割り当て表を使用し、それに従ってください。
- 適切な対照がない。 同時期に実施する対照(および該当する場合は、ビークル/シャム対照と盲検化)がなければ、処置効果を時間、プラセボ、または取り扱いによる効果から切り分けられません。
- バッチ効果を生物学的効果と誤認する。 特にオミクスでは、バッチ間でサンプルの処理順序をランダム化またはブロック化してください。バッチが条件と一致する状態にしてはいけません。
- プレートの端/位置効果。 蒸発や温度勾配により、プレートの端では結果が異なります。サンプル位置をランダム化またはブロック化し、すべての対照を 1 列目に配置しないでください。
- 分割実験計画でエイリアシングを無視する。 分解能の低い分割実験計画法の要因実験では、主効果が交互作用と交絡します。要因に「効果がない」と結論付ける前に、別名構造を把握してください。
- 曲率を考慮せずに最適化する。 2 水準要因実験では応答の曲率を検出できないため、内部にある最適値を見逃します。応答曲面計画を使用してください。
ワークフロー
- 問い、単位、応答を明確にします。 何をランダム化しますか。何を測定しますか。真に独立した反復はどのレベルにありますか。これらがすべてを決定します。
- 交絡因子(バッチ、日、施設、作業者、位置)をリストアップし、それぞれについてブロック化、層別化、または要因間でのランダム化を計画します。
- 意思決定ツリーと参考ファイルを使って計画を選びます。
- 適切なレベルで反復数を決めます(選択した計画での n は、statistical-power スキルを使って求めます)。
randomization.py/doe_designs.pyを使い、シードを指定してレイアウトを生成します。- 実施/処理順序とプレート/バッチ内の位置をランダム化します。
- 解析が確認的なものとなり、レイアウトを監査できるよう、計画、シード、スケジュールを記録します(可能であれば事前登録します)。
- 計画に合った解析を行います。ブロック、層、クラスター、入れ子構造をモデルに含める必要があります(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). 実験室の生物学者のための実験計画法.
エージェントの作業手順
- 環境を確認します。 研究目標、制約(予算、時間、倫理)、およびユーザーが必要とする意思決定を明確にします。
- 入力を特定します。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果に影響する値は推測せず、質問します。
- まず小規模に実施します。 各案の前提を明示したうえで、選択肢を絞った短いリストを提示してから、いずれかを詳しく検討します。
- 上記の指示と参考資料を使用して、タスク全体を実行します。
- 結果を検証します。 前提を明記し、明示した基準に沿って代替案を比較し、統計解析計画には検出力と解析方法を含めます。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未解決の不確実性を示します。
| 次のことが起きた場合 | 次のように対応します |
|---|---|
| 計画の選択が未知の効果量やコストに左右される | 単一の推測値ではなく、シナリオ(楽観的、予想、悲観的)を提示します。 |
| これらの指示にある関数、フラグ、エンドポイントがインストール済みバージョンに存在しない | インストール済みバージョンの公式ドキュメント(help()、--help、公式資料)を確認し、適宜対応してユーザーに伝えます。API を捏造してはいけません。 |
| 必須の入力、識別子、パラメーターが曖昧である | ユーザーに確認するか、実行前に前提を明示します。 |
誠実性に関するルール
- 結果、パラメーター、識別子、引用、統計値を捏造してはいけません。実行または検証できない場合は、その旨を明確に伝えます。
- 推測には推測であることを明記し、確立されたエビデンスと新たな仮説を区別します。
- ここに記載されているバージョン固有の詳細は古くなっている可能性があるものとして扱い、インストール済みバージョンの公式ドキュメントで確認します。
- 費用が発生する、共有 GPU やクラウドのクォータを消費する、個人データや患者データを扱う、または取り消せない操作を行う場合は、事前に確認します。