在R中有效地从网格中插值

fre*_*tal 5 interpolation r

我有一个按位置划分的海洋深度数据网格,我正在尝试为选定的GPS点插入深度值.

我们一直在使用RSAGA :: pick.from.points,它适用于小型数据集.

require(RSAGA)

depthdata <- cbind.data.frame(x=c(74.136, 74.135, 74.134, 74.133, 74.132, 74.131, 74.130, 74.129, 74.128, 74.127), 
y=rep(40, times=10), 
depth=c(-0.6, -0.6, -0.9, -0.9, -0.9, -0.9, -0.9, -0.9, -0.6, -0.6))

mylocs <- rbind(c(-74.1325, 40), c(-74.1305, 40))
colnames(mylocs) <- c("x", "y")

results <- pick.from.points(data=mylocs, src=depthdata, pick=c("depth"), method="nearest.neighbour")
mydepths <- results$depth
Run Code Online (Sandbox Code Playgroud)

但是我们的深度数据集包含6900万个数据点,我们有500万个GPS点,我们想要深度估计,而pick.from.points对于这个数据集来说只需要太长时间(> 2周).我们认为我们可以在MATLAB或ArcMap中更快地完成这项任务,但我们正试图将这项任务纳入R中更长的工作流程中,我们正在为其他人编写反复运行的工作流程,因此切换到专有软件的部分工作流程不太理想.

我们愿意为速度牺牲一定程度的准确性.

我尽可能地寻找解决方案,但我对网格数据和插值相当新,因此可能使用了不恰当的语言,因此缺少一个简单的解决方案.


jos*_*ber 6

如果你愿意通过找到最近的邻居并使用它的值来推断,我认为诀窍是使用有效的最近邻居实现,它允许你在O(log(n))时间内找到n个替代中的最近邻居.kd树提供了这种性能,并且可以通过R中的FNN包获得.虽然计算(在随机生成的数据上有6900万个数据点供参考,500万个数据点用于估算)不是即时的(它需要大约3分钟),它比2周快得多!

data <- cbind(x=rnorm(6.9e7), y=rnorm(6.9e7))
labels <- rnorm(6.9e7)
query <- cbind(x=rnorm(5e6), y=rnorm(5e6))

library(FNN)
get.nn <- function(data, labels, query) {
  nns <- get.knnx(data, query, k=1)
  labels[nns$nn.index]
}
system.time(get.nn(data, labels, query))
#    user  system elapsed
# 174.975   2.236 177.617
Run Code Online (Sandbox Code Playgroud)

作为警告,该过程达到了大约10GB的RAM,因此您需要大量的内存资源才能在您的大小的数据集上运行.