我正在处理来自几个不同样本站(站点)的一组物种数量(计数)。我使用scikit-bio的pw_distance函数计算了每对可能的样本站之间的Bray-Curtis相似度。这会产生一个距离矩阵,其值在0到1之间。到目前为止一直很好。
我想使用该距离矩阵来生成一个树形图,显示样本站如何聚集在一起。我正在使用scipy的hierachy.linkage函数来查找树形图的链接,然后使用hierarchy.dendrogram进行绘图。
这是我的代码:
from skbio.diversity.beta import pw_distances
from scipy.cluster import hierarchy
bc_dm = pw_distances(counts, stations, metric = "braycurtis")
# use (1 - bc_dm) to get similarity rather than dissimilarity
sim = 1 - bc_dm.data
Z = hierarchy.linkage(sim, 'ward')
hierarchy.dendrogram(
Z,
leaf_rotation=0., # rotates the x axis labels
leaf_font_size=10., # font size for the x axis labels
labels=bc_dm.ids,
orientation="left"
)
here is a link to the dendrogram produced by the above code
据我了解,树形图上的距离应与Bray-Curtis相似度(类似于距离)相对应,但树形图上的距离值最大值超过30.这是正确的吗?如果没有,我如何缩放我的距离以对应样本站之间的Bray-Curtis相似性?如果它是正确的,那么树形图上的距离真的对应于什么?
答案 0 :(得分:1)
查看评论中分享的链接,因为它们可以解决您的问题。
这些链接中未涵盖的一个from collections import Counter
from toolz import concat
short_list = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ]
long_list = [ [1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [6, 7, 8, 9, 10], [2, 3, 11, 12, 13] ]
for idx, i in enumerate(short_list):
long_list_filtered = (x for x in concat(long_list[:idx] + long_list[idx+1:]) if x in set(i)))
print(idx, Counter(long_list_filtered))
# 0 Counter({2: 2, 3: 2})
# 1 Counter({4: 1, 5: 1, 6: 1})
# 2 Counter()
# 3 Counter({10: 1})
步骤是您应该在scikit-bio
上调用链接,而不是bc_dm.condensed_form()
或bc_dm
。这将以您需要的格式为您提供输入。如果您传递2D矩阵,sim
会假定它是您的linkage
矩阵,并根据这些数据计算样本之间的欧几里德距离。
另外,请务必注意counts
method
参数,因为这会影响树形图中分支长度的解释。 scipy.cluster.hierarchy.linkage
的文档字符串包含有关如何为不同方法计算这些内容的详细信息。