【问题标题】:R: How to use parallel computing on calculating trends in rasterR:如何使用并行计算计算栅格趋势
【发布时间】:2019-05-07 08:15:07
【问题描述】:

最近我在 R spatialEco 中遇到了这个库。我想计算 R 中栅格堆栈的 Kendall tau 统计量。但是,这将花费大量时间,因为该库仅使用计算机上的一个核心(我计划使用的栅格在 250 m 的全局范围内分辨率)

library(raster)
library(spatialEco)

r.logo <- stack(system.file("external/rlogo.grd", package="raster"),
system.file("external/rlogo.grd", package="raster"),
system.file("external/rlogo.grd", package="raster"))

# Calculate trend slope with p-value and confidence level(s)
start_time <- Sys.time()

logo.trend <- raster.kendall(r.logo, tau = TRUE, intercept = TRUE, p.value = TRUE,
z.value = TRUE, confidence = TRUE)

end_time <- Sys.time()
end_time - start_time

names(logo.trend) <- c("slope","tau", "intercept", "p.value", "z.value", "LCI", "UCI")
plot(logo.trend)

是否可以使用像library(parallel) 这样的库来计算光栅堆栈上的趋势?是否需要将数据转换为矩阵,然后使用这些库?

【问题讨论】:

    标签: r parallel-processing spatial raster trend


    【解决方案1】:

    spatialEco::raster.kendall() 调用 raster::overlay() 并且可以并行运行:

    1. spatialEco::raster.kendall()获取相关函数:

      trend.slope <- function(y, p.value.pass = TRUE, z.pass = TRUE, 
                              tau.pass = TRUE, confidence.pass = TRUE, intercept.pass = TRUE) {
          options(warn = -1)
          fit <- EnvStats::kendallTrendTest(y ~ 1)
          fit.results <- fit$estimate[2]
          if (tau.pass == TRUE) {
              fit.results <- c(fit.results, fit$estimate[1])
          }
          if (intercept.pass == TRUE) {
              fit.results <- c(fit.results, fit$estimate[3])
          }
          if (p.value.pass == TRUE) {
              fit.results <- c(fit.results, fit$p.value)
          }
          if (z.pass == TRUE) {
              fit.results <- c(fit.results, fit$statistic)
          }
          if (confidence.pass == TRUE) {
              ci <- unlist(fit$interval["limits"])
              if (length(ci) == 2) {
                  fit.results <- c(fit.results, ci)
              }
              else {
                  fit.results <- c(fit.results, c(NA, NA))
              }
          }
          options(warn = 0)
          return(fit.results)
      }
      
    2. 使用n 节点启动集群。

      beginCluster(n=2)
      
    3. 并行计算。

      logo.trend.parallel <- clusterR(r.logo, overlay, args=list(fun=trend.slope))
      
    4. 停止集群。

      endCluster()
      

    【讨论】:

      【解决方案2】:

      这是一个定时比较。

      示例数据(更花哨以避免所有值都相同)

      library(raster)
      f <- system.file("external/rlogo.grd", package="raster")
      s <- stack(f)+1
      r.logo <- stack(s/2, s, s*2)
      

      我在这里只计算 Tau。首先是raster.kendall

      library(spatialEco)
      system.time(
       logo.trend1 <- raster.kendall(r.logo, tau=TRUE)
      )
      #   user  system elapsed 
      #   6.73    0.00    6.72 
      

      现在,使用 calc 和基本的 cor 函数

      nl <- 1:nlayers(r.logo)
      kfun <- function(i) {
       cor(nl, i, method="kendall")
      }
      
      system.time(
       logo.trend2 <- calc(r.logo, kfun)
      )
      #   user  system elapsed 
      #   0.51    0.00    0.51 
      

      速度提高了 13 倍。现在并行

      beginCluster(n=4)
      system.time(
       logo.trend.parallel <- clusterR(r.logo, calc, args=list(fun=kfun), export="nl")
      )
      #   user  system elapsed 
      #   0.05    0.05    0.69 
      endCluster()
      

      没有时间增益,但对于小数据集,这是预期的,对于大数据集可能会有所不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-29
        • 2020-01-16
        • 1970-01-01
        • 2012-02-18
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多