R:快速计算几何平均值

时间:2016-05-03 23:09:41

标签: r performance tree

我有一个如下所示的数据矩阵:

> df[1:5,1:5]
          OTU_97.30326 OTU_97.44566 OTU_97.44134 OTU_97.45188 OTU_97.31247 ...
700114712 0.0001197605 0.0003592814 0.0001197605 0.0001197605 0.0043113772
700114713 0.0001236400 0.0001236400 0.0001236400 0.0001236400 0.0001236400
700114554 0.0001245795 0.0001245795 0.0001245795 0.0001245795 0.0001245795
700114606 0.0001282380 0.0001282380 0.0001282380 0.0001282380 0.0001282380
700114335 0.0002158662 0.0009713977 0.0005396654 0.0001079331 0.0024824609
...

我还有一个矩阵,它将我需要计算的几何平均值与上表的列相关联。

> sbp[1:5,1:7]
             n1 n2 n3 n4 n5 n6 n7...
OTU_97.30326  1  1  1  1  1  1  1
OTU_97.44566  1  1  1  1  1  1  1
OTU_97.44134  1  1  1  1  1  1  1
OTU_97.45188  1  1  1  0  1  1  0
OTU_97.31247  1  1  1  -1  1  0  1
...

两者的大小约为4000乘4000。

对于每列n *,我需要计算第一个矩阵的几何平均值的方差(按行),即,沿着这样的行:

x <- which(sbp[,'n1']==1)
var(geometricMeanRows(df[,x]))

问题是我上面写的内容太慢而无法使用。关于如何提高速度的任何建议?

注意(如果有帮助):每个n *对应于二叉树内部节点的符号代码。这是sbp [,&#39; n1&#39;]给出一个向量,其中所有从内部节点下降的提示&#39; n1&#39;如果它们是从n1的右或左子树下降,则标记为+1或-1,如果它不是后代,则标记为0。

1 个答案:

答案 0 :(得分:3)

我将使用软件包 Rfast 来加快代码的速度。

colGeomMean <- function(x) Rfast::colprods(x,method="expsumlog")^(1/nrow(x))
x <- which(sbp[,'n1']==1)
Rfast::Var(colGeomMean(df[,x]))

以下是一些功能 Rfast :: Var

的基准
x=rnorm(4000)
microbenchmark::microbenchmark(Rfast=a<-Rfast::Var(x),R=b<-var(x),times = 10)
Unit: microseconds
   expr    min     lq    mean median     uq     max neval
 Rfast  14.369 15.190 19.5417 16.627 19.296  43.927    10
     R  59.938 62.401 85.0214 68.149 99.349 167.497    10
a==b
[1] TRUE

还有一个使用for循环的示例

x=rnorm(4000)
microbenchmark::microbenchmark(
Rfast=for(i in 1:1000) a<-Rfast::Var(x),R=for(i in 1:1000) b<-var(x),times = 10)
Unit: milliseconds
       expr      min       lq      mean   median        uq       max neval
 Rfast 16.56490 16.93438  20.27926 17.11994  18.57527  44.03719    10
     R 66.97311 73.90082 105.52192 87.81862 132.33613 207.79121    10

a==b
[1] TRUE

R没有 colprods ,因此 colGeomMean 将比对每个列应用 prod 更快。您可以将其与您的进行比较。 最好使用method =“ expsumlog”进行协作。它比脱脂慢,但更安全。 最后, Rfast 具有 colVars 功能,该功能可能会有用。