【问题标题】:Cross-validation and variance calculation in the `gstat` package in RR中`gstat`包中的交叉验证和方差计算
【发布时间】:2019-03-22 13:50:14
【问题描述】:

早安,

在尝试从 gstat 包中完成的反距离克里格计算方差时,我遇到了一些困难。我还想对一组独立的变量测试集进行交叉验证,但我不确定如何在 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

我知道为什么会出现错误,但我不知道如何继续。我可以在R 之外进行交叉验证,但有点麻烦,但我真的很想把我的所有工作都放在R 之内。任何建议都将受到欢迎。

库尔特

【问题讨论】:

    标签: r geospatial spatial


    【解决方案1】:

    要进行这种比较,您需要使用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
    

    【讨论】:

    • 感谢一百万 Paul,您的软件包看起来确实很有帮助,我一定会使用它。但是我仍然有点不确定如何包含测试和训练数据集。回到我的例子,在看不见的(测试)数据集上运行交叉验证的正确公式是kr.cv.id&lt;-krige.cv(zinc~1, m.train, newdata=m.test) #For inverse distance interpolation
    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2021-09-01
    • 1970-01-01
    • 2018-11-08
    • 2014-06-05
    • 2015-06-24
    相关资源
    最近更新 更多