【问题标题】:data.table rolling/windowed geometric mean [closed]data.table 滚动/加窗几何平均值
【发布时间】:2017-12-26 10:57:32
【问题描述】:

问题:
是否有使用 data.table 计算几何平均值的干净且快速运行的方法?

背景:
所以我用这个:

my_col_list <- names(mydata)[ my_start:ncol(mydata)]
my_name_list<- paste0(my_col_list, "_", "arithmean")
mydata[, (my_name_list) := unlist(lapply(.SD,
                                      function(x) rollapply(x,
                                                            5,
                                                            mean,
                                                            na.pad = TRUE)), 
                               recursive = F),
       .SDcols = my_col_list]

但我想计算geometric mean。我正在处理大约 2000 万行和大约 1500 列,因此首选快速运行的内置。

我看到了这些 (link) 计算几何平均值的方法,但它们是手动编码的,所以它们会变慢。这 (link) 是关于整体几何平均值,而不是窗口/滚动几何平均值。

具有手动编码(运行速度较慢)几何均值的包包括:

不卑不亢,但很快:

  • Gmedian,Gmedian,中位数而不是平均值,但构建得更快。使用 Rcpp 进行计算。

也许,但不确定:

  • 旋转,平均值.SO3

【问题讨论】:

  • rollapply(x, 5, geometric.mean, na.pad = TRUE) 改成这个
  • 您应该发布一个可重现的数据示例以及必要的 library() 调用,以便您的代码运行。

标签: r statistics data.table


【解决方案1】:

只需使用你自己的代码包psych函数geometric.mean

mydata[, (my_name_list) := unlist(lapply(.SD,
                                      function(x) rollapply(x,
                                                            5,
                                                            geometric.mean,
                                                            na.pad = TRUE)),recursive = F),
       .SDcols = my_col_list]

【讨论】:

  • 心理版本是手动编码的。它是“exp(mean(log(x), na.rm=TRUE))”。如果您在加载“psych”后键入“edit(geometric.mean)”,则会显示代码。这实际上不是内置/编译版本。
  • @EngrStudent 如果你确实想要更快的东西,我更喜欢Rcpp 并通过C++编写你自己的函数
  • 我还没用过Rcpp。你能给我一个链接到一个可以让我动起来的“入门示例”吗?
  • 查看此链接不同的问题,但 Rccp 性能更好stackoverflow.com/questions/45045318/…
  • Rollapply 已弃用 na.pad。而是使用“fill=NA”。
猜你喜欢
  • 1970-01-01
  • 2020-08-13
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2020-07-12
  • 2021-08-12
相关资源
最近更新 更多