现在流行“氛围编程”,各种“用AI一句话完成某某任务”。在生物医药领域,最常见的计算任务就是各种统计学假设检验了。那么能否将问题直接丢给AI,让它来做假设检验呢?

题目构造

首先,我们构造一个简单的统计学题目。

问题描述

背景
一家生物制药公司研发了三种新的候选药物:药物A、药物B和药物C。为了评估这些药物的有效性,研究人员进行了一项临床前试验。

实验设计
研究人员选择了98只生理指标水平相似的实验小鼠,并将它们随机分为四组:

  • A组 (n=23):服用药物A。
  • B组 (n=25):服用药物B。
  • C组 (n=28):服用药物C。
  • 对照组 (n=22):服用生理盐水(安慰剂)。

在给药2小时后,测量并记录每只小鼠的某特定生理指标水平。

研究问题
与对照组相比,药物A、B、C中,有哪些药物能够显著降低实验小鼠的某特定生理指标水平水平?(显著性水平 α = 0.05)

数据假设

  • 各组样本数据均独立。
  • 我们无法知道某特定生理指标水平是否是正态分布的。

实验数据

以下是本次实验记录的各组小鼠某特定生理指标水平,数据已经过整理:

对照组 (Control Group)

  • 样本量 (n): 22

  • 数据:
    8.5, 9.1, 7.8, 8.8, 9.5, 7.2, 8.3, 9.9, 8.0, 7.6, 9.2, 8.4, 8.9, 7.1, 9.7, 8.6, 8.1, 7.9, 9.3, 8.7, 9.0, 7.5
    A组 (Group A)

  • 样本量 (n): 23

  • 数据:
    8.2, 7.5, 9.0, 7.9, 8.8, 7.1, 8.4, 9.4, 7.7, 8.1, 8.9, 7.3, 8.6, 9.2, 7.0, 8.5, 7.8, 9.6, 8.3, 7.6, 9.1, 8.0, 8.7

B组 (Group B)

  • 样本量 (n): 25
  • 数据:
    9.3, 8.0, 8.8, 7.7, 9.7, 8.4, 7.2, 8.9, 9.5, 8.1, 7.5, 9.1, 8.6, 7.9, 9.9, 8.3, 7.0, 9.2, 8.5, 7.8, 9.6, 8.2, 7.6, 9.0, 8.7

C组 (Group C)

  • 样本量 (n): 28
  • 数据:
    6.9, 7.8, 6.2, 7.5, 8.1, 6.5, 7.9, 5.8, 7.1, 8.4, 6.7, 7.3, 8.0, 6.0, 7.6, 8.2, 6.8, 7.7, 5.9, 7.2, 8.5, 6.4, 7.0, 8.3, 6.6, 7.4, 6.3, 8.6

答案解析:

先说这道题的答案:由于不能确定数据是否是正态分布是否方差齐性,所以应当进行的是:

  • 总体差异检验:首先,使用 克鲁斯卡尔-沃利斯检验(Kruskal-Wallis H-test) 来判断所有四个组(A, B, C, 对照组)的总体分布是否存在显著差异。这个检验是单向方差分析(One-way ANOVA)的非参数替代方法。如果这个检验结果不显著,我们通常就认为各组之间没有差异,无需进一步分析。如果结果显著,则说明至少有一组与其他组不同,需要进行后续的两两比较。
  • 两两比较:在确定了总体存在差异后,我们需要进行两两比较,以找出具体是哪个药物组与对照组有差异。这里我们将使用 曼-惠特尼U检验(Mann-Whitney U test),它是独立样本t检验的非参数替代方法。
  • 多重比较校正:由于我们进行了三次独立的比较(A vs 对照组, B vs 对照组, C vs 对照组),这会增加犯第一类错误(即错误地拒绝原假设,出现假阳性)的概率。为了控制这个风险,我们需要对显著性水平 α 进行校正。最常用且简单的方法是 邦弗朗尼校正(Bonferroni correction)。
    • 校正方法:将原始显著性水平 α (0.05) 除以比较的次数 (k=3)。
    • 新的显著性水平 α' = α / k = 0.05 / 3 ≈ 0.0167。
    • 在进行两两比较时,只有当p值小于0.0167时,我们才认为差异是统计显著的。
  • 单侧检验:研究问题是“药物能否显著降低生理指标水平”,这是一个有方向性的问题。因此,在进行曼-惠特尼U检验时,我们需要进行单侧检验(one-tailed test)。

计算结果:

