作为开发我正在研究的包装的演示的一部分,我需要量化一个经典的生态食品网,如下所述。我已经检查了素食主义者,二合一和sna,但是看不到任何可以满足我需要的东西,尽管我可能错了-这些都是大包装。因此,我想知道这个想法是否已经打包,或者有人是否有一个聪明的方法来计算结果。似乎应该是一个包装。
食物网可以通过物种A:F之间的相互作用矩阵来描述,如代码和图表所示。换句话说,人们会说“A会吃掉B,而E则会吃掉”等(在矩阵中很难看到,在图中微不足道)。
species <- LETTERS[1:6]
links <- c(0, 1, 0, 0, 0, 0,
1, 0, 1, 1, 1, 0,
0, 1, 0, 0, 1, 0,
0, 1, 0, 0, 1, 1,
0, 1, 1, 1, 0, 0,
0, 0, 0, 1, 0, 0)
L <- matrix(links, nrow = 6, byrow = TRUE,
dimnames = list(species, species))
我想计算每个物种的营养位置和营养高度。营养位置定义为食物链中特定物种以下+ 1的物种总数。在图中,A的营养位置为6,D的营养位置为3。另一方面,营养高度是平均值物种在其参与的每个独立链中的位置。物种B连接到4个不同的链(路径);它的高度是一次被视为一个位置的平均值:(3 + 3 + 3 + 2)/4 = 2.75。
计算上,需要读取矩阵L,然后通过矩阵所隐含的不同路径来计算所需的值。
如果这不是太钝,那么是否有人知道一个可以执行此操作的程序包,或者找到一种遵循路径并根据各种长度/选项进行计算的方法?感觉“好像”必须有一些递归/应用方法应该起作用,但是我不想重新发明一些东西。
提前致谢
最佳答案
这是一种计算您想要的营养高度的方法。
假设矩阵L
对DAG进行了编码,这些链接具有从每一行中的物种到每一列中的物种的链接。L_(i,j)=1
表示spp_i吃spp_j。
然后L*L
表示连接每一对物种的两步“营养路径”的数量,L*L*L
包含三步路径的数量,依此类推。在它们之间,一组“矩阵幂”记录了连接节点对的所有路径,无论长度如何。
根据您的描述,一个物种的营养高度是该物种的营养高度的一倍,再加上将其连接到该图尖端的“叶节点”之一的所有路径的平均路径长度。
## Here I've edited the matrix L to make it a DAG
species <- LETTERS[1:6]
links <-
c(0, 1, 0, 0, 0, 0,
0, 0, 1, 1, 1, 0,
0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 1, 1,
0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0)
L <- matrix(links, nrow = 6, byrow = TRUE,
dimnames = list(FROM=species, TO=species))
此函数(在
expm
包中使用运算符)应该可以满足您的需求。可以用一些更详细的评论来做,但是如果有时间的话我会在后面补充。library(expm) ## provides "%^%", a matrix power operator
calcHeight <- function(MAT) {
## Find 'leaf nodes' (i.e. species that are only eaten,
## and don't eat any others)
leaves <- which(rowSums(L)==0)
## Find the maximum possible chain length (if this is a DAG)
maxHeight <- nrow(MAT) - length(leaves) - 1
## Then use it to determine which matrix powers we'll need to calculate.
index <- seq_len(maxHeight)
paths <- lapply(index, FUN=function(steps) MAT %^% steps)
pathSteps <- lapply(index, FUN=function(steps) (1 + steps) * paths[[steps]])
## Trophic height is expressed relative to leaf nodes
paths <- Reduce("+", paths)[-leaves, leaves]
pathSteps <- Reduce("+", pathSteps)[-leaves, leaves]
rowSums(pathSteps)/rowSums(paths)
}
calcHeight(L)
A B C D
3.75 2.75 2.00 2.00
关于r - 食物网中的营养位置/高度(遵循网络中的路径),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7679019/