R:如何在计算栅格趋势时使用并行计算

安德烈·尼娜(Andrei Niță)

最近,我在RspaceEco中遇到了这个库我想为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)来计算栅格堆栈上的趋势?是否有必要将数据转换为矩阵然后使用这些库?

弗洛里安

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()
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章