--- Kruskal-Wallis H-test ---
H-statistic: 28.6862
P-value: 0.0000
结论: 各组之间存在显著差异,可以进行两两比较。

--- Mann-Whitney U Tests (与对照组比较) ---
原始显著性水平 α = 0.05
邦弗朗尼校正后显著性水平 α' = 0.0167

药物A vs. 对照组:
U-statistic: 213.5
P-value (one-tailed): 0.1878
结论: 不显著 (p >= 0.0167)

药物B vs. 对照组:
U-statistic: 273.5
P-value (one-tailed): 0.4915
结论: 不显著 (p >= 0.0167)

药物C vs. 对照组:
U-statistic: 88.0
P-value (one-tailed): 0.0000
结论: 显著 (p < 0.0167)

备选AI

我常用的国内AI分别是通义千问、清华的GLM和豆包,前两者的模型都很出色,豆包则在应用实现上见长。对于DeepSeek,虽然它名声响亮,但其过去有很高的幻觉率并且缺乏对话之外的功能实现,所以我通常只用deepseek来写小说。但这次我也可以一并评测。

我们这次使用的都是各自的网页版,而不是手机版。这种涉及大量数据的,手机屏幕操作起来实在麻烦。

初步测试

我们可以使用一个简单的prompt:"请选择合适的统计学假设检验方法,判断药物A,B,C的有效性。并解释选择该方法的原因。",再附上上述题目(别把答案一并给了)。我们需要验证的项目:

  1. 统计学方法是否选择正确:用Kruskal-Wallis H-test和Mann-Whitney U Tests,并进行校正
  2. 结论是否正确:A,B与对照组相同,C有差异。这里有个容易钻空子的地方,C组的均值明显小一点,很容易猜出其有效
  3. 计算结果是否正确:
    • H-statistic: 28.6862
    • A vs 对照: U-statistic: 213.5,P-value (one-tailed): 0.1878
    • B vs 对照: U-statistic: 273.5,P-value (one-tailed): 0.4915
    • C vs 对照: U-statistic: 88.0, P-value (one-tailed): 0.0000

初步测试结果:

  • Qwen3: 统计方法选择正确;结论正确;未进行计算。Qwen3 很诚实,没算就是没算,把python程序列出来了,但没有执行出结果
  • GLM4.6: 统计方法选择正确;结论正确;未进行计算。GLM 4.6也很诚实。
  • 豆包:统计方法选择正确;结论正确;给出了计算结果,
    • A 组 vs 对照组:U=227.5,p=0.182(>0.0167,不显著);
    • B 组 vs 对照组:U=252.0,p=0.365(>0.0167,不显著);
    • C 组 vs 对照组:U=58.0,p<0.001(<0.0167,显著)。
  • DeepSeek: 统计方法选择正确;结论正确;计算结果几乎正确。
    • A vs 对照组:U = 213.5,z值 ≈ -0.896,p值 ≈ 0.185,p值 > 0.0167,不显著。
    • B vs 对照组:U = 273.5,z值 ≈ -0.032,p值 ≈ 0.487,p值 > 0.0167,不显著。
    • C vs 对照组:U = 88,z值 ≈ -4.299,p值 < 0.0001(远小于0.0167),p值 < 0.0167,显著。

评估讨论

  • 各大AI对统计学方法的选择是很统一的,这一点其实就已经很有帮助。可以把AI当作一个见多识广的师兄弟,在统计学方法上可以多多请教。如果不确认,可以多问几个AI,大家互相同行评议。
  • 豆包并没有真正计算,就是蒙了个数字,还不说自己是蒙出来的,最为恶劣。
  • DeepSeek可以展开看思考过程,我发现它居然手工计算了一遍U值。这里的错误是在p值的计算上,虽然大方向是对的,猜测的误差也很小,但能够看出来是猜的。DeepSeek的手算虽然精神可嘉,而且自己手算了三遍,但如果数据量大起来,恐怕并不可靠。
  • Qwen3和GLM4.6虽然诚实,但并未解决问题。

可以看出DS最接近完成,但具体数据仍然有误差,所以更好的方式是令AI能够调用自己写好的代码,借助程序来计算结果。
此处还有一个问题,我们在判断DS不可靠时,是将其与预先计算好的结果相比较。但如果你并没有提前算好的结果,那应该怎么办?一个可行的方法是,新开一个对话页面,把问题再问一遍,看计算结果,如果算法中没有随机抽样的过程(如本例),那么计算结果一定是相同的,如果两次或者多次的结果有差异,说明它没有真正计算,是猜的。

