统计结果对拍:差多少才算「一致」

40 项指标逐格给出绝对差与容差,数据与脚本可复算(一致 40 项)

换成别的统计工具,最怕的不是功能少,是"结果和以前不一样会不会被审稿人挑"。这一页不讲形容词,只给数字:同一份数据,本引擎与独立实现差多少、容差是多少、哪些差异是正常的。

打开统计工具箱(多数工具免登录可试)

一、先说清口径:这里没有「SPSS 截图」

  • 本页不提供 SPSS 截图,也不会伪造 "SPSS 输出 0.110" 这类数字——那是最容易被同行一眼看穿的事。
  • 本页给的是**三方对拍**:①三域引擎;②独立实现(scipy 1.13.1 / statsmodels 0.14.0 / lifelines 0.30.0);③DeLong、KM 中位生存、log-rank、AUC、IPTW 加权 ATE、Bland-Altman、SMD、ICC 另用手写闭式公式再算一遍。
  • Cox 回归这一项是**跨库对拍**:引擎侧用 lifelines 的 CoxPHFitter,独立侧用 statsmodels 的 PHReg,两套代码、两套求解器,都按 Efron 处理结(tie)。
  • 全部在服务器上真跑,数据由固定随机种子(seed=20261107)生成,脚本公开。你在 SPSS 里把同一份数据粘一遍,就能自己填上第四列。
  • SPSS 的对应操作也写在下面第四节(菜单路径 + 语法),方便逐项核对。

二、逐项结果(本表由脚本生成,数字未经手工录入)

下表每一行都是「本引擎 vs 独立实现」,绝对差以科学计数法给出。判定标准:t / F / H / χ² / U / r / AUC / HR 的容差取 1e-3~1e-5(取决于该量本身的舍入位数),P 值容差取 1e-4。

三、差多少才算「一致」,以及哪些差异其实不是 bug

  • 舍入级差异(1e-7~1e-5)属正常:不同实现的中间量精度、是否对 P 值做边界截断都会造成这种量级差异。本页多数行落在 1e-7~1e-5。
  • t 检验:SPSS 默认同时给 Student 与 Welch 两行,很多工具默认只给 Welch。方差不齐时两者 P 值可以差很多——这不是谁错了。
  • 2×2 卡方:是否做 Yates 连续性校正,会让 P 值在 0.049 / 0.052 之间跳;跨过 0.05 时最容易吵架。本引擎默认**未校正**,并同时返回校正后的值供对照。
  • 缺失值:成对删除与整行删除在存在缺失时结果不同。本引擎在返回里显式给出缺失策略与丢弃行数(`missing.n_dropped`),不让你猜。
  • Cox 的结(tie)处理:两套实现都默认 Efron。若你的数据事件时间大量重复(按月/按天记录的随访),Efron 与 Breslow 的 HR 会有可察觉差异——**这一项一致只说明"同一口径下一致",不证明结处理方式适合你的数据**,这一点必须自己判断。
  • 结论写法建议:报告"方法 + 参数 + 双侧 α",而不是只写软件名。审稿人复核的是方法,不是你有没有买 SPSS。

四、这一轮覆盖了什么、没覆盖什么(先说边界)

  • 已覆盖:t 检验(Student/Welch,含自由度)、单因素 ANOVA、Kruskal-Wallis、Mann-Whitney U、Tukey HSD、Pearson 卡方、Fisher 精确、Pearson 相关、ROC/AUC、DeLong 配对比较、KM 中位生存、log-rank、Cox 回归、IPTW 加权 ATE、SMD 平衡性、两因素 ANOVA、Bland-Altman、ICC(1,1)。
  • **未覆盖**(本页不给数字,也不假装覆盖):竞争风险、线性混合模型/GEE、MICE 多重插补、Meta 分析(异质性/发表偏倚)、时间依赖 ROC、倾向性评分**匹配**后的配对效应。这些模块在平台里可用,但本轮没做独立对拍,不能拿这一页替它们背书。
  • 样本量只覆盖 22~120 例的中等规模;极小样本(n<10)下的连续性校正与精确检验分歧更大,本页不给结论。

