根据 A、C、G 或 T 的比例自动拆分不明确的碱基
Automatically split ambiguous bases proportionally to A, C, G or T
在 Biostrings 中,我加载了一个包含 427,351 个长度为 11 个核苷酸的 DNA 序列的 fasta 文件。
my.seq<-readDNAStringSet("my.fasta", "fasta")
然后,我生成了一个矩阵,用于计算 11 个位置中每个位置的特定核苷酸的总数:
my.pfm<-consensusMatrix(my.seq)
>my.pfm
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
A 113370 120216 109984 40729 150681 11 340936 41684 75946 150648 84290
C 98927 107171 99251 110222 76286 427265 25668 256664 191010 103889 139625
G 118545 93632 95588 74975 138899 9 95 91414 64966 66896 113694
T 96509 106332 122528 201425 61485 66 60652 37589 95429 105918 89741
M 0 0 0 0 0 0 0 0 0 0 0
R 0 0 0 0 0 0 0 0 0 0 0
W 0 0 0 0 0 0 0 0 0 0 0
S 0 0 0 0 0 0 0 0 0 0 0
Y 0 0 0 0 0 0 0 0 0 0 0
K 0 0 0 0 0 0 0 0 0 0 0
V 0 0 0 0 0 0 0 0 0 0 0
H 0 0 0 0 0 0 0 0 0 0 0
D 0 0 0 0 0 0 0 0 0 0 0
B 0 0 0 0 0 0 0 0 0 0 0
N 0 0 0 0 0 0 0 0 0 0 1
- 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0
. 0 0 0 0 0 0 0 0 0 0 0
您可以看到,我的一个序列中第 11 位(第 N 行,第 11 列)有一个 "N" 核苷酸。
下一步是制作位置矩阵频率,但是,这只有在行的列总和为 "A"、"C"、"G" 和 [=37 时才有可能=] 是相等的。在上面的示例中,由于 N 基数,第 11 列的总和将比所有其他列少一。
编写 consensusMatrix 函数以便将所有非 A、C、G 和 T 碱基适当分类为 A、C、G、T 或它们的组合的最佳方法是什么?由于 N 代表 4 个碱基中的任何一个,因此对于 N 的每个实例,第 11 列的 A、C、G 和 T 值将增加 0.25。但是应该为所有其他非 A、C 编写函数, G 和 T 核苷酸,以便它们以正确的比例适当分配给 A、C、G、T?
例如 Y= C 或 T,因此对于 Y 的每个实例,0.5 将添加到 C,0.5 将添加到该列的 T 值。如果我们有类似 V 代码的东西,我会看到一个问题,因为它可以是 G、A 或 C,在这种情况下,0.33333 将被添加到该列的每个 V 实例。
我尝试过的:
my.pfm<-consensusMatrix(my.seq,ambiguityMap=IUPAC_CODE_MAP)
Error in .local(x, as.prob, shift, width, ...) :
unused argument (ambiguityMap = c("A", "C", "G", "T", "AC", "AG", "AT", "CG", "CT", "GT", "ACG", "ACT", "AGT", "CGT", "ACGT"))
据我所知,应该有某种字符向量告诉函数在计算 A、C、G、T 以外的任何内容时要做什么,但我似乎无法弄清楚。
这里的想法是拥有某种定义函数,无论将来遇到多少种歧义代码,它都会起作用。
注意:我不想从数据集中删除除了 A、C、G 或 T 以外的任何序列。
类似这样,但从评论来看,您似乎对此类数据提出了错误的问题。
#get sum of non ACGT and divide by 4
props <- colSums(my.pfm[ !rownames(my.pfm) %in% c("A","C","G","T"),]) / 4
#add it back to ACGT rows
t(
apply(
my.pfm[ rownames(my.pfm) %in% c("A","C","G","T"),], 1, function(i)
props + i))
#output
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
# A 113370 120216 109984 40729 150681 11 340936 41684 75946 150648 84290.25
# C 98927 107171 99251 110222 76286 427265 25668 256664 191010 103889 139625.25
# G 118545 93632 95588 74975 138899 9 95 91414 64966 66896 113694.25
# T 96509 106332 122528 201425 61485 66 60652 37589 95429 105918 89741.25
在 Biostrings 中,我加载了一个包含 427,351 个长度为 11 个核苷酸的 DNA 序列的 fasta 文件。
my.seq<-readDNAStringSet("my.fasta", "fasta")
然后,我生成了一个矩阵,用于计算 11 个位置中每个位置的特定核苷酸的总数:
my.pfm<-consensusMatrix(my.seq)
>my.pfm
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
A 113370 120216 109984 40729 150681 11 340936 41684 75946 150648 84290
C 98927 107171 99251 110222 76286 427265 25668 256664 191010 103889 139625
G 118545 93632 95588 74975 138899 9 95 91414 64966 66896 113694
T 96509 106332 122528 201425 61485 66 60652 37589 95429 105918 89741
M 0 0 0 0 0 0 0 0 0 0 0
R 0 0 0 0 0 0 0 0 0 0 0
W 0 0 0 0 0 0 0 0 0 0 0
S 0 0 0 0 0 0 0 0 0 0 0
Y 0 0 0 0 0 0 0 0 0 0 0
K 0 0 0 0 0 0 0 0 0 0 0
V 0 0 0 0 0 0 0 0 0 0 0
H 0 0 0 0 0 0 0 0 0 0 0
D 0 0 0 0 0 0 0 0 0 0 0
B 0 0 0 0 0 0 0 0 0 0 0
N 0 0 0 0 0 0 0 0 0 0 1
- 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0
. 0 0 0 0 0 0 0 0 0 0 0
您可以看到,我的一个序列中第 11 位(第 N 行,第 11 列)有一个 "N" 核苷酸。
下一步是制作位置矩阵频率,但是,这只有在行的列总和为 "A"、"C"、"G" 和 [=37 时才有可能=] 是相等的。在上面的示例中,由于 N 基数,第 11 列的总和将比所有其他列少一。
编写 consensusMatrix 函数以便将所有非 A、C、G 和 T 碱基适当分类为 A、C、G、T 或它们的组合的最佳方法是什么?由于 N 代表 4 个碱基中的任何一个,因此对于 N 的每个实例,第 11 列的 A、C、G 和 T 值将增加 0.25。但是应该为所有其他非 A、C 编写函数, G 和 T 核苷酸,以便它们以正确的比例适当分配给 A、C、G、T?
例如 Y= C 或 T,因此对于 Y 的每个实例,0.5 将添加到 C,0.5 将添加到该列的 T 值。如果我们有类似 V 代码的东西,我会看到一个问题,因为它可以是 G、A 或 C,在这种情况下,0.33333 将被添加到该列的每个 V 实例。
我尝试过的:
my.pfm<-consensusMatrix(my.seq,ambiguityMap=IUPAC_CODE_MAP)
Error in .local(x, as.prob, shift, width, ...) :
unused argument (ambiguityMap = c("A", "C", "G", "T", "AC", "AG", "AT", "CG", "CT", "GT", "ACG", "ACT", "AGT", "CGT", "ACGT"))
据我所知,应该有某种字符向量告诉函数在计算 A、C、G、T 以外的任何内容时要做什么,但我似乎无法弄清楚。
这里的想法是拥有某种定义函数,无论将来遇到多少种歧义代码,它都会起作用。
注意:我不想从数据集中删除除了 A、C、G 或 T 以外的任何序列。
类似这样,但从评论来看,您似乎对此类数据提出了错误的问题。
#get sum of non ACGT and divide by 4
props <- colSums(my.pfm[ !rownames(my.pfm) %in% c("A","C","G","T"),]) / 4
#add it back to ACGT rows
t(
apply(
my.pfm[ rownames(my.pfm) %in% c("A","C","G","T"),], 1, function(i)
props + i))
#output
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
# A 113370 120216 109984 40729 150681 11 340936 41684 75946 150648 84290.25
# C 98927 107171 99251 110222 76286 427265 25668 256664 191010 103889 139625.25
# G 118545 93632 95588 74975 138899 9 95 91414 64966 66896 113694.25
# T 96509 106332 122528 201425 61485 66 60652 37589 95429 105918 89741.25