AI代码运行能力

显然各大AI是不可能预装SPSS的,要让它们计算,需要运行程序源代码。常用在统计学上的计算机语言有R和Python,但不一定AI供应商提供了这种语言的运行环境。因为这相当于该供应商要给用户提供一个类似于虚拟电脑的东西,分配计算资源,这是相对小众的需求,要实现起来有一定成本,AI供应商不一定愿意。

除了R和python,有很多AI还会进行网页的撰写,在网页运行时也有一种能够计算的语言叫做Javascript,它实际上是在浏览器中运行的,其实并不占AI供应商的运算能力,所以这部分很有可能提供。

为了测试各AI是否具有代码运行能力。我请Gemini设计了这样的prmopt:

  • 请使用Python的SciPy库,帮我计算标准正态分布在x=1.234处的概率密度函数(PDF)值,小数点后保留8位精度,并给出代码。
  • 请使用R语言(例如,使用内置的stats包),帮我计算标准正态分布在 x=1.234 处的概率密度函数(PDF)值,小数点后保留8位精度,并给出代码。
  • 请使用JavaScript,并调用一个从CDN(例如 jsDelivr 或 cdnjs)加载的流行统计库(例如 jStat.js),帮我计算标准正态分布在 x=1.234 处的概率密度函数(PDF)值。请小数点后保留8位精度,并给出一个完整的HTML文件示例代码。如果CDN调用错误,应该检测并告知用户

这里的SciPy, stats和jStat.js都是各语言用于统计学分析的专用工具包,这些工具包通常是开源的,已经接受了很多的审核。这样做比让AI自己去写假设检验的算法更可靠。其中JavaScript需要从外部网站(内容分发网络,简称CDN)调用这个工具包。

这道题的正确答案是:0.18631499

还有一个禁止AI使用外部统计库的测试prmopt:

请使用JavaScript,并且仅使用内置的Math对象,帮我计算标准正态分布在 $x=1.234$ 处的概率密度函数(PDF)值。请注意: 不要使用任何外部统计库(例如从CDN加载的jStat.js)。你必须自己使用Math.PI、Math.exp()、Math.sqrt()等函数来实现标准正态分布的PDF计算公式。请将结果小数点后保留8位精度,并给出完整的代码。

AI代码运行能力测试结果

  • Python(SciPy)和R语言的测试:全军覆没! Qwen3, GLM4.6, 豆包, DeepSeek没有一个能做对的。这种到小数点后8位的精度验证就可以找出滥竽充数的AI。】=
    • 【修订: GLM如果开启了“Full-Stack”,则它会以python作为“后端”,进行“全栈开发”,此时是可以用Scipy的】
  • JavaScript调用jStat.js的测试:全军覆没!
    • 【修订1: Qwen3又能用了通过了,不确定是否是测试当时CDN出错】
    • 【修订2:仔细分析豆包的代码后发现这几个AI会把代码中jState.js写成jstat.js,导致计算出错,如果强调“注意jStat.js的大小写”,则可以通过。这种细微的小坑对新手太难了,不要指望你能发现。】
    • 【修订3: GLM表现是无显示,追问后得到:“问题在于我创建了一个独立的HTML文件,但Next.js项目需要通过页面组件来显示内容。”然后再修改后可以正确加载】
    • 【简单地说,上述修订后能通过的情形,对于一个编程新手来说,几乎是仍然无法通过的。】

注意在使用js进行计算时,要令AI以为自己在做网页,

  • 在Qwen3,叫“网页开发”
    An image to describe post
  • 在GLM4.6,叫“Full-Stack”
    An image to describe post
  • 在豆包,叫“创作”
    An image to describe post
  • DeepSeek没有选项

单纯使用js内置Math对象的测试:

  • Qwen3:通过
  • GLM4.6:通过
  • 豆包:通过,但要点击一下“运行”按钮,豆包自己的文字回答在瞎掰
  • DeepSeek:错误,不能执行代码。DS自己胡诌了一个答案。

讨论

看来只有让这些AI以做网页的形式来计算统计学问题了,而且不能依赖外部现成的统计学工具包,只能让它们自己写假设检验函数。

完整测试

这次我们使用更确切的计算prompt:


请选择合适的统计学假设检验方法,判断药物A,B,C的有效性。并解释选择该方法的原因。