五、自己复算(三条路径)

  • 方式 A(最快):把本页的数据复制进接口调用,返回体自带统计量与 95% CI。
  • 方式 B:用 SPSS 复算——分析 → 比较平均值 → 独立样本 T 检验(勾选"均值相等性检验"看 Welch 那一行);单因素 ANOVA 走"比较平均值 → 单因素";卡方走"交叉表 → 统计量 → 卡方(勾选 Yates 对照)";ROC 走"分析 → ROC 曲线"(AUC 与其 95% CI 在同一对话框)。
  • 方式 C:用 R 复算——t.test(var.equal=TRUE/FALSE)、oneway.test、chisq.test(correct=FALSE)、pROC::roc + roc.test(method="delong")、survival::survdiff。

六、这一轮对拍揪出的六个真问题(如实写在这里)

  • ① `tool_id=fisher` 曾返回 **Pearson 卡方**:同一张 2×2 表给出 P=0.0219(显著),而 Fisher 精确检验的正确值是 0.0542(不显著)——结论会被直接改写。已修,现在返回 0.054238。
  • ② ANOVA / Kruskal-Wallis / Tukey 曾只接受 `[[数值],…]`,而对外文档写的是 `{组名:[数值]}` ⇒ 按文档填参得到 422 / 500。已统一为两种形状都收。
  • ③ log-rank 曾因分时段 HR 出现 NaN 而导致**整条结果 500 丢失**(连算对的 χ² 都拿不到)。已把非有限值转为 null 并在返回里保留 χ² 与 P。
  • ④ 两因素 ANOVA 的对外文档把观测值字段写成 `values`,而端点只读 `y` ⇒ 按文档填参必得 422。已改成两种字段名都收,缺哪个直接告诉你是哪个。
  • ⑤ Bland-Altman 存在**假成功**:字段名传错时端点返回 `{"code":500,"error":"'method1'"}`,HTTP 状态却是 200,开放层据此判为"执行成功"并扣积分。已两处都修:字段名 `m1/m2` 与 `method1/method2` 都收,且"响应体自带 code≥400"一律判失败。
  • ⑥ NaN 出口问题是**第三次复发**(前两次:ROC 的 AUC、distribution-fit 的布尔值)。逐个端点打补丁治不了根,现改为在**唯一出口**统一把 NaN/±Inf 转成 null;而"变量无变异""ICC 只给一名评分者"这类**参数本身没有统计意义**的情形,改为直接 400 说明原因,绝不返回 0 或 1 这种看起来正常的替代值。
  • 把这些问题写在页面上,是因为"能公开自己错在哪"本身就是可被复核的一部分;只报好看的数字没有意义。

结果表

