python - 用于多组比较的 Python 中的 T 检验
问题描述
我想在 python 中进行一个简单的 t 检验,但我想比较所有可能的组。假设我有以下数据:
import pandas as pd
data = {'Category': ['cat3','cat2','cat1','cat2','cat1','cat2','cat1','cat2','cat1','cat1','cat1','cat2','cat3','cat3'],
'values': [4,1,2,3,1,2,3,1,2,3,5,1,6,3]}
my_data = pd.DataFrame(data)
我想根据所有可能的类别组合的 t 检验计算 p 值,它们是:
cat1 vs. cat2
cat2 vs. cat3
cat1 vs. cat3
我可以通过以下方式手动执行此操作:
from scipy import stats
cat1 = my_data.loc[my_data['Category'] == 'cat1', 'values']
cat2 = my_data.loc[my_data['Category'] == 'cat2', 'values']
cat3 = my_data.loc[my_data['Category'] == 'cat3', 'values']
print(stats.ttest_ind(cat1,cat2).pvalue)
print(stats.ttest_ind(cat2,cat3).pvalue)
print(stats.ttest_ind(cat1,cat3).pvalue)
但是有没有更简单直接的方法来做到这一点?类别的数量可能因情况而异,因此需要计算的 t 检验的数量也会有所不同......
最终输出应该是一个 DataFrame,每个比较都有一行,并且值:category1 | 类别2 | p 值,在这种情况下,它应该如下所示:
cat1 | cat2 | 0.16970867501294376
cat2 | cat3 | 0.0170622126550303
cat1 | cat3 | 0.13951958313684434
解决方案
itertools.combinations
考虑跨类别迭代:
from itertools import combinations
...
def ttest_run(c1, c2):
results = stats.ttest_ind(cat1, cat2)
df = pd.DataFrame({'categ1': c1,
'categ2': c2,
'tstat': results.statistic,
'pvalue': results.pvalue},
index = [0])
return df
df_list = [ttest_run(i, j) for i, j in combinations(mydata['Category'].unique().tolist(), 2)]
final_df = pd.concat(df_list, ignore_index = True)
推荐阅读
- javascript - 几乎彼此相同的两段代码(在javascript的画布中)具有截然不同的行为
- android - Google Play 上未列出的公开测试版
- centos - 如何远程连接postgresql服务器
- twilio - Twilio API“IncomingPhoneNumber.list()”在主帐户上很慢(而且我只需要总数)
- qt - QT 5.12 Prototype Cycle,最后一个非重复元素错误 M303
- r - R以相反的顺序将数据表转换为向量
- c# - Xamarin Android:使用按钮导航视图删除选定的 recyclerview 项目
- java - 如何使用eclipse在tomcat 9中调试websockets
- reactjs - 使用 React Hooks 实现更改文本的无限循环
- algorithm - 安排循环赛