Python 从基因组中创建一个Dendogram

Python 从基因组中创建一个Dendogram,python,bioinformatics,hierarchical-clustering,dendrogram,genome,Python,Bioinformatics,Hierarchical Clustering,Dendrogram,Genome,我想利用基因组数据: Species_A = ctnngtggaccgacaagaacagtttcgaatcggaagcttgcttaacgtag Species_B = ctaagtggactgacaggaactgtttcgaatcggaagcttgcttaacgtag Species_C = ctacgtggaccgacaagaacagtttcgactcggaagcttgcttaacgtag Species_D = ctacgtggaccgacaagaacagtttcgactcggaagct

我想利用基因组数据:

Species_A = ctnngtggaccgacaagaacagtttcgaatcggaagcttgcttaacgtag
Species_B = ctaagtggactgacaggaactgtttcgaatcggaagcttgcttaacgtag
Species_C = ctacgtggaccgacaagaacagtttcgactcggaagcttgcttaacgtag
Species_D = ctacgtggaccgacaagaacagtttcgactcggaagcttgcttaacgccg
Species_E = ctgtgtggancgacaaggacagttccaaatcggaagcttgcttaacacag
我想创建一个树状图,根据上面的基因组序列,这些生物彼此之间的关系有多密切。我首先计算每个物种的a、c、t和g的数量,然后创建一个数组,然后绘制一个树状图:

gen_size1 = len(Species_A)
a1 = float(Species_A.count('a'))/float(gen_size1)
c1 = float(Species_A.count('c'))/float(gen_size1)
g1 = float(Species_A.count('g'))/float(gen_size1)
t1 = float(Species_A.count('t'))/float(gen_size1)
.
.
.
gen_size5 = len(Species_E)
a5 = float(Species_E.count('a'))/float(gen_size5)
c5 = float(Species_E.count('c'))/float(gen_size5)
g5 = float(Species_E.count('g'))/float(gen_size5)
t5 = float(Species_E.count('t'))/float(gen_size5)

my_genes = np.array([[a1,c1,g1,t1],[a2,c2,g2,t2],[a3,c3,g3,t3],[a4,c4,g4,t4],[a5,c5,g5,t5]])
plt.subplot(1,2,1)
plt.title("Mononucleotide")
linkage_matrix = linkage(my_genes, "single")
print linkage_matrix
dendrogram(linkage_matrix,truncate_mode='lastp', color_threshold=1, labels=[Species_A, Species_B, Species_C, Species_D, Species_E], show_leaf_counts=True)
plt.show()
物种A和B是同一种生物的变种,我认为它们都应该从根的一个共同分支中分离出来,物种C和D也是如此,它们应该从根的另一个普通分支分化,然后物种E从主根分化,因为它与物种A到D无关。不幸的是,树状图结果与从普通分支分化的物种A和E混淆,然后是另一个分支中的物种C、D和B(相当混乱)


我读过关于基因组序列的层次聚类,但我观察到它只适用于二维系统,不幸的是,我有4个维度,即a、c、t和g。还有其他的策略吗?谢谢你的帮助

好吧,使用你可以使用自定义的距离(我的赌注是Needleman Wunsch或Smith Waterman作为起点)。是如何处理输入数据的示例。你也应该检查一下。设置好后,可以使用更高级的对齐方法,如。您可以提取基因组之间的关系,并在创建树状图时使用它们

这是生物信息学中一个相当常见的问题,因此您应该使用内置了此功能的生物信息学库

首先,使用序列创建一个multi-FASTA文件:

import os
from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.Alphabet import generic_dna


sequences = ['ctnngtggaccgacaagaacagtttcgaatcggaagcttgcttaacgtag',
             'ctaagtggactgacaggaactgtttcgaatcggaagcttgcttaacgtag',
             'ctacgtggaccgacaagaacagtttcgactcggaagcttgcttaacgtag',
             'ctacgtggaccgacaagaacagtttcgactcggaagcttgcttaacgccg',
             'ctgtgtggancgacaaggacagttccaaatcggaagcttgcttaacacag']

