使用scipy执行独立t检验时统计结果不准确的问题
独立t检验结果与预期不符的问题
数据格式
融化后的CSV数据格式如下:
| Region | Group | variable | value |
|---|---|---|---|
| IPN | Control | MMP-2 | 123 |
| IPN | Control | MMP-2 | 456 |
| IPN | Experimental | MMP-2 | 789 |
| IPN | Experimental | MMP-2 | 111 |
| IPN | Control | MMP-9 | 222 |
| IPN | Control | MMP-9 | 333 |
| IPN | Experimental | MMP-9 | 444 |
| IPN | Experimental | MMP-9 | 555 |
当前代码与问题现象
我拆分数据后运行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验证结果矛盾。
问题根源
你犯了两个关键错误:
- 参数传入错误:
stats.ttest_ind()需要传入两组样本的数值数据(也就是你的value列),但你现在传入的是分组的布尔判断结果(比如mmp2_only['Group'] == 'Control'会生成[True, True, False, False],对应数值是1和0),这完全不是你要比较的样本数据,结果自然错误。 - 分组名称错误:你的数据里实验组是
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
相关产品推荐
相关产品推荐

