R: Функция Autokrige.cv в пакете automap генерирует NaN

Я довольно плохо знаком с R, и я пытаюсь сделать интерполяции измерений температуры, которые были собраны с разных станций по всей Нидерландах. У меня есть данные примерно для 35 станций, которые проводят измерения каждые 10 минут, охватывая промежуток времени около двух недель. Соответственно, я подумал, что было бы лучше сделать цикл, который позаботится об этом. Чтобы увидеть, насколько хорошо работает метод интерполяции, я хочу провести перекрестную проверку для каждой временной отметки.

Для этого я использовал функцию Autokrige из пакета automap, а затем я использовал функцию compare.cv из пакета automap, чтобы получить обзор наиболее важной статистики для всех отметок времени. Кроме того, я позаботился о том, чтобы перекрестная проверка выполнялась только в том случае, если по меньшей мере 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 генерировать NaNs при перекрестной проверке, и что более важно, как я могу удалить их из 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) 

Спасибо!

1 ответ

Я столкнулся с той же проблемой и решил ее с помощью remove.duplicates() из пакета sp на SpatialPointDataFrame, используемой для кригинга. До этого я вычислял среднее значение соответствующих переменных в 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 выше не работала, поэтому я не мог проверить этот конкретный пример.

Другие вопросы по тегам