【问题标题】:Local Block Kriging with Local Variogram with gstat使用 gstat 进行局部变异函数的局部块克里金法
【发布时间】:2017-04-12 15:57:38
【问题描述】:

我一直无法使用 R 中的 gstat 包找到具有局部变异函数的局部块克里金法的任何特定信息。澳大利亚精准农业中心有一个名为 VESPER 的免费软件能够做到这一点,而且我从已经读过它应该可以在 R 中使用,我可以使用一些帮助来组合一个 for 循环以使 gstat 函数在本地工作。

以 meuse 数据集为例,我已经能够计算全局变异函数并将其拟合到数据集:

    library(gstat)
    data(meuse)
    coordinates(meuse) = ~x+y
    data(meuse.grid)
    gridded(meuse.grid) = ~x+y

    logzinc_vgm<- variogram(log(zinc)~1, meuse)
    logzinc_vgm_fit <- fit.variogram(logzinc_vgm, model=vgm("Sph", "Exp"))
    logzinc_vgm_fit

    plot(logzinc_vgm, logzinc_vgm_fit)

这为带有拟合模型的整个数据集提供了一个很好的变异函数图。然后我可以使用它对整个数据集执行块克里金:

    logzinc_blkkrig <- krige(log(zinc)~1, meuse, meuse.grid, model = logzinc_vgm_fit, block=c(100,100))
    spplot(logzinc_blkkrig["var1.pred"], main = "ordinary kriging predictions")
    spplot(logzinc_blkkrig["var1.var"],  main = "ordinary kriging variance")

这会生成插值数据图以及每个预测点的方差图。因此,如果我希望这些函数对我的整个数据集只工作一次,这将是完美的......

但我一直无法生成一个 for 循环来在本地级别处理这些函数。

我的目标是: 1. 对于我的网格文件中的每个点(我已尝试将其作为数据框和 SpatialPointsDataFrame),我想从我的数据文件中对全局变异函数中给定范围的对角距离内的点进行子集(很容易称之为位置(即 logzinc_vgm_fit[2,3])) 2.在这个数据子集上,我想计算变异函数(如上)并为其拟合模型(如上) 3.基于这个模型,我想执行块克里金来得到那个网格点的预测值和方差 4.将以上三个步骤构建成一个for循环,根据每个网格点周围的局部变异函数预测每个网格点的值

注意:与 gstat 包中内置的 meuse 数据集一样,我的网格和数据数据框的维度是不同的

如果有人能够解决这个问题,非常感谢您的参与。如果有用的话,很高兴发布我目前正在使用的代码。

【问题讨论】:

  • 您是否针对数据范围的空间子集验证了局部变异函数与全局变异函数在统计上是否存在显着差异?我问是因为如果它在合理的 alpha 水平上没有什么不同,您可以通过使用局部块克里金法和全局变异函数来节省一些编程时间。例如,指定一个等于全局变异函数范围的maxdist
  • 感谢您的回复,杰瑞德。我已经用全局变异函数编写了块克里金法的代码。目的是将其输入到空间数据处理的网络平台中,因此需要对这两个选项进行编码。

标签: r for-loop kriging gstat


【解决方案1】:

我创建了一个 for 循环,我认为它可以满足您的要求。我认为不需要块克里金法,因为循环会在每个网格单元格处进行预测。

rad参数为搜索半径,可设置为其他量,但目前引用全局变差函数范围(带金块效果)。我认为最好进一步搜索点,因为如果您只搜索全局变异函数范围,局部变异函数拟合可能不会收敛(即没有观察到的范围)。

k 参数用于rad 内最近邻居的最小数量。这很重要,因为某些位置可能在rad 内没有点,这会导致错误。

您应该注意,您指定model=vgm("Sph", "Exp") 的方式似乎采用了第一个列出的方法。因此,我在 for 循环中使用了 Spherical 模型,但您可以更改为您想要使用的模型。如果您认为形状会随位置而变化,Matern 可能是一个不错的选择。

#Specify the search radius for the local variogram
rad = logzinc_vgm_fit[2,3]
#Specify minimum number of points for prediction
k = 25
#Index to indicate if any result has been stored yet
stored = 0
for (i in 1:nrow(meuse.grid)){
  #Calculate the Euclidian distance to all points from the currect grid cell
  dists = spDistsN1(pts = meuse, pt = meuse.grid[i,], longlat = FALSE)

  #Find indices of the points within rad of this grid point
  IndsInRad = which(dists < rad)

  if (length(IndsInRad) < k){
    print('Not enough nearest neighbors')
  }else{
    #Calculate the local variogram with these points
    locVario = variogram(log(zinc)~1, meuse[IndsInRad,])

    #Fit the local variogram
    locVarioFit = fit.variogram(logzinc_vgm, model=vgm("Sph"))

    #Use kriging to predict at grid cell i. Supress printed output.
    loc_krig <- krige(log(zinc)~1, meuse[IndsInRad,], meuse.grid[i,], model = locVarioFit, debug.level = 0)

    #Add result to database
    if (stored == 0){
      FinalResult = loc_krig
      stored = 1
    }else{
      FinalResult = rbind(FinalResult, loc_krig)
    }
  }
}

【讨论】:

  • 我很高兴这对你有用。请将此作为您问题的答案。
  • 上述软件“VESPER”也返回一个方差值(我想它取决于输入点值和预测克里格像元值之间的距离) - 有没有办法将它添加到您的解决方案中?
  • 我对 VESPER 不熟悉,而且问题并没有要求提供 VESPER 解决方案,所以我认为这不是一个合适的地方。不过,您可以发布一个关于 VESPER 的问题,链接到这个问题。
猜你喜欢
  • 2016-12-08
  • 2020-09-01
  • 2018-02-21
  • 2015-10-23
  • 1970-01-01
  • 2017-04-25
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多