假设我有10个型号,我在两个站点运行。站点1的日常数据为三年,站点2为四年。为了运行模型性能的统计数据,我循环遍历模型和站点:
require(hydroGOF)
df <- NULL
model <- list()
dateO <- list(seq(as.POSIXct("2012-01-01"), as.POSIXct("2014-12-31"), by="day"),
seq(as.POSIXct("2012-01-01"), as.POSIXct("2015-12-31"), by="day"))
obs <- list(sample(0:100,1096,replace=TRUE),
sample(0:100,1461,replace=TRUE))
var <- list()
for (i in 1:10) {
model[[i]] <- list()
model[[i]][[1]] <- sample(0:100,1096,replace=TRUE)
model[[i]][[2]] <- sample(0:100,1461,replace=TRUE)
for (j in 1:2) {
rmseS=rmse(model[[i]][[j]],obs[[j]],na.rm=TRUE)
rbind(df,rmseS) -> df
}
}
使用上面的代码,我可以计算总RMSE,但我想要的是计算年度RMSE。我了解ggof
包中的hydroGOF
可以计算年度,月度等统计信息,但我必须彻底重新格式化我的数据。有没有办法可以使用dateO
列表来计算年度RMSE,并且每个站点的年份不同会增加复杂性?我希望能够在数据框中编写我的数据,这就是为什么我rbind
在我的代码中,具有站点名称和模型名称,理想情况下,多年以后,结果将如下所示:< / p>
RMSE Site Model Year
0.4 Site1 Model1 2012
0.3 Site1 Model1 2013
0.4 Site1 Model2 2012
依旧......
答案 0 :(得分:1)
我确实设法做了我想做的事情,但使用的方法与上面提到的略有不同(我只是选择了有效的方法......)。我必须在数据帧中写入所有数据,然后计算循环外的rmse,如下:
for (i in 1:10) { # Loop over models
model[[i]] <- list()
model[[i]][[1]] <- sample(0:100,1096,replace=TRUE)
model[[i]][[2]] <- sample(0:100,1461,replace=TRUE)
for (j in 1:2) { # Loop over sites
year=as.numeric(format(dateO[[j]][length(dateO[[j]])],"%Y"))
# Loop over days.
for (k in 1:length(dateO[[j]])){
# Create a data frame with the vars needed to calculate yearly RMSE.
df <- rbind(df,data.frame(as.character(i),as.character(j),
model[[i]][[j]][[k]],obs[[j]][[k]],year))
}
}
}
colnames(df) <- c("Model_number","Site_number","Model_value","Obs_value","Year")
newdf <- df %>% group_by(Year,Site_number,Model_number) %>% summarise(RMSE=rmse(Model_value,Obs_value,na.rm=TRUE))