1

我对 R 相当陌生,我正在尝试对从荷兰各地不同站点收集的温度测量值进行插值。我有大约 35 个站点的数据,这些站点每 10 分钟进行一次测量,时间跨度约为两周。因此,我认为最好创建一个循环来处理这个问题。要查看插值技术的效果如何,我想对每个时间戳进行交叉验证。

为了做到这一点,我使用了 automap 包中的 Autokrige 函数,接下来我使用了 automap 包中的 compare.cv 函数,以便获得所有时间戳的最重要统计数据的概览。除此之外,我确保只有在至少 25 个站注册测量时才进行交叉验证。

然而问题是,我的代码如下所述在大多数情况下都有效,但在 4 种情况下会发出以下警告:

 1. In sqrt(ret[[var.name]]) : NaNs produced
 2. In sqrt(ret[[var.name]]) : NaNs produced
 3. In sqrt(ret[[var.name]]) : NaNs produced
 4. In sqrt(ret[[var.name]]) : NaNs produced

当我尝试对包括所有交叉验证的总列表使用 compare.cv 命令时,它给了我以下错误:

"Error in quantile.default(as.numeric(x), c(0.25, 0.75), na.rm = na.rm,  : 
  missing values and NaN's not allowed if 'na.rm' is FALSE"

我想知道是什么导致 Autokrige 函数在交叉验证中生成 NaN,更重要的是如何从 results.cv 中删除它们以便我可以使用 compare.cv 函数?

rm(list=ls())

# load packages
require(sp)
require(gstat)
require(ggmap)
require(automap)
require(ggplot2)

#load data (download link provided below)
load("download path") https://www.dropbox.com/s/qmi3loub29e55io/meassurements_aug.RDS?dl=0

# make data spatial and assign spatial coordinate system
coordinates(meassurements) = ~x+y
proj4string(meassurements) <- CRS("+init=epsg:4326")
meassurements_df <- as.data.frame(meassurements)

# loop for cross validation
timestamp <- meassurements$import_log_id
results.cv=list()

for (i in unique(timestamp)) {  
  x = meassurements_df[which(meassurements$import_log_id == i), ]  
  if(sum(!is.na(x$temperature)) > 25){

    results.cv[[paste0(i)]] = autoKrige.cv (temperature ~ 1, meassurements[which(meassurements$import_log_id == i & !is.na(meassurements$temperature)), ])
  } 
}

# calculate key statistics (RMSE MAE etc)
compare.cv(results.cv) 

谢谢!

4

1 回答 1

1

我遇到了同样的问题,并在用于克里金法的 SpatialPointDataFrame 上的包 sp 的 remove.duplicates() 的帮助下解决了这个问题。在此之前,我计算了 DataFrame 中相关变量的平均值。

    SPDF@data <- SPDF@data %>%
      group_by(varx,vary,varz) %>%
      mutate_at(vars(one_of(relevant_var)),mean,na.rm=TRUE) %>%
      ungroup()
    SPDF <- SPDF %>% remove.duplicates()

当时我遇到了同样的问题,上面的 Dropbox 链接不再起作用,所以我无法检查这个具体的例子。

于 2017-09-13T19:59:40.957 回答