计算 Rao 的二次熵

Calculate Rao's quadratic entropy

Rao QE是一个加权欧式距离矩阵。我有数据 table dt 中 d_ijs 元素的向量,每个元素一列(假设有 x 个元素)。 p 是最后一列。 nrow = S。双和用于距离矩阵的左下角(或右上角,因为它是对称的)元素。

如果我只需要一个未加权的距离矩阵,我可以简单地在 x 列上执行 dist() 。我如何用 p_i 和 p_j 的乘积来加权 d_ijs?

示例数据集位于 https://github.com/GeraldCNelson/nutmod/blob/master/RaoD_example.csv,在名为 foodQ.ratio 的列中有 ps。

对于原始欧氏距离矩阵,您仍然从 dist 开始。让它成为 D。正如您将从, a "dist" object is not a real matrix, but a 1D array. So first do D <- as.matrix(D) 中读取的那样,将其转换为以下之前的完整矩阵。

现在,设p为权重向量,Rao的QE只是一个二次型 q'Dq / 2:

c(crossprod(p, D %*% p)) / 2

请注意,我没有以最有效的方式做每件事。我使用完整的 D 而不仅仅是其下三角部分执行了对称矩阵向量乘法 D %*% p。但是,R 没有执行三角矩阵向量乘法的例程。所以我计算完整版而不是除以 2.

这使所需的计算量翻倍;此外,使 D 成为完整矩阵会使内存成本增加一倍。但是,如果您的问题是中小型,这绝对没问题。对于大问题,如果你是R和C高手,调用BLAS例程dtrmv or even dtpmv进行三角矩阵向量计算


更新

我刚找到这篇简单的论文:Rao's quadratic entropy as a measure of functional diversity based on multiple traits for definition and use of Rao's EQ. It mentions that we can replace Euclidean distance with Mahalanobis distance. In case we want to do this, use my code in 用于快速计算马氏距离矩阵。