如何自动生成系统发育树分支长度-物种末端关联矩阵?
自动生成系统发育树的分支-物种长度矩阵
我有一棵末端为物种、分支长度非固定为1的系统发育树,希望通过物种群落矩阵与分支-物种长度矩阵相乘计算系统发育多样性。目前我通过手动方式构建目标矩阵(代码如下),但想找到自动生成该矩阵的方法,在ape包中未发现对应函数。
手动构建分支-物种长度矩阵示例
library(ape) ex.tree <- read.tree(text="(A:.25,((B:.5,C:1):3,(D:2,E:1):.1):.65);") plot(ex.tree) edgelabels() # 显示分支编号1-8 B1 <- c(.25,0,0,0,0) B2 <- c(0,.65,.65,.65,.65) B3 <- c(0,3,3,0,0) B4 <- c(0,.5,0,0,0) B5 <- c(0,0,1,0,0) B6 <- c(0,0,0,.1,.1) B7 <- c(0,0,0,2,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
矩阵用途:计算系统发育多样性
通过该矩阵可结合物种群落矩阵计算系统发育多样性指数:
set.seed(12345678) sp_comm = matrix(rbinom(30, 1, .5), nrow = 6, ncol = 5) PD_raw = sp_comm %*% t(Mat) apply(PD_raw, 2, sum)
自动生成矩阵的方法
可以基于ape包的树结构信息,编写自定义函数实现自动生成,核心逻辑是遍历每条分支,识别其包含的末端物种,再赋值对应分支长度:
library(ape) # 定义生成分支-物种长度矩阵的函数 build_branch_species_matrix <- function(tree) { n_tips <- length(tree$tip.label) n_edges <- nrow(tree$edge) # 初始化空矩阵 mat <- matrix(0, nrow = n_edges, ncol = n_tips) colnames(mat) <- tree$tip.label rownames(mat) <- paste0("B", 1:n_edges) # 遍历每条分支 for (i in seq_len(n_edges)) { # 获取当前分支的子树所有后代节点 subtree_nodes <- getDescendants(tree, tree$edge[i, 2]) # 筛选出其中的末端物种节点(编号≤总末端数) tip_indices <- subtree_nodes[subtree_nodes <= n_tips] # 给对应物种列赋值分支长度 mat[i, tip_indices] <- tree$edge.length[i] } return(mat) } # 测试函数 ex.tree <- read.tree(text="(A:.25,((B:.5,C:1):3,(D:2,E:1):.1):.65);") auto_mat <- build_branch_species_matrix(ex.tree) print(auto_mat)
说明
- 函数返回的矩阵与手动构建的
Mat完全一致,分支顺序与edgelabels()显示的编号对应(即tree$edge的顺序)。 getDescendants()用于获取分支子树的所有后代节点,筛选末端节点后即可定位到对应的物种列。
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

