我是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函数? < / p>
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)
谢谢!
答案 0 :(得分: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链接不再有效,所以我无法查看这个具体的例子。