请使用JavaScript进行计算分析,并且仅使用内置的Math对象,请注意: 不要使用任何外部统计库(例如从CDN加载的jStat.js)。你必须自己使用Math.PI、Math.exp()、Math.sqrt()等函数来实现。

最终给出完整的计算结果和分析报告。

这一次的测试,各个AI其实不仅仅是在做计算,还需要设计出一个完整的网页来展示答案,所以耗时相当长。如果发现页面不动了,可以刷新一下。

  • Qwen3: Kruskal-Wallis H-test未做。Mann-Whitney U Tests结果不正确
    • 页面展示:没部署成功
  • GLM 4.6: Kruskal-Wallis H-test计算结果不正确,Mann-Whitney U Tests计算结果不正确。
    • 页面展示:https://s0tv28fckh50-deploy.space.z.ai/
  • 豆包: Kruskal-Wallis H-test计算结果不正确,Mann-Whitney U Tests计算结果不正确。
    • 页面展示:https://www.doubao.com/share/code/6de9d0fc5de865d9
  • DeepSeek:根本没算,自己胡编了答案。

【补充修订】

  • Qwen3后来不知为啥又可以用jStat了,但计算结果仍有微小差异
  • GLM4.6在全栈模式下,可以使用python当作后端,能够调用scipy。但一开始按双侧检验计算的,如果提出质疑,则能够计算出正确结果。

讨论

要让AI自动完成统计学假设检验。需要通过几个关卡:

  1. 选择正确的假设检验方法。这一点大多数AI都可以做到,其实已经给了很大的帮助。当不确定时可以多问几个AI,让他们之间互相同行评议。
  2. AI要能够调用计算工具进行高精度的计算。实测后发现,调用外部统计学工具包很困难,当前似乎只能用Javascript的内置Math对象进行计算。
  3. AI应当使用经过验证的统计学工具包,以避免其自行编写假设检验函数时出错。由于调用外部CDN总是出错,所以其实也无法达成。
  4. AI在编写程序时应当注意不要引入新的误差,例如由于样本量不同,如果将所有数据放入一张数据表进行操作(例如Python的Pandas),就有可能遇到空值填充的问题,如果填充方式不正确,就会导致运算结果出错。这一层的问题需要有足够的编程能力。

就当前的测试,国内AI没有能够通过这些关卡的。实际上我也测试了国外AI,目前能够免费使用的版本中,只有Google的AIstudio可以正确完成所有计算,并且不出错,这次的题目也是由它进行的计算。

【修订1:补充讨论】
在发现CDN可用之后,再次对Qwen3进行了测试,这次的答案中U值计算正确,但对应的p值计算大约翻倍,于是质问Qwen3是否应当使用单侧分析,Qwen3发现问题所在,重新计算。计算后的p值仍然有微小的差异。将代码交给AI studio(Gemini 2.5 pro)分析。可以看出如果不使用专业的统计包和正确的设置,要完全取得正确答案仍然是非常困难的。

以下为报告:

附注:关于不同统计工具计算结果差异的说明

在本次分析中,我们注意到若使用不同的统计软件或库(例如Python的scipy库与某些在线JavaScript计算器),可能会得到略有差异的p值。例如,本报告采用scipy计算药物A和B相对于对照组的p值分别为0.1878和0.4915,而一个基础的JavaScript实现给出的p值为0.1849和0.4872。

经过验证,Python scipy库的结果更为准确和可靠。这种差异主要源于scipy在执行曼-惠特尼U检验时,默认包含了两个重要的统计校正:

  1. “结”校正 (Tie Correction):当数据中存在多个相同的值时(即“结”),此校正会调整检验统计量的方差,使得结果更加精确。我们的实验数据中存在大量的“结”,因此该项校正非常必要。
  2. 连续性校正 (Continuity Correction):在使用连续的正态分布来近似离散的U统计量分布时,该校正可以提高近似的准确性,通常会使结果更为保守。

由于网页版的基础脚本未执行这些标准的校正,其结果存在微小偏差。因此,本报告完全采信经过专业统计库scipy计算得出的p值作为最终判断依据,以确保分析的严谨性和准确性。

结论

  1. 如果你不具备一定的编程能力和足够的统计学知识,当前国内AI还不足以完成自动化的统计学假设检验分析。
  2. 如果有一定的编程经验和统计学知识,Qwen3和GLM4.6 是好帮手,使用得当时很可能得到正确结果。

本次评测仅仅代表当前时间(2025年10月19日)和当前运行环境下的评测。AI发展很快。

【更新】