【问题标题】:How to write Bray-Curtis function?如何编写 Bray-Curtis 函数?
【发布时间】:2021-07-01 13:52:28
【问题描述】:

我尝试自己编写 braycurtis 函数。我的数据是关于不同地区的经济、社会数据(每行是不同地区,每列是经济学家图像描述此处索引)。样本(数据已经在 0-1 范围内归一化,这就是为什么最佳区域,标准区域的值为 1)- 真实数据有更多的区域和值:P

Region= c("A", "B", "C")
Sp1 =c(0.43, 1, 0.5)
Sp2 = c(0.53, 0.12, 0.75)
...
Sp23 = c(0.97, 0.2, 1)
Sp24 = c(0.34, 0.72, 0.23)

我需要综合发展指数,这就是我尝试使用 bray_curtis 的原因。这是我函数的代码

bray_curtis <- function(x, na.rm = FALSE) {
  return(1-(rowSums(abs(x - max(x))))/rowSums(x+max(x)))
}
gus2016_braycurtis <- as.data.frame(lapply(gus2016_norm, bray_curtis)) 

公式,我试图实现 [1]:https://i.stack.imgur.com/LRrBb.png

我应该改变什么?为了输出我需要一个每个地区的综合发展指数列。

【问题讨论】:

  • 提供一些可重复的数据并显示您想要的结果。 vegan 包中的函数 vegdistecodist 包中的 bcdist 计算 Bray-Curtis 指数。
  • BC (dis)similarity index逐个元素地比较两个向量。它说明了这两者的相似之处。它确实没有给出one向量的任何综合发展指数。如果您取一列 BC (dis)similarities,那只会说明每列与该列的 (dis)similar 程度。你真的想使用 BC (dis)similarities 吗?还是您在寻找完全不同的东西?比如一些“综合发展指数”?
  • 我为您的原始问题写了一个较长的答案,但我认为您真的不想使用成对的 Bray-Curtis (dis)similarity,因此我删除了我的答案。

标签: r geospatial distance vegan economics


【解决方案1】:

虽然我认为您不想拥有 Bray-Curtis 指数,但我将展示如何获得它。您的数学需要修正:您的计算与您 linked to 的公式几乎没有关系(甚至链接的公式也会破坏索引,但让我们忽略它并实现预期的公式)。

BC 索引是在两行(或列)之间计算的相异性或相似性索引。当仅针对一次观察计算时(即,当索引相等且行/列只是重复时)它将为 0(如果距离)或 1(如果相似)。链接公式定义了相似性指数。这是矩阵z 的链接公式的简单实现,并在行之间进行计算。如果要计算列之间的相似度,则需要切换索引:

N <- nrow(z) # assuming that matrix/data.frame z exists
d <- matrix(0, N, N)
for(i in 1:N) for(j in 1:N) d[i,j] <- 1 - sum(abs(z[i,]-z[j,]))/sum(z[i,]+z[j,])
## d[i,j] <- 2*sum(pmin(z[i,], z[j,]))/sum(z[i,]+z[j,]) is mathematically equivalent

这将为您提供一个对角线为 1 的对称矩阵(因此做了很多冗余工作)。

然后有一个简单的方法,因为 BC 索引已在多个包中实现。我只是展示了如何在 vegan 中获得它,我们需要将相异性更改为相似性,并且我还将距离结构转换为上述对称矩阵:

library(vegan)
d <- 1 - as.matrix(vegdist(z)) # assuming that z exists

可能你不想拥有这个,但在这里你会看到如何获得它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多