【问题标题】:Python, seaborn, statistic analysis using statannot doesn't look rightPython,seaborn,使用 statannot 的统计分析看起来不正确
【发布时间】:2021-08-26 13:06:58
【问题描述】:

我使用 statannot 对一些基础数据进行了统计检验,但统计检验的结果似乎不正确。 IE。我的一些比较得出了“P_val=0.000e+00 U_stat=0.000e+00”,我认为这是不可能的。我的数据框和/或代码有问题吗?

这是我正在使用的数据框:

这是我的代码:

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
from statannot import add_stat_annotation
import scipy.stats as sp

data = pd.read_excel('Z:/DMF/GROUPS/gr_Veening/Users/Vik/scRNA-seq/FACSAria/Adherence-invasion assays/adherence_invasion_assay_a549-RFP 4-6-21.xlsx',sheet_name="Sheet2", header = 0)

sns.set_theme(style="darkgrid")
ax1 = sns.boxplot(x="Strain", y="adherence_counts", data=data)
x = "Strain"
y = "adherence_counts"
order = ["D39", "D39 Δcps", "19F", "19F ΔcomCDE"]
ax1 = sns.boxplot(data=data, x=x, y=y, order=order)
plt.title("Adherence Assay")
plt.ylabel('CFU/ml')
plt.xlabel('')
ax1.set(xticklabels=["D39", "D39 Δ$\it{cps}$", "19F", "19F Δ$\it{comCDE}$"])
add_stat_annotation(ax1, data=data, x=x, y=y, order=order,
                    box_pairs=[("D39", "19F"), ("D39", "D39 Δcps"), ("D39 Δcps", "19F"), ("19F", "19F ΔcomCDE")],
                    test='Mann-Whitney', text_format='star', loc='inside', verbose=2)

最后,这是这个统计测试的结果:

D39 v.s. D39 Δcps: Mann-Whitney-Wilcoxon test two-sided with Bonferroni correction, P_val=0.000e+00 U_stat=0.000e+00
D39 Δcps v.s. 19F: Mann-Whitney-Wilcoxon test two-sided with Bonferroni correction, P_val=1.000e+00 U_stat=2.000e+00
19F v.s. 19F ΔcomCDE: Mann-Whitney-Wilcoxon test two-sided with Bonferroni correction, P_val=7.617e-01 U_stat=8.000e+00
D39 v.s. 19F: Mann-Whitney-Wilcoxon test two-sided with Bonferroni correction, P_val=0.000e+00 U_stat=0.000e+00
C:\Users\Vik\anaconda3\lib\site-packages\scipy\stats\stats.py:7171: RuntimeWarning: divide by zero encountered in double_scalars
  z = (bigu - meanrank) / sd

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: python pandas statistics seaborn


    【解决方案1】:

    你的问题来自两个方面:

    • 从统计上讲,在您的某些情况下(例如“D39”与“19F”),一组中的所有项目都比另一组更大/更小,因此 0 U 统计量和极值 p 值。很有可能得到这些结果。它来自仅检查所提供值的等级(此测试的作用),它具有优点和局限性(+ Mann-Whitney 的测试也不适合如此小的样本量,尤其是在 scipy 假设等方差的情况下)。

    • 现在z = (bigu - meanrank) / sd 行失败意味着np.sqrt(T * n1 * n2 * (n1+n2+1) / 12.0) = 0,所以在这种情况下n1 和/或n20,(它们是len(x)len(y))。 source in scipy所以,

      • statannot 中存在一个错误,因为如果orderbox_pair 都引用了数据框中不存在的系列,我将在statannotations 中进行更正。那就谢谢你了。

      • 但是,我无法使用您的数据框副本重现您的警告。 如果这是唯一的错误,您应该会在您向我们展示的那一刻看到您的绘图中缺少一个框。
        如果没有,是否有可能您更新了一些代码但没有在这里复制最后的输出?否则,可能会有更多发现,请告诉我们。

    编辑:正如在讨论中发现的那样,如果orderbox_pairs 和数据集中的标签不匹配,第二个问题可能发生在statannot。这已在statannotationsstatannot 的一个分支)中进行了修补。

    【讨论】:

    • 嗨特雷维斯,非常感谢您的回复!不幸的是,在我的 Spyder 控制台中显示警告的代码和输出与我为这个问题发布的完全相同。
    • 嗨@VikrantMinhas,您尝试使用statannotations 吗?您可以运行pip install statannotations,然后使用from statannotations import add_stat_annotation,而不更改任何其他内容。如果问题仍然存在,图上是否缺少一个框?
    • 完美。检查您的数据集和 box_pairs,D39 不匹配,在一种情况下可能有额外的空格。我怀疑您的箱线图中也缺少一个框。
    • 嘿 Trevis,我添加了 statannotations 并将 from statannotations import add_stat_annotation 放入我的代码中。但它出现了错误ValueError: Missing x value "D39" in Strain (specified in order) 我的代码中已经有来自 statannot 的“add_stat_annotation”。不确定这是否会对新代码产生影响。谢谢!
    • 啊,是的,已修复,非常感谢!仅供参考,所有框甚至在我的数据中有额外空间之前都存在
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    相关资源
    最近更新 更多