使用 autoKrige() 的 R 通用克里金法

0 r spatial automap kriging

我正在尝试使用 automap 包中的 autoKrige() 函数来实现通用克里金法的简单应用。我有一个不规则间隔的测量网格,我想在精细的空间尺度上在它们之间进行插值。示例代码:

    library('automap')

    # create an irregularly spaced grid
    y <-x <-c(-5,-4,-2,-1,-0.5,0,0.5,1,2,4,5)
    grid <-expand.grid(x,y)
    names(grid) <-c('x', 'y')

    # create some measurements, greatest in the centre, with some noise
    vals <-apply(grid,1, function(x) {12/(0.1+sqrt(x[1]^2 + x[2]^2))+rnorm(1,2,1.5)})

    # get data into sp format
    s <-SpatialPointsDataFrame(grid, data.frame(vals))

    # make some prediction locations and get them into sp format
    pred <-expand.grid(seq(-5,5,by=0.5), seq(-5,5,by=0.5))
    pred <-cbind(pred[,1], pred[,2])    # this seems to be needed, not sure why
    pred <-SpatialPoints(pred)

    # try universal kriging
    surf <-autoKrige(vals~x+y, s, new_data=pred)    
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

    Error in gstat.formula.predict(d$formula, newdata, na.action = na.action,  : 
      NROW(locs) != NROW(X): this should not occur
Run Code Online (Sandbox Code Playgroud)

我尝试过使 new_data 具有与原始数据相同的行数,甚至尝试使 new_data 中的坐标与原始数据完全相同,但我仍然收到此错误。我是地质统计学技术的新手,所以如果我犯了一个基本错误,我深表歉意。谁能告诉我哪里出错了?谢谢。

Pau*_*tra 6

问题是您的函数语法autoKrige错误。输入的公式指定autoKrige您要使用的线性模型,例如:

log(zinc) ~ dist
Run Code Online (Sandbox Code Playgroud)

meuse数据集中。在这种情况下,您可以使用线性模型进行建模log(zinc)dist并且使用变差函数对该模型的残差进行插值。本质上,通用克里金法是具有空间相关残差的线性回归。

在您的情况下,您指定:

val ~ x+y
Run Code Online (Sandbox Code Playgroud)

所以autoKrige(gstat实际上)将尝试首先vals对与xy(多元回归)的线性模型进行建模,并使用变差函数模型对残差进行插值。但是,xy变量不存在于SpatialPointsDataFrame.

我认为您想要做的只是使用变差函数模型进行空间插值。在这种情况下,线性模型非常简单,实际上只是拟合一个平均值:

vals ~ 1
Run Code Online (Sandbox Code Playgroud)

其中 的平均值vals是确定的,并且使用变差函数模型对残差进行插值。这实际上称为普通克里金法。您的呼叫autoKrige将类似于:

surf <-autoKrige(vals ~ 1, s, new_data=pred) 
Run Code Online (Sandbox Code Playgroud)