r - 在 R 中使用 gstat 进行克里金法时,多慢算太慢

标签 r geospatial spatial-interpolation gstat

我正在尝试使用 R 的 gstat 包中的 krige 函数来插入 R 中的一些空间海洋深度数据。我发现超过约 1000点,该函数开始花费不合理的时间来完成(即,几小时到几天尚未完成)。这是正常现象还是我做错了什么?我特别担心,因为我的最终目标是对非常大的数据集(> 30,000 个数据点)进行时空克里金法,并且我担心考虑到这些运行时间,这是不可行的。

我正在运行 gstat-1.1-3 和 R-3.3.2。下面是我正在运行的代码:

library(sp); library(raster); library(gstat)
v.utm # SpatialPointsDataFrame with >30,000 points

# Remove points with identical positons
zd = zerodist(v.utm)
nzd = v.utm[-zd[,1],] # Layer with no identical positions

# Make a raster layer covering point layer
resolution=1e4
e = extent(as.matrix(v.utm@coords))+resolution
r = raster(e,resolution=resolution) 
proj4string(r) = proj4string(v.utm)

# r is a 181x157 raster

# Fit variogram
fv = fit.variogram(variogram(AVGDEPTH~1, nzd),model=vgm(6000,"Exp",1,5e5,1))

# Krige on random sample of 500 points - works fine
size=500
ss=nzd[sample.int(nrow(nzd),size),]
depth.krig = krige(AVGDEPTH~1,ss,as(r,"SpatialPixelsDataFrame"),
               model=depth.fit)

# Krige on random sample of 5000 points - never seems to end
size=5000
ss=nzd[sample.int(nrow(nzd),size),]
depth.krig = krige(AVGDEPTH~1,ss,as(r,"SpatialPixelsDataFrame"),
               model=depth.fit)

最佳答案

Choleski 分解(或类似分解)的复杂度为 O(n^3),这意味着如果将点数乘以 10,则所需时间将增加 1000 倍。有两种方法可以解决这个问题,至少就 gstat 而言:

  1. 安装 BLAS 的优化版本(例如 OpenBLAS 或 MKL) - 这不能解决 O(n^3) 问题,但可以最大程度地加快 n 倍的速度(其中 n 为可用内核数)
  2. 避免通过选择局部邻域(参数 maxdist 和/或 nmax)来分解完整协方差矩阵

关于r - 在 R 中使用 gstat 进行克里金法时,多慢算太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41067597/

相关文章:

r - 如何从 glm 对象获取 Z - 统计的值?

regex - R中如何匹配字符串和空格

r - 绘图随机性

r - 使用 R 将 basemap 添加到 SpatialPointDataFrames

r - 在 automap 中使用 autofitVariogram 绘制问题

python - 在 python 中将 1D 数组插入到 3D 数组网格中

r - 是否有 R 等效的 python 字符串 `format` 函数?

Python有效地创建密度图

r - 我可以通过多边形绑定(bind) st_distance 调用吗?

r - 自动克里格空间数据