R:快速计算几何平均值
R: Fast calculation of geometric means
我有一个数据矩阵,如下所示:
> 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
...
我还有一个矩阵,它将我需要计算的几何平均值与上述 table 的列相关联。
> 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 x 4000。
对于每一列 n*,我需要计算第一个矩阵的几何平均值的方差(按行),即:
x <- which(sbp[,'n1']==1)
var(geometricMeanRows(df[,x]))
问题是我上面写的太慢了,没用。关于如何加快速度的任何建议?
注意(如果有帮助):每个n*对应二叉树内部节点的符号码。也就是说 sbp['n1'] 给出了一个向量,其中所有从内部节点 'n1' 下降的提示都被标记为 +1 或 -1 取决于它们是从 n1 的右子树还是左子树下降如果不是后代则为 0。
我将使用 包 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-loop的例子
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 更快到每一列。您可以将其与您的进行比较。
colprods 最好使用 method="expsumlog"。它比 defualt 慢,但更安全。
最后,Rfast 具有可能有用的函数 colVars。
我有一个数据矩阵,如下所示:
> 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
...
我还有一个矩阵,它将我需要计算的几何平均值与上述 table 的列相关联。
> 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 x 4000。
对于每一列 n*,我需要计算第一个矩阵的几何平均值的方差(按行),即:
x <- which(sbp[,'n1']==1)
var(geometricMeanRows(df[,x]))
问题是我上面写的太慢了,没用。关于如何加快速度的任何建议?
注意(如果有帮助):每个n*对应二叉树内部节点的符号码。也就是说 sbp['n1'] 给出了一个向量,其中所有从内部节点 'n1' 下降的提示都被标记为 +1 或 -1 取决于它们是从 n1 的右子树还是左子树下降如果不是后代则为 0。
我将使用 包 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-loop的例子
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 更快到每一列。您可以将其与您的进行比较。 colprods 最好使用 method="expsumlog"。它比 defualt 慢,但更安全。 最后,Rfast 具有可能有用的函数 colVars。