使用gstat进行局部变异函数的局部块克里格

时间:2016-11-28 20:07:41

标签: r for-loop kriging gstat

我一直无法使用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数据集一样,我的网格和数据数据框的尺寸不同

如果有人能够解决这个问题,那么非常感谢你们。很高兴发布我目前正在使用的代码,如果它有用。

1 个答案:

答案 0 :(得分: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)
    }
  }
}