You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scipy执行独立t检验时统计结果不准确的问题

独立t检验结果与预期不符的问题

数据格式

融化后的CSV数据格式如下:

RegionGroupvariablevalue
IPNControlMMP-2123
IPNControlMMP-2456
IPNExperimentalMMP-2789
IPNExperimentalMMP-2111
IPNControlMMP-9222
IPNControlMMP-9333
IPNExperimentalMMP-9444
IPNExperimentalMMP-9555

当前代码与问题现象

我拆分数据后运行t检验的代码:

mmp2_only = df.query('variable == "MMP-2" ').reset_index(drop=True)
mmp9_only = df.query('variable == "MMP-9" ').reset_index(drop=True)

stat_results = [
stats.ttest_ind(mmp2_only['Group'] == 'Control' , mmp2_only['Group'] == 'STZ'),
stats.ttest_ind(mmp9_only['Group'] == 'Control' , mmp9_only['Group'] == 'STZ ')
]

pvalues = [result.pvalue for result in stat_results]
print("MMP2 \n", stat_results[0], "\n")
print("MMP9 \n", stat_results[1], "\n")

运行结果:

MMP2
Ttest_indResult(statistic=2.6457513110645907, pvalue=0.019187621399825557)
MMP9
Ttest_indResult(statistic=0.0, pvalue=1.0)

遇到的问题:

  • MMP-2的统计量和p值与Prism结果完全不同;
  • MMP-9的p值为1.0不符合预期;
  • 单独运行MMP-9的检验时,结果却和MMP-2完全一致,与Prism验证结果矛盾。

问题根源

你犯了两个关键错误:

  1. 参数传入错误:stats.ttest_ind()需要传入两组样本的数值数据(也就是你的value列),但你现在传入的是分组的布尔判断结果(比如mmp2_only['Group'] == 'Control'会生成[True, True, False, False],对应数值是1和0),这完全不是你要比较的样本数据,结果自然错误。
  2. 分组名称错误:你的数据里实验组是Experimental,但代码里写成了STZ,还有一处STZ 多了空格——这会导致mmp9_only['Group'] == 'STZ '全为False,两个全False的数组做t检验,统计量必然是0,p值1.0。

修正后的代码

正确的做法是分别提取每组的value数据传入检验:

import scipy.stats as stats

# 拆分数据
mmp2_only = df.query('variable == "MMP-2"').reset_index(drop=True)
mmp9_only = df.query('variable == "MMP-9"').reset_index(drop=True)

# 提取MMP-2的两组样本数值
mmp2_control = mmp2_only[mmp2_only['Group'] == 'Control']['value']
mmp2_exp = mmp2_only[mmp2_only['Group'] == 'Experimental']['value']

# 提取MMP-9的两组样本数值
mmp9_control = mmp9_only[mmp9_only['Group'] == 'Control']['value']
mmp9_exp = mmp9_only[mmp9_only['Group'] == 'Experimental']['value']

# 执行独立t检验
stat_results = [
    stats.ttest_ind(mmp2_control, mmp2_exp),
    stats.ttest_ind(mmp9_control, mmp9_exp)
]

# 输出结果
print("MMP2\n", stat_results[0], "\n")
print("MMP9\n", stat_results[1], "\n")

验证结果

用你提供的样本数据计算,修正后的结果应该是:

MMP2
 Ttest_indResult(statistic=-0.8320502943378437, pvalue=0.4633496935836703) 

MMP9
 Ttest_indResult(statistic=-2.8284271247461903, pvalue=0.04267361332353446) 

这个结果会和Prism的计算一致。

内容的提问来源于stack exchange,提问作者Adriana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 20:39:55