微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编写布雷-柯蒂斯函数?

如何解决如何编写布雷-柯蒂斯函数?

我尝试自己编写 braycurtis 函数。我的数据是不同地区的经济、社会数据(每行是不同的地区,每列是经济师图像描述hereic index)。样本(数据已经在 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

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

解决方法

虽然我认为您不想拥有 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,]) is mathematically equivalent

这会给你一个对角线为 1 的对称矩阵(所以做了很多多余的工作)。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。