skbio.stats.composition.ancom¶
- skbio.stats.composition.ancom(table, grouping, alpha=0.05, tau=0.02, theta=0.1, multiple_comparisons_correction='holm-bonferroni', significance_test=None, percentiles=(0.0, 25.0, 50.0, 75.0, 100.0))[源代码]¶
使用ANCOM进行差异丰度测试。
状态:从0.4.1开始试验。
这是通过计算所有特征之间的成对对数比率并执行显著性检验来确定相对于感兴趣变量的特征比率是否存在显著差异来实现的。
在只有两个处理的实验中,这测试了以下关于特征的假设 \(i\)
\[H_{0i}: \mathbb{E}[\ln(u_i^{(1)})] = \mathbb{E}[\ln(u_i^{(2)})]\]哪里 \(u_i^{(1)}\) 是要素的平均丰度 \(i\) 在第一组, \(u_i^{(2)}\) 是要素的平均丰度 \(i\) 在第二组。
- 参数:
table (pd.DataFrame) -- 严格正值(即计数或比例)的2D矩阵,其中行对应于样本,列对应于特征。
grouping (pd.Series) -- 指示将采样分配给组的矢量。例如,这些可以是表示样本属于哪个组的字符串或整数。它必须与中的样本长度相同 table 。索引必须与上的相同 table 和 grouping 但不必是相同的顺序。
alpha (float, optional) -- 每项统计检验的显著水平。它可以是介于0和1之间的任何值,不包括。
tau (float, optional) -- 用于确定适当的截止值的常量。接近于零的值表示保守的截止日期。它可以是介于0和1之间的任何值,不包括。
theta (float, optional) -- W-统计量比例的下界。如果所有W统计量都低于theta,则不会检测到有差异显著的特征。它可以是介于0和1之间的任何值,不包括。
multiple_comparisons_correction ({None, 'holm-bonferroni'}, optional) -- 要运行的多重比较更正过程。如果无,则不会运行多个比较校正过程。如果指定了‘holm-boniferroni’,则Holm-Boniferroni过程 [1] 将会运行。
significance_test (function, optional) -- 一种统计显著性函数,用于检验类之间的重要性。此函数必须能够接受至少两个浮点数的1DARRAY_LIKE参数,并返回测试统计信息和p值。默认情况下
scipy.stats.f_oneway
使用的是。percentiles (iterable of floats, optional) -- 为每个组中的每个要素返回的百分位丰度。默认情况下,将返回每个组中每个要素的最小、第25个百分位数、中位数、第75个百分位数和最大丰度。
- 返回:
pd.DataFrame --特征、其W-统计量以及零假设是否被拒绝的表。
"W" 是W统计量,即单个功能被测试为与之显著不同的功能的数量。
"Reject null hypothesis" 指示功能是否在不同的组之间差异丰富 (True )或不是 (False )。
pd.DataFrame --每组特征及其百分位数丰富度的表。如果
percentiles
为空,则这将是一个空的pd.DataFrame
。该对象中的行将是要素,列将是多索引,其中第一个索引是百分位,第二个索引是组。
参见
multiplicative_replacement
,scipy.stats.ttest_ind
,scipy.stats.f_oneway
,scipy.stats.wilcoxon
,scipy.stats.kruskal
备注
此方法的开发人员建议进行以下显著性测试 ([2], 补充文件1,第11页顶部):如果有2组,则使用标准参数t检验 (
scipy.stats.ttest_ind
)或非参数Mann-Whitney等级检验 (scipy.stats.mannwhitneyu
)。对于配对样本,使用参数配对t检验 (scipy.stats.ttest_rel
)或非参数Wilcoxon符号等级检验 (scipy.stats.wilcoxon
)。如果有两个以上的组,则使用参数单向方差分析 (scipy.stats.f_oneway
)或非参数Kruskal-Wallis (scipy.stats.kruskal
)。如果从个体获得了多个测量值,则使用弗里德曼检验 (scipy.stats.friedmanchisquare
)。由于当组数为两个时,单因素方差分析等价于标准t检验,因此我们默认为scipy.stats.f_oneway
这里,它可以在有两个或更多组时使用。用户应参考本网站上有关这些测试的文件,以了解每项测试所做的假设。此方法不能将任何零计数作为输入处理,因为不能计算零的对数。虽然这是一个悬而未决的问题,但包括 [2], 通过将伪计数添加到矩阵中的所有值,显示了有希望的结果。在……里面 [2], 使用了0.001的伪计数,但作者指出,1.0的伪计数也可能有用。零计数也可以使用
multiplicative_replacement
方法。引用
示例
首先导入所有必要的模块:
>>> from skbio.stats.composition import ancom >>> import pandas as pd
现在,让我们加载一个包含6个样本和7个特征的DataFrame(例如,这些可能是细菌OTU):
>>> table = pd.DataFrame([[12, 11, 10, 10, 10, 10, 10], ... [9, 11, 12, 10, 10, 10, 10], ... [1, 11, 10, 11, 10, 5, 9], ... [22, 21, 9, 10, 10, 10, 10], ... [20, 22, 10, 10, 13, 10, 10], ... [23, 21, 14, 10, 10, 10, 10]], ... index=['s1', 's2', 's3', 's4', 's5', 's6'], ... columns=['b1', 'b2', 'b3', 'b4', 'b5', 'b6', ... 'b7'])
然后创建一个分组向量。在这个例子中,有一个治疗组和一个安慰剂组。
>>> grouping = pd.Series(['treatment', 'treatment', 'treatment', ... 'placebo', 'placebo', 'placebo'], ... index=['s1', 's2', 's3', 's4', 's5', 's6'])
现在快跑吧
ancom
以确定在治疗组和安慰剂组之间是否有任何在丰度上显著不同的特征。返回的第一个DataFrame包含ANCOM测试结果,第二个包含每个组中每个功能的百分比丰度数据。>>> ancom_df, percentile_df = ancom(table, grouping) >>> ancom_df['W'] b1 0 b2 4 b3 0 b4 1 b5 1 b6 0 b7 1 Name: W, dtype: int64
W统计量是单个功能被测试为与之显著不同的功能的数量。在这种情况下, b2 与其他四个特征相比,具有显著不同的丰度。为了总结W统计量的结果,让我们来看看假设检验的结果。这个 Reject null hypothesis 表中的一列表明无效假设是否被拒绝,因此观察到一个特征在不同的组中是不同的丰富的。
>>> ancom_df['Reject null hypothesis'] b1 False b2 True b3 False b4 False b5 False b6 False b7 False Name: Reject null hypothesis, dtype: bool
由此我们可以得出结论,只有 b2 在治疗组和安慰剂组之间的丰度有显著差异。我们仍然不知道,例如,在哪个组织中 b2 更加丰富。因此,我们接下来可能感兴趣的是比较 b2 在这两组人中。我们可以使用返回的第二个DataFrame来实现这一点。在这里,我们比较中位数(50%)的丰度 b2 在治疗组和安慰剂组中:
>>> percentile_df[50.0].loc['b2'] Group placebo 21.0 treatment 11.0 Name: b2, dtype: float64
我们还可以查看完整的五个数字的摘要
b2
在治疗组和安慰剂组中:>>> percentile_df.loc['b2'] Percentile Group 0.0 placebo 21.0 25.0 placebo 21.0 50.0 placebo 21.0 75.0 placebo 21.5 100.0 placebo 22.0 0.0 treatment 11.0 25.0 treatment 11.0 50.0 treatment 11.0 75.0 treatment 11.0 100.0 treatment 11.0 Name: b2, dtype: float64
综合来看,这些数据告诉我们 b2 在安慰剂组样本中的含量明显高于治疗组样本中的丰度。