You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动生成系统发育树分支长度-物种末端关联矩阵?

自动生成系统发育树的分支-物种长度矩阵

我有一棵末端为物种、分支长度非固定为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:29:51