【问题标题】:Loop T-Test for Comparison of Multiple Data Columns用于比较多个数据列的循环 T 检验
【发布时间】:2021-04-03 22:49:11
【问题描述】:

我有一个有 11 列数据的熊猫。我想通过测试将每一列与其他每一列进行比较(见下文)。如何创建一个自动比较所有列的循环,而无需为每个列对组合手动编写代码?

from scipy.stats import ttest_ind
data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
stat, p = ttest_ind(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
    print('Probably the same distribution')
else:
    print('Probably different distributions')

是否可以在矩阵或图形中显示结果?提前谢谢!

【问题讨论】:

    标签: python pandas python-unittest


    【解决方案1】:

    让我们使用嵌套 dict 推导来计算每个可能的列组合的 t-test,然后从嵌套 dict 初始化一个新数据帧以创建格式良好的矩阵表示:

    dct = {x: {y: 's={:.2f}, p={:.2f}'.format(
              *ttest_ind(df[x], df[y])) for y in df} for x in df}
    mat = pd.DataFrame(dct)
    
    
    print(mat)
                     data1           data2
    data1   s=0.00, p=1.00  s=0.33, p=0.75
    data2  s=-0.33, p=0.75  s=0.00, p=1.00
    

    如果你需要只包含p-values的矩阵:

    dct = {x: {y: ttest_ind(df[x], df[y]).pvalue for y in df} for x in df}
    mat = pd.DataFrame(dct)
    
    print(mat)
             data1    data2
    data1  1.00000  0.74847
    data2  0.74847  1.00000
    

    要计算所有p-values 的平均值,请使用:

    mat.to_numpy().mean()
    0.8742349436807844
    

    注意:df 是包含 data1data2 列的数据框 ...

    【讨论】:

    • 有没有办法计算矩阵中所有p值的平均值?
    • 是的,我们可以,但在这种情况下,我们必须修改 dict 理解。您是否也对结果中的 s 值感兴趣?如果不是,我们可以从矩阵表示中删除s 值,那么计算平均值会容易得多。
    • 我最感兴趣的是p值,我们可以去掉s值。感谢您的帮助!
    • 谢谢!我尝试了使用 _rel 而不是 _ind 的方法。一切都很好,除了平均值,因为我得到了 Nan,在计算平均值时有没有办法避免 Nans?
    • @CSBossmann 检查np.nanmean(mat.to_numpy())
    【解决方案2】:

    如果我的问题是正确的,您可以这样做: (DATAS 只是一个示例 DataFrame。 结果在照片上,我只是没有显示全部。)

    DATAS=pd.DataFrame({"X":data1,"Y":data2,"Z":data3,"T":data4})
    
    display(DATAS)
    
    
    
    from scipy.stats import ttest_ind
    for  a in DATAS.columns:
        for b in DATAS.columns:
            stat, p = ttest_ind(DATAS[a],DATAS[b])
            print('stat=%.3f, p=%.3f' % (stat, p))
            if p > 0.05:
                print('Probably the same distribution')
            else:
                print('Probably different distributions')
    
    

    【讨论】:

      【解决方案3】:

      在此示例中使用稀疏数据时,直方图会显示一些内容,但不会显示全部内容。

      from scipy.stats import ttest_ind
      import matplotlib.pyplot as plt
      data1 = [0.873, 2.817, 0.121, -0.945, -0.055, -1.436, 0.360, -1.478, -1.637, -1.869]
      data2 = [1.142, -0.432, -0.938, -0.729, -0.846, -0.157, 0.500, 1.183, -1.075, -0.169]
      stat, p = ttest_ind(data1, data2)
      print('stat=%.3f, p=%.3f' % (stat, p))
      if p > 0.05:
          print('Probably the same distribution')
      else:
          print('Probably different distributions')
      plt.hist(data1, bins=5, color='c', edgecolor='k', alpha=0.5)
      plt.hist(data2, bins=5, color='g', edgecolor='k', alpha=0.5)
      

      你会得到这样的情节

      要真正了解学生 T 检验,请查看 https://en.wikipedia.org/wiki/Student%27s_t-test

      【讨论】:

        猜你喜欢
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        • 2019-09-08
        • 2015-05-19
        • 2015-05-03
        • 1970-01-01
        相关资源
        最近更新 更多