my_records = [SeqRecord(Seq(sequence, generic_dna),
              id='Species_{}'.format(letter), description='Species_{}'.format(letter))
              for sequence, letter in zip(sequences, 'ABCDE')]

root_dir = r"C:\Users\BioGeek\Documents\temp"
filename = 'my_sequences'
fasta_path = os.path.join(root_dir, '{}.fasta'.format(filename))

SeqIO.write(my_records, fasta_path, "fasta")
这将创建文件
C:\Users\BioGeek\Documents\temp\my\u sequences.fasta
,如下所示:

>Species_A
ctnngtggaccgacaagaacagtttcgaatcggaagcttgcttaacgtag
>Species_B
ctaagtggactgacaggaactgtttcgaatcggaagcttgcttaacgtag
>Species_C
ctacgtggaccgacaagaacagtttcgactcggaagcttgcttaacgtag
>Species_D
ctacgtggaccgacaagaacagtttcgactcggaagcttgcttaacgccg
>Species_E
ctgtgtggancgacaaggacagttccaaatcggaagcttgcttaacacag
接下来,使用命令行工具
ClustalW
执行多序列对齐:

from Bio.Align.Applications import ClustalwCommandline
clustalw_exe = r"C:\path\to\clustalw-2.1\clustalw2.exe"
assert os.path.isfile(clustalw_exe), "Clustal W executable missing"
clustalw_cline = ClustalwCommandline(clustalw_exe, infile=fasta_path)
stdout, stderr = clustalw_cline()    
print stdout
这张照片是:

 CLUSTAL 2.1 Multiple Sequence Alignments


Sequence format is Pearson
Sequence 1: Species_A     50 bp
Sequence 2: Species_B     50 bp
Sequence 3: Species_C     50 bp
Sequence 4: Species_D     50 bp
Sequence 5: Species_E     50 bp
Start of Pairwise alignments
Aligning...

Sequences (1:2) Aligned. Score:  90
Sequences (1:3) Aligned. Score:  94
Sequences (1:4) Aligned. Score:  88
Sequences (1:5) Aligned. Score:  84
Sequences (2:3) Aligned. Score:  90
Sequences (2:4) Aligned. Score:  84
Sequences (2:5) Aligned. Score:  78
Sequences (3:4) Aligned. Score:  94
Sequences (3:5) Aligned. Score:  82
Sequences (4:5) Aligned. Score:  82
Guide tree file created:   [C:\Users\BioGeek\Documents\temp\my_sequences.dnd]

There are 4 groups
Start of Multiple Alignment

Aligning...
Group 1: Sequences:   2      Score:912
Group 2: Sequences:   2      Score:921
Group 3: Sequences:   4      Score:865
Group 4: Sequences:   5      Score:855
Alignment Score 2975

CLUSTAL-Alignment file created  [C:\Users\BioGeek\Documents\temp\my_sequences.aln]
创建的
my_sequences.dnd
文件
ClustalW
是一个标准文件,
Bio.Phylo
可以解析以下内容:

from Bio import Phylo
newick_path = os.path.join(root_dir, '{}.dnd'.format(filename))
tree = Phylo.read(newick_path, "newick")
Phylo.draw_ascii(tree)
其中打印:

       ____________ Species_A
  ____|
 |    |_____________________________________ Species_B
 |
_|          ____ Species_C
 |_________|
 |         |_________________________ Species_D
 |
 |__________________________________________________________________ Species_E
或者,如果安装了
matplotlib
pylab
,则可以使用
draw
功能创建图形:

tree.rooted = True
Phylo.draw(tree, branch_labels=lambda c: c.branch_length)
产生:


这张树状图清楚地说明了你所观察到的:物种A和B是同一生物体的变种,它们都从根的一个共同分支中分化出来。物种C和D也是如此,它们都从根的另一个共同分支中分化出来。最后,物种E与主根不同,因为它与物种A到D无关。

这太神奇了!非常感谢!我想问一下,我们是否可以显示聚类系数?@TouyaD.Serdan答案过于详细,无法作为评论。你能提出一个新问题吗?