医学审稿这些年,我见过最让我后背发凉的稿件,不是结论互相矛盾的那种,而是数据“漂亮”到不像真的那种。前阵子审到一篇随机对照试验,两组基线表堪称完美:年龄均值几乎一样,标准差精确到小数点后两位都相同,各组脱落人数整整齐齐,所有次要结局的p值都落在0.01到0.05之间,没有一个“多余”的阳性或阴性结果。我当时的第一反应不是“这研究做得真好”,而是“这数据怕是掺了水”。
这里先说明一下,我写这篇东西不是说审稿人要当侦探,更不是说所有可疑数据都等于学术不端。现实中大量所谓“造假”其实是录入错误、统计软件误用、图表缺省设置造成的偏差,甚至只是作者不小心把标准误写成了标准差。但不管是故意还是无意,审稿人都有责任在能力范围内识别这些“水分”,把问题挡在发表之前。这篇文章就把我这些年积累的、用来甄别医学数据可疑信号的方法和工具一次性梳理出来,给同样在审稿的同行、正在写论文的科研新人和被数据折磨的医学研究生做个参考。
1. 数据“指纹”检查:先从描述性统计里找破绽
1.1 均数与标准差的组合是否“物理上可能”
我在审稿时看一篇论文的第一件事,不是看p值,而是翻基线特征表,在脑子里快速做一道算术题。临床研究的人群特征很少是均匀分布的,如果一张表上写着“年龄:23.5 ± 1.2岁,n=100”,我马上就会警觉:这意味着几乎所有受试者的年龄都落在22.3到24.7岁之间。除非入组标准限定得极其狭窄——比如只收某校大一新生、出生月份都限定在同一个季度——否则这在现实中几乎是不可复现的。
快速检验的方法很简单:如果数据近似正态分布,那么99.7%的观测值应该在均值±3个标准差的范围内。换句话说,均值23.5岁、标准差1.2岁时,理论上应有约99个样本的年龄落在20.1到26.9岁之间。你只要对照入组标准和时间跨度想一想,就会明白这个分布的合理性存疑。我常跟年轻审稿人说的一句话是:先不急着算统计量,先问自己“这个数据在物理世界里长什么样”。一个连续3年招募受试者的多中心试验,年龄标准差通常不会小到1岁以内,除非样本量极小或者入组人群高度同质。
还有更隐蔽的版本:作者报了一组收缩压“128.3 ± 3.1 mmHg”,但正常成年人的收缩压波动范围通常是110到140以上,标准差3.1意味着几乎每个人都在125到131之间——单中心、同一天、同一台血压计、静息状态下连续测量可能接近,但只要是多天、多中心测量,这个离散度就异常低。审稿时不需要做正式检验,靠“现实感”就能圈出可疑项。
1.2 基线表的标准差“整齐得诡异”
第二个常被我盯上的信号,是两组或多组标准差的相似程度。真实数据里,干预组和对照组的基线标准差当然可能接近,但如果连小数点后一位都完全一致,尤其是年龄、病程、评分这类变异度本应不同的人群指标,就需要留个心眼。
把数据“制造”出来的人,很容易不小心把同一列标准差复制到多个组里;更常见的操作是先用软件生成一组数据,再手动微调均数,此时标准差往往原样保留。这种“复制痕迹”是数据指纹的一部分。你可以把连续变量的标准差按行排列,如果出现大量重复值,或者SD与均数之间的比例在所有变量间保持一致,往往说明这些数字不是从原始病例记录表里录进去的。
还有一个我特别在意的细节:所有连续变量的标准差都不为零,且大小都刚好在均数的5%到10%之间。真实数据不是这样的。有的指标变异度可以小到接近零(比如体温),有的则大到接近均数的30%(比如某些炎症指标),全表整齐划一的离散度,是手工编造数据的典型特征之一。
1.3 分类变量的百分比暴露出的“整数偏好”
二进制变量和分类变量的百分比也值得多看两遍。真实研究中,受试者的性别比例、并发症比例基本不会出现整整齐齐的数字。一篇300人的试验报告说男性占比“50.0%”,另一个分组里“高血压病史:40.0%”,这种整数百分比在一两个变量上出现还可以解释为巧合,但如果多个分类变量的百分比都精确成整数,就很可能是先设定了比例再反向填充样本。
更敏感的信号是:所有分类变量的阳性率都恰好落在“好看”的区间,比如基线均衡性检验的p值全都大于0.5——这不是不可能,但整张表十几行的均衡性p值没有一个小于0.2,也没有一个大于0.9,那就需要多问一句“数据到底怎么来的”。真实的随机化分组不会把每一条基线特征都平衡得这么“圆满”,偶尔出现一两个p值是0.03、0.04才更像抽样的随机波动。
2. p值的统计学陷阱:整齐的显著性本身就是异常
2.1 为什么“所有结果都显著”反而可疑
科研论文里最常见的造假痕迹不是伪造原始数据,而是“调整”统计分析结果,让无差异的组间比较变得“漂亮”。正常情况下,一篇探索性研究做了二十次比较,能有两三个p值小于0.05就已经不错;如果一篇论文的次要结局全部显著,且p值集中在0.01到0.045之间,你就要怀疑是否有人在报告前筛选过结果。
这里涉及一个基本概率直觉:当原假设为真时,p值在0到1之间是均匀分布的;即使部分原假设为假,也不会出现所有p值都齐刷刷挤在0.01到0.05区间的情况。真实研究里,次要结局的p值序列通常是混合的:0.21、0.046、0.003、0.67、0.089、0.031,这种参差不齐的分布才是常见的。
所以我在审稿时会把论文里所有p值列成一张表,观察它们的分布形态。如果所有“显著”结果都集中在0.01到0.05的窄带里,没有任何小于0.001的结果(而样本量明明很大),也没有任何大于0.2的结果,那这份数据就存在明显的“人为打磨”痕迹。这不是统计学检验,而是基于p值真实分布规律的经验推断,但非常有效。
2.2 用均数、标准差和样本量反向复算t值
比看分布更硬核的一招,是根据论文报告的两组均数、标准差和样本量,自己动手复算t值和p值,再和原文给出的p值对照。具体公式是两独立样本t检验的基础形式:
[ t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}} ]
拿到这个t值后,再根据自由度(近似等于 n1+n2-2)查t分布表,或者用在线t分布计算器得到p值。如果作者报告“p=0.03”,你复算出来的p值却是0.40,那说明原始均数、标准误和报告结果之间至少有一个是假的。
这个方法对审稿人来说性价比极高,因为你不需要原始数据,只要论文正文里的描述性统计完整,就能在十分钟内完成复算。我实际审稿时遇到过一次:作者报告干预组与对照组均数差异的p值为0.04,但我用报告的两组均数和标准差反推,算出来的t值只有0.8左右,对应p值0.42。后来编辑要求作者提供原始数据,作者最终撤回了稿件,原因是“统计分析文件版本弄混了”——至于是不是真的弄混,我不能替编辑下结论,但至少这道复算程序证明了我最初的怀疑是有道理的。
2.3 标准误与标准差的混用:最常见的“注水”根源
还有一种情况非常普遍,也是很多论文“神秘显著”的来源:作者把标准误(SEM)当成标准差(SD)用,或者在图表里给误差条标注成标准差,实际上画的是标准误。标准误等于标准差除以样本量的平方根,当n=100时,SEM只有SD的十分之一。有些图表里的误差条看起来非常“苗条”,你以为变异很小,其实只是作者用错了公式。
审稿时看到一个诡异的小误差条,我会先看它的数值是否等于“报告的标准差除以根号下样本量”。如果是,那最小的修改建议是请作者统一使用SD,因为SEM反映的是抽样分布的离散度,不是个体变异,在描述样本特征时通常会误导读者。这里要强调一点:混用SD和SEM不一定是造假,但在很多情况下足以改变对结果的解读。你复算时用错了参数,结论自然就跑偏了。
3. 图表的逆向验证:一张图能暴露比表格更多的问题
3.1 误差条的长度和形态反映“数据底稿”
论文图表是最容易露馅的地方,因为很多造假者只精心设计了表格数字,没意识到图里每个点的位置、误差条的长短都可以被审稿人反算出来。拿到一张柱状图,我先看误差条顶端标注的是SD还是SEM;如果图表没有说明,我倾向于默认它是SD,但会检查它是否与正文表格一致。
然后我会用PDF阅读器或图片处理软件放大图上的坐标轴,数像素长度,估算误差条对应的数值,再与表格中的SD逐一对齐。这个方法听起来笨,但在无法获取原始数据时,是有效的交叉验证手段。真实数据制成的图表,误差条长短不会一模一样;手工拼接的图,误差条可能整齐划一、比例失调,甚至出现同一个误差条在不同分组间复制粘贴的痕迹。
还有一种需要警惕的图形信号是:所有误差条都刚好画到坐标轴刻度线的位置,误差条上限或下限正好压在某条网格线上。真实统计图中,误差条的端点位置是由数据决定的,几乎不可能“恰巧”和视觉网格对齐那么多次。
3.2 散点图上的点“分布太完美”也是问题
临床论文里最常见的散点图是表现两组连续变量分布或相关性的图。真实观测数据的散点图是有“毛边”的:点与点之间疏密不均,回归线两侧会有些异常点,个别点会偏离整体趋势相当远。如果你看到一张散点图上所有点都紧贴回归线,距离几乎一致,且没有任何离群值,大概率是人为生成了符合“理想关系”的数据。
更隐蔽的是聚类分布异常。比如某个生物标志物与预后评分的散点图,真实数据通常会出现明显的簇状聚集——某个区间里密密麻麻,另一个区间稀稀拉拉。而人为构造的数据往往设计得“均匀覆盖”,让每个区域都差不多密。这种过度均匀,本身就是不自然的。
3.3 生存曲线和森林图的“形状直觉”
生存分析图也经常被动手脚,因为曲线形状会给评审者很强的视觉冲击。真实的Kaplan-Meier曲线通常有阶梯状结构,尤其是样本量不太大的时候;事件发生时间越分散,曲线上的阶梯越细碎,而且在随访后期,由于失访和事件堆积,曲线尾部会变得不稳定,置信区间明显变宽。
如果一条生存曲线的两条组别曲线分开得“干净利落”,每个随访时间点两组累积生存率差异几乎同步增加,并且置信区间的带宽没有在后期拉开,这不符合真实的删失模式。我经常会问自己一个问题:如果100个人里在随访第30天、第60天、第90天各死亡了若干人,那么生存概率在每个时间点的下降应该是离散的跳跃。如果图上曲线是平滑的圆弧下降,那说明作者要么用了参数生存模型但没说明,要么数据本身就是拟合出来的。
森林图的检查更简单:亚组分析里各个效应量的置信区间宽度应该随样本量变化。小样本亚组的置信区间通常极宽,如果某个亚组只有40人,但置信区间窄到和1000人的主分析差不多,那就违反了基本的抽样误差规律。
4. 快速复核工具:用Excel和R把可疑数据“拆开”看
4.1 在Excel里重建数据分布,检验合理性
不需要高级统计软件,Excel就能做很多复核工作。比如文章报告某量表得分“48.6 ± 5.2,n=80”,你可以用Excel的随机数生成功能模拟一组同均值、同标准差的数据,看看它的最小值和最大值是否落在合理范围内。操作方法是:在一个空白列输入公式=NORM.INV(RAND(), 48.6, 5.2),然后向下填充80行。这样生成的随机数大致符合正态分布,你可以看FREQUENCY分布、最小值、最大值、负值出现的次数。
模拟结果如果让你觉得“这个变量在实际临床里不可能出现这么小的离散度”,那就是第一层怀疑的佐证。比如心理量表得分理论上应该在0到100之间,如果你模拟出的数据出现了大量负值或超过100的值,但作者报告的数据范围看起来全在合理区间内,这并不说明作者数据真实,反而说明真实人群的分布几乎不可能恰好避开所有极端值。审稿时我不会用模拟结果给数据“定罪”,但会用模拟来帮自己判断某个统计量的现实合理性。
4.2 用R语言做快速的组间差异复算
如果你装了R,复核速度会更快。下面这段代码可以让你根据论文提供的两组均数、标准差和样本量,计算出t值、自由度和p值。把数据换成你正在审的论文即可:
# 从论文中提取的数据 n1 <- 45; mean1 <- 52.7; sd1 <- 6.4 n2 <- 45; mean2 <- 49.5; sd2 <- 5.9 # 合并标准误 se <- sqrt(sd1^2 / n1 + sd2^2 / n2) t_stat <- (mean1 - mean2) / se # 自由度(韦尔奇近似) df <- (sd1^2 / n1 + sd2^2 / n2)^2 / ((sd1^2 / n1)^2 / (n1 - 1) + (sd2^2 / n2)^2 / (n2 - 1)) # 双侧p值 p_value <- 2 * pt(-abs(t_stat), df = df) t_stat df p_value运行后得到的p值如果和原文报告的大相径庭,你就有底气在审稿意见里写出“经使用作者提供的数据复核,两组的均数差异与报告结果不一致,请作者提供统计分析代码与原始数据”这类要求。
R的另一个用途是检查分布形状。比如用rnorm()模拟出与原文同均值、同标准差的数据,再用summary()看最小值、最大值,或者画一个简单直方图,就能看出这个参数设置在真实采样时会出现多少“异常值”。如果模拟数据中出现了临床上不可能的值,而原始论文里没有任何异常值记录,那审稿人完全有理由怀疑原始数据经过了筛选或改写。
4.3 在线计算器与统计补充材料的使用
不熟悉R的审稿人,也可以用在线t检验计算器,把均数、标准差、样本量填进去,十秒钟就能得到复算结果。这类工具很多,随便搜索“two sample t-test calculator”就能找到,关键是要注意选择Welch's t-test还是Student's t-test,因为两者在方差不等时p值略有差别。为了避免误判,我通常两种都算一遍,只要论文报告的结果与其中一种方法无法对应,就说明需要解释。
现在的很多期刊也鼓励作者提交统计补充材料,包括分析代码、软件版本、输出清单。如果论文的核心结论完全依赖于某个复杂统计模型,而补充材料里却没有代码或过程文件,这个缺失本身就是一个值得指出的问题。我的习惯是:凡是p值出现异常集中的论文,都要在评审意见里明确要求作者补充统计分析文件和原始数据的筛选过程。
5. 如果只有十分钟:给审稿人的快筛清单
5.1 一张表快速过一遍高风险信号
下面这张表是我在真正动笔写审稿意见之前会给自己过一遍的清单。不需要精细计算,每项看一眼就能对上号:
| 检查项 | 怎么检查 | 需要注意的危险信号 |
|---|---|---|
| 基线特征表的SD模式 | 把各组SD逐行比对 | SD高度重复、与均数比例整齐、标准差过小 |
| 分类变量百分比 | 看是否为整数 | 多个百分比精确到整数位,且分布“干净” |
| p值序列分布 | 把所有p值列成一条线 | 集中在0.01~0.05,缺乏高p值和极低p值 |
| 均数、SD、样本量复算 | 用t检验公式反推 | 复算p值与报告值差异巨大 |
| 误差条标注 | 看图注是否说明SD/SEM | 未注明、或SEM被当作SD描述样本变异 |
| 生存曲线形状 | 看台阶结构和CI带宽 | 曲线过度平滑、CI尾部没有增宽 |
| 森林图亚组CI | 对比亚组样本量与CI宽度 | 小亚组CI窄得和主分析一致 |
| 四舍五入偏好 | 看小数位数分布 | 大量数值保留两位且末位集中在0和5 |
列完这张表,我已经能在大概十分钟内对一篇稿子的数据面形成基本判断。如果同时命中三项以上,我会直接建议编辑要求作者提供原始数据、统计分析代码和病例报告表,然后再进入实质性的科学评审。不是所有命中清单的论文都有问题,但绝大多数有问题的论文都能在清单上留下痕迹。
5.2 拿到可疑信号后的下一步动作
如果快筛出了问题,我不建议立刻在审稿意见里写“作者涉嫌数据造假”。这种指控措辞太重,而且容易给真正严谨但操作失误的作者带来伤害。更合理的做法是把“数据自洽性不足”作为主要问题列出,要求作者补充:第一,原始数据表或可复现的统计代码;第二,对标准差来源、误差条类型、p值计算方法的澄清;第三,如果在复核中出现明显不一致,请作者逐一解释差异来源。
很多情况下,作者的回复会暴露问题的根本:有人会承认“标准差复制错了列”,有人会说“p值是单尾检验但没写清楚”,也有人会在补充材料中提供完整的数据集,届时复核全部通过。也有少数情况,作者直接失联、不再回复,这时候编辑通常会启动撤稿程序。我的经验是,审稿人最有力的武器不是“指控”,而是“提问”——你只要提出清晰、具体、可复算的问题,绝大多数真假数据都会露出原形。
6. 写在最后:审稿人的任务不是当侦探,而是当守门员
说句掏心窝的话,我刚开始审稿时也走过弯路:一看到数据可疑就肾上腺素飙升,想立刻把作者“绳之以法”。但审得多了,我发现这种做法既不明智也不公正。医学研究的数据链很长,从病房里的原始记录到统计软件里的数据集,再到论文里的表格和图表,任何一个环节都可能出错。我要做的是守住统计逻辑与报告透明度的底线,而不是扮演福尔摩斯。
我的常用做法是,在审稿意见里先写“作者报告的数据存在若干不一致之处,具体如下”,然后用条目把每一个可疑点列出,最后请作者提供相应材料加以解释。这个流程既保护了作者的正当权益,也尽了审稿人的职责。对一个可疑论文最好的结果,不是被扣上“造假”帽子,而是通过复核她/他的数据,让大家看到真相——即使真相是撤回一篇不严谨的论文。
最后分享一条实操经验,适用于刚入门的审稿人:给自己建一个“审稿复核模板”,把所有需要手动计算的小工具写清楚,包括t值复算、标准误与标准差的换算、p值分布观察表。坚持每次审稿都走一遍这套流程,用不了多长时间,你就能练出对数据“水分”的敏感度。这种敏感度,不是来自天赋,而是来自一次次对数字的较真。