R中“gstat”包中的交叉验证和方差计算

R中“gstat”包中的交叉验证和方差计算,r,geospatial,spatial,R,Geospatial,Spatial,你好 当试图从gstat包中完成的反距离krig计算方差时,我遇到了一些困难。我还想在独立的变量测试集上运行交叉验证,但我不确定如何在R中使用空间数据进行交叉验证。使用meuse数据集,我试图计算方差: data(meuse); coordinates(meuse) <- ~x+y #randomly sample to get training and test data for later cross-validation set.seed = (123) sub1 <-

你好

当试图从
gstat
包中完成的反距离krig计算方差时,我遇到了一些困难。我还想在独立的变量测试集上运行交叉验证,但我不确定如何在R中使用空间数据进行交叉验证。使用
meuse
数据集,我试图计算方差:

data(meuse); coordinates(meuse) <- ~x+y 

#randomly sample to get training and test data for later cross-validation
set.seed = (123)

sub1 <- nrow(meuse@data); len1 <- ceiling(sub1*2/3)

m.train <- meuse
m.train@data <- meuse@data[1:len1,]
m.train@coords <- meuse@coords[1:len1,]

m.test <- meuse
m.test@data <- meuse@data[(len1+1):sub1,]
m.test@coords  <- meuse@coords[(len1+1):sub1,]

 ## load grids:
data(meuse.grid); coordinates(meuse.grid) <- ~x+y
gridded(meuse.grid) <- TRUE; fullgrid(meuse.grid) <- TRUE

zinc.id <- krige(zinc~1, m.train, meuse.grid) ## inverse distance weighting

# --- My attempt at calculation of variance
rmse.id <- sqrt(mean((meuse.test@data$zinc - zinc.id@data$var1.pred)^2))

Warning message:
In meuse.test@data$z - zinc.id@data$var1.pred :
longer object length is not a multiple of shorter object length

数据(meuse);坐标(meuse)要执行这种比较,需要使用
meuse
而不是
meuse.grid
作为
newdata
。或者更好地使用
krige.cv

例如,使用
meuse
数据集:

kr_cv = krige.cv(log(zinc)~1, meuse, vgm(.59, "Sph", 874, .04))
kr_cv[1:5,]
       coordinates var1.pred  var1.var observed    residual      zscore fold
1 (181072, 333611)  6.784729 0.1681011 6.929517  0.14478795  0.35314023    1
2 (181025, 333558)  6.777372 0.1635077 7.039660  0.26228828  0.64864901    2
3 (181165, 333537)  6.294508 0.1723531 6.461468  0.16696067  0.40216530    3
4 (181298, 333484)  6.033072 0.2191244 5.549076 -0.48399603 -1.03394256    4
5 (181307, 333330)  5.576879 0.1643513 5.594711  0.01783242  0.04398694    5
由此,您可以轻松计算交叉验证的RMSE。
automap
包(免责声明:由我编写)包含一个方便的函数,可以为您计算大量这些统计数据。通常,它只接受
autoKrige.cv
的输出,但使用一个小技巧,您仍然可以使用它:

library(automap)
compare.cv(list(krige.cv_output = kr_cv))
            krige.cv_output
mean_error        0.0003146
me_mean           5.345e-05
MAE                  0.2898
MSE                  0.1515
MSNE                 0.8607
cor_obspred          0.8416
cor_predres         0.05449
RMSE                 0.3892
RMSE_sd              0.5391
URMSE                0.3892
iqr                  0.3949

非常感谢,保罗,你的软件包看起来很有用,我一定会用的。然而,我仍然有点不确定如何包括测试和培训数据集。回到我的示例中,对不可见(测试)数据集运行交叉验证的正确公式是
kr.cv.id