换成别的统计工具,最怕的不是功能少,是"结果和以前不一样会不会被审稿人挑"。这一页不讲形容词,只给数字:同一份数据,本引擎与独立实现差多少、容差是多少、哪些差异是正常的。
一、先说清口径:这里没有「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.621608 | 1.621608 | 9.0e-8 | 1.0e-4 | ✅ 一致 |
| 独立样本 t(Student)|P 值 | 0.110312 | 0.110312 | 4.3e-7 | 1.0e-4 | ✅ 一致 |
| 独立样本 t(Student)|自由度 | 58 | 58 | 0.0e+0 | 1.0e-9 | ✅ 一致 |
| Welch t|t 值 | -1.547637 | -1.547637 | 4.1e-7 | 1.0e-4 | ✅ 一致 |
| Welch t|P 值 | 0.134305 | 0.134305 | 2.0e-7 | 1.0e-4 | ✅ 一致 |
| Welch t|自由度(Welch–Satterthwaite) | 24.9432 | 24.943176 | 2.4e-5 | 1.0e-3 | ✅ 一致 |
| 单因素 ANOVA|F 值 | 5.7101 | 5.71007 | 3.0e-5 | 1.0e-4 | ✅ 一致 |
| 单因素 ANOVA|P 值 | 0.004872 | 0.004872 | 4.0e-7 | 1.0e-4 | ✅ 一致 |
| Kruskal-Wallis|H 值 | 2.7125 | 2.712529 | 2.9e-5 | 1.0e-3 | ✅ 一致 |
| Kruskal-Wallis|P 值 | 0.257621 | 0.257621 | 3.7e-7 | 1.0e-4 | ✅ 一致 |
| Mann-Whitney U|U 值 | 236.00 | 236.00 | 0.0e+0 | 1.0e-6 | ✅ 一致 |
| Mann-Whitney U|P 值 | 0.142605 | 0.142605 | 3.1e-9 | 1.0e-3 | ✅ 一致 |
| Tukey HSD|最小校正 P(三对中最小的一个) | 0.003269 | 0.0033 | 3.1e-5 | 1.0e-3 | ✅ 一致 |
| Pearson 卡方|χ² 值 | 3.815 | 3.81499 | 1.0e-5 | 1.0e-3 | ✅ 一致 |
| Pearson 卡方|P 值 | 0.148452 | 0.148452 | 1.8e-7 | 1.0e-4 | ✅ 一致 |
| Fisher 精确检验|P 值(双侧) | 0.054238 | 0.054238 | 1.0e-7 | 1.0e-4 | ✅ 一致 |
| Pearson 相关|r | 0.442148 | 0.442148 | 4.2e-7 | 1.0e-4 | ✅ 一致 |
| Pearson 相关|P 值 | 0.004282 | 0.004282 | 5.0e-7 | 1.0e-4 | ✅ 一致 |
| ROC|AUC(阳性 30 / 阴性 30) | 0.7394 | 0.739444 | 4.4e-5 | 1.0e-4 | ✅ 一致 |
| DeLong|两 AUC 之差 | 0.073333 | 0.073333 | 3.3e-7 | 1.0e-4 | ✅ 一致 |
| DeLong|差值标准误 | 0.016974 | 0.016974 | 1.7e-7 | 1.0e-4 | ✅ 一致 |
| DeLong|Z 值 | 4.3203 | 4.320289 | 1.1e-5 | 1.0e-3 | ✅ 一致 |
| DeLong|P 值 | 1.60e-5 | 1.56e-5 | 4.2e-7 | 1.0e-4 | ✅ 一致 |
| KM|中位生存时间 | 19.2 | 19.2 | 0.0e+0 | 1.0e-6 | ✅ 一致 |
| log-rank|χ² 值 | 2.1812 | 2.181219 | 1.9e-5 | 1.0e-3 | ✅ 一致 |
| log-rank|P 值 | 0.139704 | 0.139704 | 2.2e-7 | 1.0e-4 | ✅ 一致 |
| Cox 回归|连续协变量 HR | 1.0128 | 1.012806 | 6.2e-6 | 1.0e-3 | ✅ 一致 |
| Cox 回归|连续协变量 P 值 | 0.368284 | 0.368283 | 8.7e-7 | 1.0e-3 | ✅ 一致 |
| Cox 回归|二分类协变量 β | -0.6763 | -0.676265 | 3.5e-5 | 1.0e-3 | ✅ 一致 |
| IPTW|加权 ATE | 2.938795 | 2.938795 | 3.6e-7 | 1.0e-3 | ✅ 一致 |
| IPTW|ATE 标准误 | 0.443834 | 0.443834 | 2.1e-7 | 1.0e-3 | ✅ 一致 |
| SMD|第 1 个协变量的标准化均数差 | 0.0957 | 0.095676 | 2.4e-5 | 1.0e-3 | ✅ 一致 |
| 两因素 ANOVA|因素 A 的 F 值 | 0.6239 | 0.623868 | 3.2e-5 | 1.0e-3 | ✅ 一致 |
| 两因素 ANOVA|因素 A 的 P 值 | 0.537656 | 0.537656 | 3.2e-7 | 1.0e-3 | ✅ 一致 |
| 两因素 ANOVA|因素 B 的 F 值 | 0.0656 | 0.065556 | 4.4e-5 | 1.0e-3 | ✅ 一致 |
| Bland-Altman|系统偏倚(mean diff) | 2.836 | 2.836 | 4.4e-16 | 1.0e-3 | ✅ 一致 |
| Bland-Altman|差值标准差 | 4.1253 | 4.125271 | 2.9e-5 | 1.0e-3 | ✅ 一致 |
| Bland-Altman|一致性上限(bias+1.96SD) | 10.9215 | 10.921531 | 3.1e-5 | 1.0e-3 | ✅ 一致 |
| ICC(1,1)|组内相关系数 | 0.8129 | 0.812947 | 4.7e-5 | 1.0e-3 | ✅ 一致 |
| ICC(1,1)|95%CI 下限 | 0.675 | 0.675002 | 1.5e-6 | 2.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),那通常意味着用错了方法或参数口径。