指标本引擎独立实现绝对差容差判定
独立样本 t(Student)|t 值1.6216081.6216089.0e-81.0e-4✅ 一致
独立样本 t(Student)|P 值0.1103120.1103124.3e-71.0e-4✅ 一致
独立样本 t(Student)|自由度58580.0e+01.0e-9✅ 一致
Welch t|t 值-1.547637-1.5476374.1e-71.0e-4✅ 一致
Welch t|P 值0.1343050.1343052.0e-71.0e-4✅ 一致
Welch t|自由度(Welch–Satterthwaite)24.943224.9431762.4e-51.0e-3✅ 一致
单因素 ANOVA|F 值5.71015.710073.0e-51.0e-4✅ 一致
单因素 ANOVA|P 值0.0048720.0048724.0e-71.0e-4✅ 一致
Kruskal-Wallis|H 值2.71252.7125292.9e-51.0e-3✅ 一致
Kruskal-Wallis|P 值0.2576210.2576213.7e-71.0e-4✅ 一致
Mann-Whitney U|U 值236.00236.000.0e+01.0e-6✅ 一致
Mann-Whitney U|P 值0.1426050.1426053.1e-91.0e-3✅ 一致
Tukey HSD|最小校正 P(三对中最小的一个)0.0032690.00333.1e-51.0e-3✅ 一致
Pearson 卡方|χ² 值3.8153.814991.0e-51.0e-3✅ 一致
Pearson 卡方|P 值0.1484520.1484521.8e-71.0e-4✅ 一致
Fisher 精确检验|P 值(双侧)0.0542380.0542381.0e-71.0e-4✅ 一致
Pearson 相关|r0.4421480.4421484.2e-71.0e-4✅ 一致
Pearson 相关|P 值0.0042820.0042825.0e-71.0e-4✅ 一致
ROC|AUC(阳性 30 / 阴性 30)0.73940.7394444.4e-51.0e-4✅ 一致
DeLong|两 AUC 之差0.0733330.0733333.3e-71.0e-4✅ 一致
DeLong|差值标准误0.0169740.0169741.7e-71.0e-4✅ 一致
DeLong|Z 值4.32034.3202891.1e-51.0e-3✅ 一致
DeLong|P 值1.60e-51.56e-54.2e-71.0e-4✅ 一致
KM|中位生存时间19.219.20.0e+01.0e-6✅ 一致
log-rank|χ² 值2.18122.1812191.9e-51.0e-3✅ 一致
log-rank|P 值0.1397040.1397042.2e-71.0e-4✅ 一致
Cox 回归|连续协变量 HR1.01281.0128066.2e-61.0e-3✅ 一致
Cox 回归|连续协变量 P 值0.3682840.3682838.7e-71.0e-3✅ 一致
Cox 回归|二分类协变量 β-0.6763-0.6762653.5e-51.0e-3✅ 一致
IPTW|加权 ATE2.9387952.9387953.6e-71.0e-3✅ 一致
IPTW|ATE 标准误0.4438340.4438342.1e-71.0e-3✅ 一致
SMD|第 1 个协变量的标准化均数差0.09570.0956762.4e-51.0e-3✅ 一致
两因素 ANOVA|因素 A 的 F 值0.62390.6238683.2e-51.0e-3✅ 一致
两因素 ANOVA|因素 A 的 P 值0.5376560.5376563.2e-71.0e-3✅ 一致
两因素 ANOVA|因素 B 的 F 值0.06560.0655564.4e-51.0e-3✅ 一致
Bland-Altman|系统偏倚(mean diff)2.8362.8364.4e-161.0e-3✅ 一致
Bland-Altman|差值标准差4.12534.1252712.9e-51.0e-3✅ 一致
Bland-Altman|一致性上限(bias+1.96SD)10.921510.9215313.1e-51.0e-3✅ 一致
ICC(1,1)|组内相关系数0.81290.8129474.7e-51.0e-3✅ 一致
ICC(1,1)|95%CI 下限0.6750.6750021.5e-62.0e-3✅ 一致

独立实现:scipy / statsmodels / lifelines;DeLong、KM 中位、log-rank、AUC 另有手写闭式实现参与核对。生成时间 2026-11-07,seed=20261107,共 40 项,一致 40 项。

复算示例:同一份数据算 ROC/AUC

# 返回体带 engine_status(real/unavailable/error)与 auc_ci_method
curl -X POST https://sanyu.wentangkeji.com/api/open/v1/run/act_roc \
  -H "Authorization: Bearer sk-sanyu-你的密钥" \
  -H "Content-Type: application/json" \
  -d '{"labels":[0,1,0,1,1,0],"scores":[0.1,0.9,0.2,0.8,0.7,0.3]}'

常见问题

你们的统计结果能直接写进论文吗?
可以,但要写清方法而非软件名。本页给出的容差说明的是"与独立实现一致到多少位",不是"绝对正确"——统计量的正确性取决于你用对了哪种检验、是否满足前提假设。建议在方法学部分写明检验类型、单/双侧、α 水平、缺失值处理。
为什么没有和 SPSS 的逐格对比表?
因为本机没有 SPSS,编一组"SPSS 输出"是最容易被同行拆穿的做法。这里给的是可复算的三方对拍(本引擎 / scipy·statsmodels·lifelines / 手写闭式),并附 SPSS 与 R 的对应操作,你自己粘一遍就能补上第四列。
差 1e-5 算一致吗?
算。这类差异来自中间量精度与舍入,不影响任何结论。真正需要警惕的是**量级差异**(例如 P 从 0.02 变 0.05)或**方向相反**(HR 从 1.3 变 0.7),那通常意味着用错了方法或参数口径。

相关工具

蜀ICP备2026037784号 · 川公网安备 51090402000081号