【发布时间】:2019-11-14 09:50:33
【问题描述】:
背景
这个问题有点复杂,所以我先介绍一下背景。要生成物种出生-死亡表的示例(L 表),我建议使用 DDD 包中的 dd_sim() 函数。
library(DDD)
library(tidyverse)
library(picante)
result <- dd_sim(c(0.2, 0.1, 20), 10)
# with birth rate 0.2, death rate 0.1, carrying capacity 20 and overall 10 million years.
L <- result$L
L
[,1] [,2] [,3] [,4]
[1,] 10.0000000 0 -1 -1.0000000
[2,] 10.0000000 -1 2 2.7058965
[3,] 8.5908774 2 3 6.6301616
[4,] 8.4786474 3 4 3.3866813
[5,] 8.4455262 -1 -5 -1.0000000
[6,] 8.3431071 4 6 3.5624756
[7,] 5.3784683 2 7 0.6975934
[8,] 3.8950593 6 8 -1.0000000
[9,] 1.5032100 -5 -9 -1.0000000
[10,] 0.8393589 7 10 -1.0000000
[11,] 0.6118985 -5 -11 -1.0000000
L 表有 4 列:
- 第一列是一个物种在妙亚出生的时间
- 第二列是物种亲本的标签;正负值表示该物种属于左冠谱系还是右冠谱系
- 第三列是子物种本身的标签;正负值表示该物种属于左冠谱系还是右冠谱系
- 第四栏是物种灭绝的时间;如果 第四个元素等于-1,则该物种仍然存在。
我做了什么
有了这个 L 表,我现在有了一个现存的社区。我要计算它的系统发育多样性(也叫Faith's index)
使用DDD 和picante 函数我可以做到:
# convert L table into community data matrix
comm = as.data.frame(L) %>% dplyr::select(V3:V4) %>%
dplyr::rename(id = V3, pa = V4) %>%
dplyr::mutate(id = paste0("t",abs(id))) %>%
dplyr::mutate(pa = dplyr::if_else(pa == -1, 1, 0)) %>%
dplyr::mutate(plot = 0) %>%
dplyr::select(plot, pa, id) %>%
picante::sample2matrix()
# convert L table into phylogeny
phy = DDD::L2phylo(L, dropextinct = T)
# calculate Faith's index using pd() function
Faith = picante::pd(comm,phy)
问题
虽然我达到了我的目标,但这个过程似乎是多余且耗时的。我必须来回转换我原来的 L 表,因为我必须使用现有的函数。
顾名思义,Faith的指数基本上是群落系统发育分支总长度的总和,所以我的问题是:
是否可以直接从 L 表中计算出 Faith 的指数?
提前谢谢!
【问题讨论】:
-
你的意思是
Faith <- sum(L[,1]-pmax(0,L[,4]))?或者Faith <- sum(L[L[,4]<0,1])? -
@AndrewGustar 嗨,安德鲁,我都试过了,但在我的代码中,它们都不等于 Faith,可能是什么问题?
-
我刚刚仔细看了看,我认为答案应该是
sum(L[L[, 4] < 0, 1]) + sum(pmax(0, L[, 4])) -
实际上这并不总是有效 - 不同的随机
Ls 适用于不同版本的公式 - 不知道为什么。也许最好坚持走很长的路! -
@AndrewGustar 我想了一个下午,但我的代码变得越来越复杂,寻找一个有效的方法并不容易
标签: r bioinformatics phylogeny