gpt4 book ai didi

r - 计算熵的向量化函数

转载 作者:行者123 更新时间:2023-12-04 10:28:21 28 4
gpt4 key购买 nike

我正在编写一个函数来计算香农多样性指数。我有广泛的数据,每个值的观察百分比作为单独的变量,每一行代表一个不同的站点。根据数据集,我将有 2 到 7 个变量。对于每一行,我想计算信息索引。

equation .

我有一个循环函数,但它很慢,我正在寻找帮助来矢量化它。我也很高兴有一个 tidyverse 风格的解决方案。

我一直在考虑使用 entropy包,但它似乎期望数据是长格式的,虽然我可以将数据扩展回来,但这似乎会不必要地慢。我目前有 20k 个站点,每个站点有 100 到 1000 个观测值,这些观测值已经汇总到宽格式百分比分布中。 This question同样适用于长格式数据。

示例数据

# Wide data, between 2 and 7 columns recording the percent of observations with each value, example using 3
df <- data.frame(
site = 1:3,
l1 = c(.33, .5, 0),
l2 = c(.33, .5, 0),
l3 = c(.33, 0, 1)
)

电流环功能
entropy <- function(df, vars) {

entropy_calc <- function(df, i, vars) {
sum <- 0
for (j in vars) {
x <- df[i,j]
if(x != 0) { # skip zeros
sum <- sum + x * log(x)
}
}
return(-sum)
}

entropy <- rep(NA, nrow(df))
for(i in 1:nrow(df)) {
entropy[i] <- entropy_calc(df, i, vars)
}

return(as.numeric(entropy))
}

df$entropy <- entropy(df, 2:4)

最佳答案

这可以很容易地向量化,因为所需的底层函数已经向量化了。您不需要手动跳过零,因为 log(0)返回 -Inf0*log(0)返回 NaN .您可以省略 NaN通过指定 na.rm = TRUE 对单元格值求和时.

entropy <- function(p) rowSums(-(p * log(p)), na.rm = TRUE)

entropy(df[,2:4])

另请查看 diversity() vegan 中的函数包基本上做到这一点,以及其他可能性。

关于r - 计算熵的向量化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60533420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com