根据A,C,G或T自动分割模糊碱基

时间:2016-03-18 11:25:02

标签: r bioinformatics

在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

你能看到的是我有一个&#34; N&#34;核苷酸存在于我的第11位(第N行,第11列)的序列中。

下一步是制作一个位置矩阵频率,但是,只有在行的列数总和时才能实现这一点&#34; A&#34;,&#34; C&#34;,&#34; G&# 34;和&#34; T&#34;是平等的。在上面的例子中,由于N个基数,第11列的总和将比所有其他的少一个。

编写consensusMatrix函数的最佳方法是什么,以便将所有非A,C,G和T碱基适当地分类为A,C,G,T或它们的组合?由于N代表4个碱基中的任何一个,因此对于N的每个实例,0.25将被添加到第11列的A,C,G和T值。但是,应该为所有其他非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以外任何内容的整个序列。

1 个答案:

答案 0 :(得分:2)

这样的事情,但从评论看来,你似乎在为这类数据提出错误的问题。

#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