Филогенетическое древо - как создать ветвь по видам матрицы?

Работая с филогенетическим деревом в R, я хотел бы создать матрицу, которая указывает, связана ли каждая ветвь дерева (от B1 до B8) с каждым видом (от A до E), где 1 указывают, что ветвь связана. (Показано ниже)

Функция R which.edge() полезна для определения конечной ветви для вида. но он не идентифицирует ВСЕ ветви, связанные с каждым видом. Какую функцию я мог бы использовать, чтобы идентифицировать все ветви в дереве, которые идут от корня к верхушке для каждого вида?

Пример дерева

library(ape)
ex.tree <- read.tree(text="(A:4,((B:1,C:1):2,(D:2,E:2):1):1);") 
plot(ex.tree)
edgelabels() #shows branches 1-8

Это матрица, которую я хотел бы создать (виды AE в виде столбцов, ветви B1-B8 в виде строк), но с простой функцией, а не вручную.

B1 <- c(1,0,0,0,0)
B2 <- c(0,1,1,1,1)
B3 <- c(0,1,1,0,0)
B4 <- c(0,1,0,0,0)
B5 <- c(0,0,1,0,0)
B6 <- c(0,0,0,1,1)
B7 <- c(0,0,0,1,0)
B8 <- c(0,0,0,0,1)
Mat <- rbind(B1,B2,B3,B4,B5,B6,B7,B8)   
colnames(Mat) <- c("A","B","C","D","E")
Mat

Например, ветвь B2 относится к видам BE, а не к виду A. Для видов E присутствуют ветви B2, B6, B8.

Какая функция R будет лучше? Заранее спасибо!

1 ответ

Решение

Я не знаю ни о какой встроенной функции, которая делает это. Я написал вспомогательную функцию, которая может рассчитать это из данных ребра, хранящихся в tree объект.

branchNodeAdjacency <- function(x) {
    m <- matrix(0, ncol=nt, nrow=nrow(x$edge))
    from <- x$edge[,1]
    to <- x$edge[,2]
    g <- seq_along(x$tip.label)
    while (any(!is.na(g))) {
        i <- match(g, to)
        m[cbind(i, seq_along(i))] <- 1
        g <- from[i]
    }
    rownames(m) <- paste0("B", seq.int(nrow(m)))
    colnames(m) <- x$tip.label
    m
}

branchNodeAdjacency(ex.tree)
#    A B C D E
# B1 1 0 0 0 0
# B2 0 1 1 1 1
# B3 0 1 1 0 0
# B4 0 1 0 0 0
# B5 0 0 1 0 0
# B6 0 0 0 1 1
# B7 0 0 0 1 0
# B8 0 0 0 0 1

Идея в том, что мы отслеживаем, какие значения конечных узлов представлены каждым внутренним узлом.

Другие вопросы по тегам