【问题标题】:DNA pairwise distances from R matrix与 R 矩阵的 DNA 成对距离
【发布时间】:2023-05-15 09:18:01
【问题描述】:

在处理 DNA 时,我们经常需要三角形 p 距离矩阵,它包含序列对之间不同位点的比例。因此:

  1. AGGTT
  2. AGCTA
  3. AGGTA

产量:

      1    2
2   0.4
3   0.2  0.2

在某些 R 包中可以使用 p 距离计算,但假设我需要使用数字代码 (-1,0,1,2),而不是字母 (C,T,A,G)。如何从“my.matrix”生成三角 p 距离矩阵?

# Define DNA matrix dimensions
bp = 5  # DNA matrix length
n  = 3  # DNA matrix height
# Build Binary Matrices
purine <- matrix(sample(0:1,(bp*n),replace=TRUE,prob=c(0.5,0.5)),n,bp)
ketone <- matrix(sample(0:1,(bp*n),replace=TRUE,prob=c(0.5,0.5)),n,bp)
strong <- 1-(abs(purine-ketone))
my.matrix <- (purine*strong-ketone)+(purine*ketone-strong)+purine+ketone
my.matrix

【问题讨论】:

    标签: r matrix distance identity dna-sequence


    【解决方案1】:

    我不确定你在用 my.matrix 做什么,但这应该适用于字符或数字

    x<-c("AGGTT", "AGCTA", "AGGTA")
    y<-do.call("rbind", strsplit(x, "")) 
    y
         [,1] [,2] [,3] [,4] [,5]
    [1,] "A"  "G"  "G"  "T"  "T" 
    [2,] "A"  "G"  "C"  "T"  "A" 
    [3,] "A"  "G"  "G"  "T"  "A" 
    z <- apply(y, 1, function(x) colMeans(x != t(y)) )
    z
         [,1] [,2] [,3]
    [1,]  0.0  0.4  0.2
    [2,]  0.4  0.0  0.2
    [3,]  0.2  0.2  0.0
    

    如果需要,您可能可以使用 lower 或 upper.tri 来获得三角形。另外,如果 apply 函数看起来很混乱,它只是将这个函数应用于所有三行......

    y[1,] == t(y)
         [,1]  [,2]  [,3]
    [1,] TRUE  TRUE  TRUE
    [2,] TRUE  TRUE  TRUE
    [3,] TRUE FALSE  TRUE
    [4,] TRUE  TRUE  TRUE
    [5,] TRUE FALSE FALSE
    

    ...这将返回距离矩阵中的第一行

    colMeans(y[1,] != t(y))
    [1] 0.0 0.4 0.2
    

    【讨论】:

    • 谢谢 Chris S。我不经常使用 apply 功能,所以对我来说有点困惑。感谢您的解释!