这是“去哪里拿证据、按什么顺序把它变成可交接结论”的执行地图,不是统计教材。
- 竞品判据与可证伪笔记:
docs/competitors/result-analysis.md- 执行红线与脚本路由:
SKILL.md- 方法/工具一手说明:
references.md- 最终人读报告结构:
assets/result_analysis_report_template.md- 下游各自的方法:paper-writing / research-ethics / consistency / figure 的 SKILL 与 references
本页不重复上述内容;只负责把分析计划→原始运行→设计感知统计→稳健性→claim/provenance→交总控 串成闭环。
| 模式 | 何时用 | 允许的结论 |
|---|---|---|
| confirmatory | 结果前已有 hypothesis/estimand/primary metric/family/exclusion | 按冻结计划检验;变更必须另标 |
| exploratory | 结果已看过才提出切片/检验/假设 | 生成候选规律,不得回填成 a-priori |
| sensitivity | 用另一合理处理/检验/语言核结论是否依赖选择 | 只能说“对该选择稳健/敏感”,不是新主假设 |
| descriptive-only | 只有汇总均值、统计单位不独立或复杂设计暂不能建模 | 报分布/覆盖/限制,不做确认性显著结论 |
从 research-plan / experiment-coding 取:
- hypothesis / estimand(比较谁、对谁、什么结果、什么时间窗);
- primary / secondary metric;
unit_of_analysis:participant / sample / seed / dataset / cluster,而不是 CSV 行数;- design:independent / paired / repeated_measures / clustered / hierarchical / nested_cv / repeated_holdout / time_series;
- comparison family:一个科学问题下计划运行的完整比较集合;
- exclusion / outlier / missingness 规则、停止条件;
- failure-tree / guardrail refs:success/failure/inconclusive 分支、guardrail/counter-metric、kill action 与 claim impact;
locked_at与results_available_at。
先跑 warn-only 审计:
python scripts/analysis_plan_audit.py `
--spec analysis_audit.json `
--report analysis_audit_findings.json `
--json-out analysis_audit_full.json最小结构:
{
"project": "p1",
"plan": {
"status": "frozen",
"locked_at": "2026-07-01T09:00:00+08:00",
"results_available_at": "2026-07-01T10:00:00+08:00",
"hypotheses": ["H1"],
"primary_metric": "accuracy",
"unit_of_analysis": "seed",
"design": "paired",
"exclusion_rules": ["parse failure only"],
"comparison_families": [{
"family_id": "primary-model-comparison",
"planned_comparisons": 2,
"reported_comparisons": 2,
"correction": "bh"
}]
},
"analysis": {"paired_by": "seed", "aggregate_only": false},
"coverage": {"expected_units": [0, 1], "observed_units": [0, 1]},
"inputs": [{
"path": "results/raw.csv",
"role": "raw_results",
"sha256": "...",
"owner": "researcher",
"captured_at": "2026-07-01T10:00:00+08:00",
"run_manifest": "run_manifest.json",
"commit": "abc123"
}]
}结果后改规则:保留 old/new/time/reason,declared_as 只能是 exploratory 或 sensitivity;
绝不回填成 preregistered。
优先顺序:
- 逐 sample / seed / fold / dataset 的 raw CSV/Parquet/JSON;
- experiment-coding 的 run manifest;
- guardrail evidence(如
guardrails.json)及其 SHA-256、failure-tree refs 和 claim impact; - config、数据划分、commit、环境锁、日志;
- 失败/中断运行与 exclusion log;
- 最后才是均值汇总表。
为每个输入记录:
| 字段 | 最低要求 |
|---|---|
| path + role | raw_results / run_manifest / config / split / log |
| hash | SHA-256,防止分析后静默换文件 |
| owner + captured_at | 谁确认、何时取得 |
| run locator | run id / seed / fold / commit / config |
| guardrail evidence | guardrail id / status / observed / threshold / claim impact / SHA-256 |
| public source | URL、版本/取得日期、字段、license |
| coverage | expected vs observed units;缺失必须解释 |
禁止把“12 个 fold 的均值”当 12 个独立原始样本;禁止把失败 seed 从表里删掉后仍写 coverage=100%。
简单设计:
# independent
python scripts/analyze_results.py results.csv --group method --metric accuracy f1 `
--emit-claim-table --emit-evidence --outdir analysis
# paired:claim/evidence 只采用 paired comparisons;独立结果仅留 advisory
python scripts/analyze_results.py results.csv --group method --metric accuracy f1 `
--paired-by seed --emit-claim-table --emit-evidence --outdir analysis配对设计的键必须在每组内唯一;不同方法共享同一 seed/fold/sample 才能配。Round 2 修复后,
--paired-by 不再同时产一套“独立样本 duplicate claims”。
复杂设计:
| 设计 | 首选方向 | 当前 Light 行为 |
|---|---|---|
| repeated measures | mixed model / GEE / repeated-measures ANOVA/Friedman | audit warn;简单 paired 仅敏感性 |
| hierarchical/cluster | mixed model / cluster-robust SE / cluster bootstrap | audit warn;不把行当独立 |
| nested/repeated CV | corrected resampled test / dataset-level comparison | audit warn;fold 不作无限独立重复 |
| time series | blocked/rolling evaluation、autocorrelation-aware inference | audit warn;随机独立检验不可终判 |
每条 claim 至少带 effect + CI + p/q + n。多个比较的 family 由冻结计划定义,不由脚本替用户
猜;stat_rigor_gate 必须一次看到完整 family 的 claims,不能拆成多次调用规避校正。
最低覆盖:
- seed / dataset / split 的方向与方差;
- subgroup/slice 的 coverage 与小 n;
- missingness、异常值、排除规则的 alternate specification;
- leakage / train-val-test gap;
- negative/null/contradictory result;
- 结果后新增分析的 exploratory 标签。
python scripts/leakage_overfit_check.py --train train.csv --test test.csv --target y
python scripts/analyze_results.py results.csv --group method --metric accuracy `
--slice-by subgroup --outdir slice-analysis不要为拿到显著结果自动切换检验、删异常值、改 family。assumption 失败时:
- 先记录失败;
- 查冻结计划是否预先规定替代;
- 没规定则主分析照计划,新增方法作为 sensitivity/exploratory;
- 并列报告结论是否改变。
标准工件:
claim_evidence_table.md:人读 claim↔test/effect/CI/q/n;evidence_strength.json:light.evidence_strength.v1,下游措辞上限;result_card_report.json/result_card_findings.json:每条 claim 的 target、analysis set、 missingness、provenance、assumption、family、effect、language 与 decision ledger 机器门;analysis_audit_full.json:计划/设计/family/coverage/provenance 警告;- 分析报告:现象→原因→证据→论文意义;
- 可选 claims/metrics 候选:带 source file/run/commit/locator,交 consistency 人工确认。
重要边界:
_shared/evidence_contract当前 schema 不保存完整 run provenance;result_card_gate.py的as_of用来裁定分析时间轴:locked_at、results_available_at、computed_at不得来自未来,且computed_at不得早于results_available_at;decision=REVISION_REQUIRED/UNKNOWN是阻断性裁定,不能交给 paper-writing/research-ethics;- result-analysis 不得直接写
.light/consistency/*.yaml; - consistency 的 canonical authority 必须由 owner 人工确认后,经 memory-pm/项目流程写入;
- SHAP/相关/事后 slice 是关联或探索证据,不能写成因果发现。
python scripts/stat_rigor_gate.py --spec stat_spec.json `
--report stat_findings.json --evidence-out evidence_strength.json
python ../light-orchestrator/scripts/run_checkpoint.py --stage 7 `
--findings stat_findings.json analysis_audit_findings.json- critical:多重比较未校正、选择性报告、主假设不支撑、不可复现;
- warn-only:计划锁/复杂设计/family provenance/coverage/input provenance、效应量缺失、过度解读;
- p-hacking:stage 7 内修分析;
- hypothesis unsupported:建议 7→5;
- unreproducible/implementation bug:建议 7→6;
- 回炉与带病推进都是用户决策点,绝不静默。
修复的是分析计划/规格/方法/报告,不是改 raw results 迎合门。修后重跑:
- analyze;
- plan/provenance audit;
- stat rigor gate;
- checkpoint;
- paper-writing 或 research-ethics 消费 evidence;
- figure 只收统计图数据;
- consistency 只收带 provenance 的候选。
Rscript --version
$env:RSCRIPT = 'C:\Program Files\R\R-4.6.0\bin\Rscript.exe'
python scripts/r_analysis_crosscheck.py --selftestlauncher 按顺序找 RSCRIPT、PATH、Windows C:\Program Files\R\R-*\bin\Rscript.exe。找不到会
明确返回 R unavailable,不写“R 已支持/已通过”。
python scripts/r_analysis_crosscheck.py `
--input results.csv --group method --metric accuracy --paired-by seed `
--out r_accuracy.csvr_analysis_crosscheck.R 只用 base R,真算两组 paired t 或 independent Welch t,输出 p、effect、
CI、n。它是交叉核验/敏感性路径,不是 mixed model 引擎。
| R 资源 | 用途 | 必需? | 缺失时 |
|---|---|---|---|
base stats |
t/Wilcoxon/ANOVA/模型基础 | 是 | R 路径不可用 |
boot |
bootstrap | 否 | Python bootstrap 或 base 实现并标注 |
broom |
tidy model output | 否 | base summary/CSV |
effectsize |
多类 effect size | 否 | Python 现有 d/dz;注明缺项 |
rstatix |
便捷检验 | 否 | base/SciPy |
emmeans |
marginal means/contrasts | 复杂模型时有价值 | 不做该终判 |
lme4 |
mixed effects | repeated/hierarchical 时有价值 | audit warn,转人工方法设计 |
2026-07-01 本机实测:R 4.6.0 全路径可用,base R 与 boot 可用;broom/effectsize/rstatix/ emmeans/lme4 不可用。不得把文档列名写成“均已安装”。
- 本技能 9 个 Python 脚本 + 1 个 R 脚本(以目录实时清单为准);
_shared/evidence_contract/ findings / gate runner;- pandas / SciPy / statsmodels / scikit-learn(按环境检测);
- base R;可选 R 包逐项
requireNamespace(); - git、config、run manifest、raw CSV/Parquet/JSON、split、日志。
- ASA p-value statement;
- NIST/SEMATECH statistical handbook;
- Cochrane Handbook / GRADE;
- EQUATOR 对应研究设计报告清单;
- UCI / OpenML /公开 benchmark 与复现仓库。
公开数据必须记 URL、取得日期、字段、license 与 hash;网页“能下载”不等于统计单位支持当前检验。
SPSS、Stata、JMP、Prism、托管 W&B/MLflow、受限数据仓库。它们不得成为完成任务前提;无账号时使用 本地文件与开源路径,不伪造“已核”。
preregistration/analysis plan、run manifest、逐 seed/fold/sample 结果、日志、config、commit、split、 已确认 primary/secondary metric、exclusion/stopping rule 与 change log。每项带 owner、绝对时间与 provenance。
- 不把汇总均值或 fold 当无限独立样本。
- 不为显著性自动换检验、删异常值、改 comparison family。
- q≥阈值只表示“未见足够证据”,不是“证明没有效应”;要证明近似等效需 equivalence/ non-inferiority 设计。
- 不把 SHAP、相关或事后 slice 写成因果。
- 文件缺失、解析失败、coverage/provenance 缺口时,不得宣称分析完整或 evidence strong。