R 带gstat的局部变异函数的局部块克里格法

R 带gstat的局部变异函数的局部块克里格法,r,for-loop,kriging,gstat,R,For Loop,Kriging,Gstat,我在R中使用gstat软件包找不到任何特定于本地块克里格法和本地变异函数的信息。澳大利亚精准农业中心有一个名为VESPER的免费软件可以做到这一点,根据我所读到的,R中应该可以做到这一点,我可以使用一些帮助来组合for循环,使gstat函数在本地工作 以meuse数据集为例,我已经能够计算全局变异函数并将其拟合到数据集: library(gstat) data(meuse) coordinates(meuse) = ~x+y data(meuse.grid)

我在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")
库(gstat)
数据(meuse)
坐标(meuse)=~x+y
数据(meuse.grid)
网格化(meuse.grid)=~x+y

logzin_vgm我做了一个for循环,我认为它满足了您的要求。我认为这不需要块克里格法,因为循环在每个网格单元进行预测

rad
参数是搜索半径,可以设置为其他数量,但当前参考全局变异函数范围(具有金块效应)。我认为最好再搜索一点,因为如果只搜索到全局变异函数范围,局部变异函数拟合可能不会收敛(即没有观察到的范围)

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

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

#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)
    }
  }
}
#指定局部变异函数的搜索半径
rad=对数锌合vgm合度[2,3]
#指定用于预测的最小点数
k=25
#指示是否已存储任何结果的索引
存储=0
用于(i/1:nrow(meuse.grid)){
#计算从当前网格单元到所有点的欧几里德距离
dists=spDistsN1(pts=meuse,pt=meuse.grid[i,],longlat=FALSE)
#查找此网格点rad内点的索引
IndsInRad=哪个(距离loc_krig您是否验证了数据范围的空间子集局部变异函数是否在统计上与全局变异函数存在显著差异?我之所以这么问是因为如果它在合理的α水平上没有差异,您可以通过使用局部块kriging与全局变异函数来节省一些编程时间。例如,指定使用与全局变差函数范围相等的
maxdist
。谢谢您的回复,Jared。我已经用全局变差函数编写了块克里格法的代码。目的是将其输入到空间数据处理的web平台,因此这两个选项都需要编码。我很高兴这对您有效。请将此作为回答你的问题。提到的软件“VESPER”也会返回一个方差值(我想它取决于输入点值和预测的克里格单元格值之间的距离)-有没有办法将此添加到您的解决方案中?我不熟悉VESPER,并且该问题没有要求提供VESPER解决方案,因此我认为这不是合适的位置。不过,您可以发布一个关于VESPER的问题,链接到此问题。