我正在尝试通过根据数据制作.phy文件来创建系统发育树。
我有一个数据框
ndf =
ESV截断
1 esv1 TACGTAGGTG ...
2 esv2 TACGGAGGGT ...
3 esv3 TACGGGGGG ...
7 esv7 TACGTAGGGT ...
我检查了“ trunc”列元素的长度:
length_checker = np.vectorize(len)
arr_len = length_checker(ndf['trunc'])
所得的arr_len为所有元素赋予相同的长度(= 253)。
我将此数据帧保存为.phy文件,如下所示:
23 253
esv1 TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCGCGCGCGCGCTGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAATGTGTGCAGAAGAGGAAAGCGGAATTCCACTGTGTAGCGGTGTGCGCGTGCGCGGGGGCGCGAGGGCGCGGGAGCGGGCGCGGGAG<<<<
- 类似于this tutorial中使用的文件。
但是,当我运行命令时
aln = AlignIO.read('msa.phy', 'phylip')
- 我得到“ ValueError:序列必须都具有相同的长度”
我不知道为什么要得到这个或如何解决它。非常感谢您的帮助!
谢谢
我正在尝试通过根据数据制作.phy文件来创建系统发育树。我有一个数据帧ndf = ESV trunc 1 esv1 TACGTAGGTG ... 2 esv2 TACGGAGGGT ... 3 esv3 ...
首先,请阅读对How to make good reproducible pandas examples的回答。将来请提供minimal reproducibl example。
import pandas as pd
from Bio import Phylo
from Bio.Phylo.TreeConstruction import DistanceCalculator
from Bio.Phylo.TreeConstruction import DistanceTreeConstructor
from Bio import AlignIO
data = {'ESV' : ['esv1', 'esv2', 'esv3'],
'trunc': ['TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCGCGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAAACTTGAGTGCAGAAGAGGAAAGCGGAATTCCACGTGTAGCGGTGAAATGCGTAGAGATGTGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGTCTGTAACTGACGCTGAGGCGCGAAAGCGTGGGGAGCAAACAGG',
'TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTGCGTAGGTGGGTTGGTAAGTCAGTGGTGAAATCTCCGAGCTTAACTTGGAAACTGCCATTGATACTATTAATCTTGAATATTGTGGAGGTTAGCGGAATATGTCATGTAGCGGTGAAATGCTTAGAGATGACATAGAACACCAATTGCGAAGGCAGCTGGCTACACATATATTGACACTGAGGCACGAAAGCGTGGGGATCAAACAGG',
'TACGGGGGGGGCAAGCGTTGTTCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGCCAGACCAAGTCGAGTGTGAAATTGCAGGGCTTAACTTTGCAGGGTCGCTCGATACTGGTCGGCTAGAGTGTGGAAGAGGGTACTGGAATTCCCGGTGTAGCGGTGAAATGCGTAGATATCGGGAGGAACACCAGCGGCGAAGGCGGGTACCTGGGCCAACACTGACGCTGAGGCGCGAAAGCTAGGGGAGCAAACAG']
}
ndf = pd.DataFrame.from_dict(data)
print(ndf)
输出:
ESV trunc
0 esv1 TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCGCG...
1 esv2 TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTG...
2 esv3 TACGGGGGGGGCAAGCGTTGTTCGGAATTACTGGGCGTAAAGGGCG...
下一步,以正确的格式写入phylip文件。
with open("test.phy", 'w') as f: f.write("{:10} {}\n".format(ndf.shape[0], ndf.trunc.str.len()[0])) for row in ndf.iterrows(): f.write("{:10} {}\n".format(*row[1].to_list()))
test.phy
的输出:3 253 esv1 TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCGCGCGCAGGCGGTTTCTTAAGTCTGATGTGAAAGCCCACGGCTCAACCGTGGAGGGTCATTGGAAACTGGGAAACTTGAGTGCAGAAGAGGAAAGCGGAATTCCACGTGTAGCGGTGAAATGCGTAGAGATGTGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGTCTGTAACTGACGCTGAGGCGCGAAAGCGTGGGGAGCAAACAGG esv2 TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTGCGTAGGTGGGTTGGTAAGTCAGTGGTGAAATCTCCGAGCTTAACTTGGAAACTGCCATTGATACTATTAATCTTGAATATTGTGGAGGTTAGCGGAATATGTCATGTAGCGGTGAAATGCTTAGAGATGACATAGAACACCAATTGCGAAGGCAGCTGGCTACACATATATTGACACTGAGGCACGAAAGCGTGGGGATCAAACAGG esv3 TACGGGGGGGGCAAGCGTTGTTCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGCCAGACCAAGTCGAGTGTGAAATTGCAGGGCTTAACTTTGCAGGGTCGCTCGATACTGGTCGGCTAGAGTGTGGAAGAGGGTACTGGAATTCCCGGTGTAGCGGTGAAATGCGTAGATATCGGGAGGAACACCAGCGGCGAAGGCGGGTACCTGGGCCAACACTGACGCTGAGGCGCGAAAGCTAGGGGAGCAAACAG
现在,我们可以开始创建系统发育树。
# Read the sequences and align aln = AlignIO.read('test.phy', 'phylip') print(aln)
输出:
SingleLetterAlphabet() alignment with 3 rows and 253 columns TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGCG...AGG esv1 TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGG...AGG esv2 TACGGGGGGGGCAAGCGTTGTTCGGAATTACTGGGCGTAAAGGG...CAG esv3
计算距离矩阵:
calculator = DistanceCalculator('identity') dm = calculator.get_distance(aln) print(dm)
输出:
esv1 0 esv2 0.3003952569169961 0 esv3 0.6086956521739131 0.6245059288537549 0
使用UPGMA算法构建系统发育树并以ascii方式绘制树
constructor = DistanceTreeConstructor() tree = constructor.upgma(dm) Phylo.draw_ascii(tree)
输出:
________________________________________________________________________ esv3 _| | ___________________________________ esv2 |____________________________________| |___________________________________ esv1
或绘制一幅漂亮的树图:
Phylo.draw(tree)
输出:
通常,phylip是不同程序之间系统发育的最奇怪的形式。有严格的双引号格式和宽松的双引号格式等... t不容易知道所使用的分隔符,空格字符和/或回车符。
我认为您似乎在分类单元的名称(即序列标签)和序列名称之间留了一个空格,即。
2. esv2
另一个问题是,您可以/应该将序列与标签保持在同一行,并删除回车符,即。
esv2 TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTGCGTAGGTGGGTTGGTAAGTCAGTGGTGAAATCTCCGAGCTTAACTTGGAAACTGCCATTGATACTATTAATCTTGAATATTGTGGAGGTTAGCGGAATATGTCATGTAGCGGTGAAATGCTTAGAGATGACATAGAACACCAATTGCGAAGGCAGCTGGCTACACATATATTGACACTGAGGCACGAAAGCGTGGGGATCAAACAGG
有时回车确实有效(这可以是宽松的phylip格式),传统格式使用空格字符“”。我始终保持统一数量的空格以保持对齐方式...不确定是否需要。[Note
如果分类名称超过10个字符,则需要宽松的phylip格式,在任何情况下,这种格式通常是个好主意。
最终解决方案是,所有其他失败的方法是转换为fasta,以fasta格式导入,然后转换为phylip。如果所有操作都失败,请回发更多的故障排除Fasta格式删除“ 23 254”标题,然后每个序列如下所示,
>esv2 TACGGAGGGTGCAAGCGTTATCCGGATTCACTGGGTTTAAAGGGTGCGTAGGTGGGTTGGTAAGTCAGTGGTGAAATCTCCGAGCTTAACTTGGAAACTGCCATTGATACTATTAATCTTGAATATTGTGGAGGTTAGCGGAATATGTCATGTAGCGGTGAAATGCTTAGAGATGACATAGAACACCAATTGCGAAGGCAGCTGGCTACACATATATTGACACTGAGGCACGAAAGCGTGGGGATCAAACAGG
在esv2和序列之间总是有回车符。此外,始终使用“>”作为标签(分类名称)的前缀,而不会保留任何空格。您只需在python中通过reg-ex或“ re”进行转换即可。使用perl单缸纸将是s/^([az]+[0-9]+)/>$1/g
类型代码。我很确定他们将是一个可以做到这一点的在线网站。
另一个问题是,您可以/应该将序列与标签保持在同一行,并删除回车符,即。