fastphylosig · R 包 · v0.3.5

R 系统发育信号快速分析

在 2,000 个物种/末端节点规模上,fastphylosig 计算系统发育信号的最高可提速达 23,591 倍。

系统发育信号衡量性状在近缘物种间相似的程度。fast_signal() 用一行代码就能算出 K、lambda、D 或 Delta,树越大,速度优势越明显(查看耗时基准)。fast_hetero() 用于比较大型系统发育树内部各支系的信号差异(查看 512 物种案例)。

Blomberg's K

135–151×

2,000 个末端

Pagel's lambda

20,697–23,591×

2,000 个末端

Fritz–Purvis D

218–224×

2,000 个末端

多状态 Delta

23.9–33.6×

2,000 个末端

耗时比为“参考实现中位耗时 ÷ fastphylosig 中位耗时”,比值大于 1 表示 fastphylosig 更快。参考实现分别是 phytools 2.5.2(K、lambda)、caper(D)和 Borges (2019) 的公开代码(Delta)。每个区间覆盖三种预设信号场景(Brownian 与噪声混合,权重 0、0.5、0.95)。

安装与开始分析

安装 v0.3.5

v0.3.5 发布版 是最新的版本,提供完整的支系分析流程,并优化了 D/lambda 的计算性能。

install.packages(
  "https://github.com/yinwen-ecology/fastphylosig/releases/download/v0.3.5/fastphylosig_0.3.5.tar.gz",
  repos = NULL, type = "source"
)
library(fastphylosig)

源码安装需要 C++17 工具链,Windows 上需要安装 Rtools,并依赖 ape、Rcpp 和 RcppArmadillo。

一行代码完成 K/lambda/D/Delta 分析

模拟数据示例

set.seed(1)
tree <- ape::rtree(30)
trait <- setNames(stats::rnorm(30), tree$tip.label)
binary <- setNames(as.integer(trait > stats::median(trait)), tree$tip.label)
state <- setNames(sample(letters[1:3], 30, replace = TRUE), tree$tip.label)

K

k <- fast_signal(tree, data = trait, method = "K",
                 test = TRUE, nsim = 999,
                 return_sim = TRUE, progress = FALSE)

lambda

lambda <- fast_signal(tree, data = trait, method = "lambda",
                      test = TRUE, progress = FALSE)

D

d <- fast_signal(tree, data = binary, method = "D",
                 test = TRUE, nsim = 999,
                 return_sim = TRUE, progress = FALSE)

Delta

delta <- fast_signal(tree, data = state, method = "Delta",
                     test = TRUE, nsim = 199, progress = FALSE)

技术路线

fast_signal() 整合了系统发育树检查、树与性状匹配、缺失值处理、系统发育信号计算功能。如果需要,也可以单独执行四个步骤。

fast_signal 高层入口自动检查、准备树、匹配数据与选择计算路径;显式路径提供各准备函数,再调用具体指标。
点击 SVG 查看大图。
四个步骤单独执行
checked <- check_tree(tree, signal = "K")
tree_ready <- resolve_tree(tree, signal = "K")
matched <- match_tree_data(tree_ready, data = trait)
ctx <- prepare_tree(matched$tree)

k <- fast_k(ctx, x = matched$data, test = TRUE, nsim = 999,
            progress = FALSE)

更多示例见中文使用指南与 v0.3.0 完整案例。

与普通方法运行时间比较

K 和 lambda 对比 phytools 2.5.2 的 phylosig(),D 对比 caper 1.0.4 的 phylo.d(),Delta 对比 Borges (2019) 的公开代码。50 至 2,000 个末端、3 种信号场景,每种设置 10 组配对重复(共 20 次计时调用)。计时从树与数据准备完成后开始。

四个面板比较 K、lambda、D 和 Delta 在 50、100、500、2,000 个末端下的参考实现与 fastphylosig 耗时比,虚线表示耗时相同。
不同指标和树规模下的实测耗时比。虚线表示中位耗时相等;比值低于虚线时,普通方法实现更快。点击打开 PNG 大图。计算环境为 Windows 11 x64、R 4.6.1,不包含设置及树与数据准备耗时。

plot_signal

基于模拟数据的绘图

多个连续性状的 K 置换分布和观测值标记。
多性状 K置换分布与观测值标记。
Pagel lambda 的似然剖面及其估计值。
Pagel's lambda似然剖面与估计值。
D 的随机与 Brownian 参考分布。
Fritz–Purvis D随机与 Brownian 参考。
多状态 Delta 的置换分布演示,竖线标出观测 Delta 的位置。
Delta置换分布与观测值位置。

用 fast_hetero() 比较大树内不同支系的差异

在大树情况下(例如超过 1,000 个末端),仅凭一个系统发育信号值难以描述内部不同分支间的差异,有的分支可能更保守,有的更发散。因此我开发了 fast_hetero(),把大树拆成冠群(一个节点及其全部后代),逐群估计信号,再把局部估计与整树值并列。冠群可以由你指定,也可以在给定大小范围内让函数选择互不重叠的最大冠群。结果保留每个冠群的实际样本量、缺失观测、状态组成,以及拟合与 MCMC 诊断。

fast_hetero 技术路线:编译树、选择冠群、共享 C++ 内核计算、可选整树与参考检验、汇总结果和原生树图。
fast_hetero() 先选择冠群、复用方法内核,再汇总局部估计、可选整树分析与诊断。结合案例阅读技术路线 · English diagram

示范案例

fast_hetero 原生树图:512 个模拟物种的八个冠群,按局部 K 着色,同时显示整树 K、常规信号检验的 P 值和单列的 BM 离散参考 P。
案例中的原生 plot() 输出;数值、诊断、代码和数据见案例页。

阅读完整案例

其他说明

Delta 诊断

Delta 比值比较的是返回调用,不是精度。参考实现在 120 次调用中有 112 次出现数值告警,且不提供最终收敛检查;fast 实现有一次达到优化器限制。带告警的调用没有被剔除或重跑,因此这些比值不能说明两种实现的精度或收敛程度相当。告警记录保留在原始计时记录中,分类汇总见基准 QA 报告。

当前发布版为 fastphylosig v0.3.5。上面的性能数据来自 v0.3.0,由于核心计算代码未改变,未针对 v0.3.4 重跑。详见发布说明与 fast_hetero 案例。