We are using WRF-Hydro to predict streamflow for multiple basins in the Upper Rio Grande for 2004-2014. We ran WRF-Hydro in LSM-only mode (no routing) with NoahMP as the LSM for the 10-year period with daily output. We want to evaluate model performance at various gage stations in the domain.
Load the rwrfhydro package.
library("rwrfhydro")
## To check rwrfhydro updates (to master branch) run: CheckForUpdates()
Set the data paths for the Upper Rio Grande.
# Where streamflow obs files live
obsPath <- '~/wrfHydroTestCases/Upper_RioGrande/OBS/STRFLOW'
# Where model output files live
outPath <- '~/wrfHydroTestCases/Upper_RioGrande/OUTPUT_WY2014'
# Where basin mask files live
mskPath <- '~/wrfHydroTestCases/Upper_RioGrande/DOMAIN/MASKS'
# Where to put plot files
plotPath <- '~/wrfHydroTestCases/Upper_RioGrande/ANALYSIS'
If you want to use R’s multi-core capability (make sure doMC is installed) specify the number of cores.
library(doMC)
## Warning: package 'doMC' was built under R version 3.1.2
## Loading required package: foreach
## Warning: package 'foreach' was built under R version 3.1.2
##
## Attaching package: 'foreach'
##
## The following object is masked from 'package:chron':
##
## times
##
## Loading required package: iterators
## Warning: package 'iterators' was built under R version 3.1.2
## Loading required package: parallel
registerDoMC(8)
Create a lookup list to match basin mask ID to gage ID.
idList <- list("alamosa_1k"="ALATERCO",
"conejos_1k"="CONMOGCO",
"s_frk_1k"="RIOSFKCO",
"rio_wagw_1k"="RIOWAGCO",
"saguache_1k"="SAGSAGCO",
"trinchera_1k"="TRITURCO")
Import all gage data from data files we downloaded from the CO DWR website. First, we build a file list.
obsList <- list.files(obsPath, pattern=glob2rx("*.txt"))
Then, we loop through the files and built a single dataframe with all the gage data. We use the ReadCoDwrGage tool to import the individual gage files.
obsStr <- data.frame()
for (i in 1:length(obsList)) {
tmp <- ReadCoDwrGage(paste0(obsPath, "/", obsList[i]))
obsStr <- plyr::rbind.fill(obsStr,tmp)
}
To view the first few lines of our observed dataframe:
head(obsStr)
Station | datetime | AIRTEMP | DISCHRG | GAGE_HT | q_cms | q_cfs | ht_m | ht_ft | POSIXct | wy | PRECIP | WATTEMP |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ALATERCO | 2004-01-01 00:00 | 14.1 | 0 | 0.04 | 0 | 0 | 0.012192 | 0.04 | 2004-01-01 00:00:00 | 2004 | NA | NA |
ALATERCO | 2004-01-01 00:15 | 13.3 | 0 | 0.04 | 0 | 0 | 0.012192 | 0.04 | 2004-01-01 00:15:00 | 2004 | NA | NA |
ALATERCO | 2004-01-01 00:30 | 12.3 | 0 | 0.04 | 0 | 0 | 0.012192 | 0.04 | 2004-01-01 00:30:00 | 2004 | NA | NA |
ALATERCO | 2004-01-01 00:45 | 12.0 | 0 | 0.04 | 0 | 0 | 0.012192 | 0.04 | 2004-01-01 00:45:00 | 2004 | NA | NA |
ALATERCO | 2004-01-01 01:00 | 11.2 | 0 | 0.04 | 0 | 0 | 0.012192 | 0.04 | 2004-01-01 01:00:00 | 2004 | NA | NA |
ALATERCO | 2004-01-01 01:15 | 11.2 | 0 | 0.04 | 0 | 0 | 0.012192 | 0.04 | 2004-01-01 01:15:00 | 2004 | NA | NA |
Until we can automate this from the data download side, we will have to manually set the gage drainage areas. We will set it up as an attribute to the observation dataframe.
attr(obsStr, "area_sqmi") <- c(ALATERCO=107, CONMOGCO=282, RIOSFKCO=216,
RIOWAGCO=780, SAGSAGCO=595, TRITURCO=45)
attr(obsStr, "gage_name") <- c(ALATERCO="ALAMOSA RIVER ABOVE TERRACE RESERVOIR",
CONMOGCO="CONEJOS RIVER NEAR MOGOTE",
RIOSFKCO="SOUTH FORK RIO GRANDE RIVER AT SOUTH FORK",
RIOWAGCO="RIO GRANDE RIVER AT WAGON WHEEL GAP",
SAGSAGCO="SAGUACHE CREEK NEAR SAGUACHE",
TRITURCO="TRINCHERA CREEK ABOVE TURNER'S RANCH")
To access this attribute:
attributes(obsStr)$area_sqmi
## ALATERCO CONMOGCO RIOSFKCO RIOWAGCO SAGSAGCO TRITURCO
## 107 282 216 780 595 45
We can double-check to make sure we have all of the gages we expect.
unique(obsStr$Station)
## [1] "ALATERCO" "CONMOGCO" "RIOSFKCO" "RIOWAGCO" "SAGSAGCO" "TRITURCO"
And we can plot hydrographs for the gages for WY 2014.
library(ggplot2)
ggplot(subset(obsStr, obsStr$wy==2014), aes(x=POSIXct, y=q_cms, color=Station)) + geom_line() + ylim(0,100)
We loop through the predefined basin masks and use ReadLdasoutWb to calculate the basin-averaged water budget components. Since we have already resampled the high-res basins to the low-res geogrid and set each mask value to 1, we set basid to 1 and aggfact to 1 (no aggregation). We will also grab the basin area for each mask (as a cell count) and track it as an attribute to the output dataframe.
mskList <- list.files(mskPath, pattern=glob2rx("*.nc"))
modLdasout <- data.frame()
tmparea<-data.frame(matrix(nrow=1,ncol=0))
for (i in 1:length(mskList)) {
tmp <- ReadLdasoutWb(outPath, paste0(mskPath, "/", mskList[i]),
mskvar="basn_msk", basid=1, aggfact=1, ncores=8)
tmp$Station <- idList[[unlist(strsplit(mskList[i], "[.]"))[1]]]
modLdasout <- rbind(modLdasout, tmp)
tmparea[,idList[[unlist(strsplit(mskList[i], "[.]"))[1]]]] <- attributes(tmp)$area_cellcnt
rm(tmp)
}
attr(modLdasout, "area_cellcnt") <- tmparea
rm(tmparea)
To view the first few lines of our model output dataframe:
head(modLdasout)
POSIXct | stat | ACCECAN | ACCEDIR | ACCETRAN | ACCPRCP | CANICE | CANLIQ | SFCRNOFF | SNEQV | UGDRNOFF | SOIL_M1 | SOIL_M2 | SOIL_M3 | SOIL_M4 | wy | DEL_ACCPRCP | DEL_ACCECAN | DEL_ACCETRAN | DEL_ACCEDIR | DEL_UGDRNOFF | DEL_SFCRNOFF | Station |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2013-10-01 | basin_avg | 372.4899 | 2116.062 | 825.7927 | 8021.332 | 3e-07 | 0 | 921.0609 | 0.2622312 | 3711.065 | 0.2868747 | 0.2921334 | 0.2920949 | 0.2869370 | 2014 | NA | NA | NA | NA | NA | NA | ALATERCO |
2013-10-02 | basin_avg | 372.4899 | 2116.803 | 826.0614 | 8021.332 | 4e-07 | 0 | 921.0869 | 0.0000000 | 3712.331 | 0.2822108 | 0.2881350 | 0.2908228 | 0.2873262 | 2014 | 0 | -0.0000480 | 0.2686473 | 0.7414562 | 1.266545 | 0.0260495 | ALATERCO |
2013-10-03 | basin_avg | 372.4898 | 2117.656 | 826.2880 | 8021.332 | 6e-07 | 0 | 921.0869 | 0.0000000 | 3713.607 | 0.2776304 | 0.2845793 | 0.2892009 | 0.2874697 | 2014 | 0 | -0.0001115 | 0.2266649 | 0.8525837 | 1.275594 | 0.0000000 | ALATERCO |
2013-10-04 | basin_avg | 372.4895 | 2118.470 | 826.4867 | 8021.332 | 6e-07 | 0 | 921.0869 | 0.0000000 | 3714.873 | 0.2745260 | 0.2817819 | 0.2874777 | 0.2873737 | 2014 | 0 | -0.0002385 | 0.1986668 | 0.8146601 | 1.266644 | 0.0000000 | ALATERCO |
2013-10-05 | basin_avg | 372.4895 | 2119.245 | 826.5613 | 8021.332 | 0e+00 | 0 | 921.0869 | 0.0000000 | 3716.115 | 0.2727172 | 0.2794113 | 0.2859211 | 0.2871096 | 2014 | 0 | -0.0000002 | 0.0746508 | 0.7745129 | 1.241436 | 0.0000000 | ALATERCO |
2013-10-06 | basin_avg | 372.4895 | 2119.473 | 826.6407 | 8021.332 | 0e+00 | 0 | 921.0869 | 0.0000000 | 3717.322 | 0.2739248 | 0.2780929 | 0.2845067 | 0.2867192 | 2014 | 0 | 0.0000000 | 0.0794051 | 0.2277344 | 1.207140 | 0.0000000 | ALATERCO |
And to view the basin area attribute:
attributes(modLdasout)$area_cellcnt
ALATERCO | CONMOGCO | RIOWAGCO | RIOSFKCO | SAGSAGCO | TRITURCO |
---|---|---|---|---|---|
279 | 729 | 1973 | 540 | 1330 | 136 |
This model output gives us accumulated mm and mm per time step. We need to calcuate flowrates in cms. The ReadLdasoutWb returns the basin area as a (geogrid) cell count, and since we know the cellsize to be 1km, we can calculate flowrate as a volume.
basList <- unique(modLdasout$Station)
modLdasout$q_cms <- NA
for (i in 1:length(basList)) {
basarea <- attributes(modLdasout)$area_cellcnt[[basList[i]]]
timestep <- as.integer(difftime(modLdasout$POSIXct[2], modLdasout$POSIXct[1], units="secs"))
# Conversion: 1000 = mm * km^2 to m^3
modLdasout$q_cms[modLdasout$Station==basList[i]] <-
with(subset(modLdasout, modLdasout$Station==basList[i]),
(DEL_SFCRNOFF+DEL_UGDRNOFF) * basarea / timestep * 1000)
rm(basarea, timestep)
}
Conversion to daily volume in acre-ft.
modLdasout$qvol_acft <- modLdasout$q_cms * 86400 * 0.3048^3 / 43560
Calculate cumulative volume for each water year.
wyList <- unique(modLdasout$wy)
basList <- unique(modLdasout$Station)
modLdasout$cumqvol_acft <- 0
for (i in 1:length(basList)) {
tmpgage <- subset(modLdasout, modLdasout$Station==basList[i])
for (j in 1:length(wyList)) {
tmpgagewy <- subset(tmpgage, tmpgage$wy==wyList[j])
modLdasout$cumqvol_acft[modLdasout$Station==basList[i] &
modLdasout$wy==wyList[j]] <- CumsumNa(tmpgagewy$qvol_acft)
rm(tmpgagewy)
}
rm(tmpgage)
}
Compare hydrographs for a single basin.
stnid <- "ALATERCO"
PlotFluxCompare(subset(obsStr, obsStr$Station==stnid), "q_cms",
subset(modLdasout, modLdasout$Station==stnid), "q_cms",
labelObs=paste0("Observed at ", stnid), labelMod1="Model",
title=paste0("Streamflow: ", attributes(obsStr)$gage_name[[stnid]]))
Or create a loop to output PNGs for each basin.
for (i in 1:length(basList)) {
png(paste0(plotPath, "/hydro_wy2014_", basList[i], ".png"), width = 700, height = 350)
PlotFluxCompare(subset(obsStr, obsStr$Station==basList[i]), "q_cms",
subset(modLdasout, modLdasout$Station==basList[i]), "q_cms",
labelObs=paste0("Observed at ", basList[i]), labelMod1="Model",
title=paste0("Streamflow: ", attributes(obsStr)$gage_name[[basList[i]]]))
dev.off()
}
We can aggregate the observed data to a daily timestep to match the model.
obsStr$date <- as.Date(trunc(as.POSIXct(format(obsStr$POSIXct, tz="UTC"), tz="UTC"), "days"))
obsStr.dy <- plyr::ddply(obsStr, plyr::.(Station, date),
plyr::summarise, mean_qcms=mean(q_cms, na.rm=TRUE),
.parallel=TRUE)
# Unit conversion: m^3/s -> m^3/dy -> ft^3/dy -> ac-ft/dy
obsStr.dy$qvol_acft <- obsStr.dy$mean_qcms * 86400 * 0.3048^3 / 43560
Let’s add a POSIXct column for ease of calculations and plotting. We’ll associate daily values with the NEXT day’s 00:00 to match the model output.
obsStr.dy$POSIXct <- as.POSIXct(paste0(obsStr.dy$date+1," 00:00",
format="%Y-%m-%d %H:%M", tz="UTC"))
And we can calculate a cumulative volume for each water year
obsStr.dy$wy <- CalcWaterYear(obsStr.dy$POSIXct)
wyList <- unique(obsStr.dy$wy)
gageList <- unique(obsStr.dy$Station)
obsStr.dy$cumqvol_acft <- 0
for (i in 1:length(gageList)) {
tmpgage <- subset(obsStr.dy, obsStr.dy$Station==gageList[i])
for (j in 1:length(wyList)) {
tmpgagewy <- subset(tmpgage, tmpgage$wy==wyList[j])
obsStr.dy$cumqvol_acft[obsStr.dy$Station==gageList[i] &
obsStr.dy$wy==wyList[j]] <- CumsumNa(tmpgagewy$qvol_acft)
rm(tmpgagewy)
}
rm(tmpgage)
}
Plot all observed cumulative flows for the 2014 water year
n<-2014
ggplot(subset(obsStr.dy, obsStr.dy$wy==n), aes(x=POSIXct, y=cumqvol_acft, color=Station)) + geom_line()
And plot modelled.
ggplot(subset(modLdasout, modLdasout$wy==n), aes(x=POSIXct, y=cumqvol_acft, color=Station)) + geom_line()
Compare cumulative flow plots for all water years for a specific station
stnid <- "CONMOGCO"
ggplot(NULL, aes(x=POSIXct, y=cumqvol_acft)) +
geom_line(data=subset(modLdasout, modLdasout$Station==stnid), aes(color='Model')) +
geom_line(data=subset(obsStr.dy, obsStr.dy$Station==stnid & obsStr.dy$wy %in% unique(modLdasout$wy)),
aes(color='Observed')) +
scale_colour_discrete("")
Let’s create a function to plot by station and water year.
PlotCumFlow <- function(stnid, wyid) {
gg <- ggplot(NULL, aes(x=POSIXct, y=cumqvol_acft)) +
geom_line(data=subset(modLdasout, modLdasout$Station==stnid & modLdasout$wy==wyid), aes(color='Model')) +
geom_line(data=subset(obsStr.dy, obsStr.dy$Station==stnid & obsStr.dy$wy==wyid), aes(color='Observed')) +
scale_colour_discrete("") +
labs(x="Date", y="Cumulative Flow Volume (acre-ft)") +
ggtitle(paste0("Cumulative Flow Volume: ", stnid, "\nWY ", wyid)) +
theme(plot.title = element_text(face="bold", vjust=1))
return(gg)
}
Output PNGs for every station and water year
basList <- unique(modLdasout$Station)
wyList <- unique(modLdasout$wy)
for (i in 1:length(basList)) {
for (j in 1:length(wyList)) {
gg <- PlotCumFlow(basList[i], wyList[j])
ggsave(filename=paste0(plotPath, "/cumvol_wy", wyList[j],"_", basList[i], ".png"), plot=gg,
units="in", width=6, height=4, dpi=200)
}
}
We can aggregate the observed data to a monthly timestep in acre-ft.
obsStr$mo <- as.integer(format(obsStr$POSIXct, "%m", tz="UTC"))
obsStr$yr <- as.integer(format(obsStr$POSIXct, "%Y", tz="UTC"))
obsStr.mo <- plyr::ddply(obsStr, plyr::.(Station, yr, mo),
plyr::summarise, mean_qcms=mean(q_cms, na.rm=TRUE),
.parallel=TRUE)
# Unit conversion: m^3/s -> m^3/mo -> ft^3/mo -> ac-ft/mo
obsStr.mo$qvol_acft <- obsStr.mo$mean_qcms * 86400 *
CalcMonthDays(obsStr.mo$mo, obsStr.mo$yr) /
0.3048^3 / 43560
Which yields a new dataframe of monthly values:
head(obsStr.mo)
Station | yr | mo | mean_qcms | qvol_acft |
---|---|---|---|---|
ALATERCO | 2004 | 1 | 0.0000000 | 0.000 |
ALATERCO | 2004 | 2 | 0.0000000 | 0.000 |
ALATERCO | 2004 | 3 | 0.7099602 | 1541.618 |
ALATERCO | 2004 | 4 | 2.5315292 | 5319.676 |
ALATERCO | 2004 | 5 | 12.5035053 | 27150.289 |
ALATERCO | 2004 | 6 | 8.5606842 | 17989.153 |
Let’s add a POSIXct column and a water year column for ease of plotting. We’ll associate monthly vaues with the 1st day of each month for plotting.
obsStr.mo$POSIXct <- as.POSIXct(paste0(obsStr.mo$yr,"-",obsStr.mo$mo,"-01",
format="%Y-%m-%d", tz="UTC"))
obsStr.mo$wy <- CalcWaterYear(obsStr.mo$POSIXct)
Also aggregate the model output to a monthly timestep in acre-ft.
modLdasout$mo <- as.integer(format(modLdasout$POSIXct, "%m"))
modLdasout$yr <- as.integer(format(modLdasout$POSIXct, "%Y"))
modLdasout.mo <- plyr::ddply(modLdasout, plyr::.(Station, yr, mo),
plyr::summarise, mean_qcms=mean(q_cms, na.rm=TRUE),
.parallel=TRUE)
# Unit conversion: m^3/s -> m^3/mo -> ft^3/mo -> ac-ft/mo
modLdasout.mo$qvol_acft <- modLdasout.mo$mean_qcms * 86400 *
CalcMonthDays(modLdasout.mo$mo, modLdasout.mo$yr) /
0.3048^3 / 43560
Which yields a new dataframe of monthly values:
head(modLdasout.mo)
Station | yr | mo | mean_qcms | qvol_acft |
---|---|---|---|---|
ALATERCO | 2013 | 10 | 3.534417 | 7674.682 |
ALATERCO | 2013 | 11 | 2.819171 | 5924.117 |
ALATERCO | 2013 | 12 | 1.946540 | 4226.745 |
ALATERCO | 2014 | 1 | 1.315127 | 2855.686 |
ALATERCO | 2014 | 2 | 1.256151 | 2463.661 |
ALATERCO | 2014 | 3 | 3.547275 | 7702.603 |
Again, add POSIXct and water year columns column for ease of plotting, associating monthly vaues with the 1st day of each month.
modLdasout.mo$POSIXct <- as.POSIXct(paste0(modLdasout.mo$yr,"-",modLdasout.mo$mo,"-01",
format="%Y-%m-%d", tz="UTC"))
modLdasout.mo$wy <- CalcWaterYear(modLdasout.mo$POSIXct)
Now we can plot comparisons. We’ll create a simple function to automate this for a specified station.
PlotMoVolBasin <- function(stnid) {
gg <- ggplot(NULL, aes(x=POSIXct, y=qvol_acft)) +
geom_line(data=subset(modLdasout.mo, modLdasout.mo$Station==stnid), aes(color='Model')) +
geom_line(data=subset(obsStr.mo, obsStr.mo$Station==stnid &
obsStr.mo$POSIXct>=min(modLdasout.mo$POSIXct) &
obsStr.mo$POSIXct<=max(modLdasout.mo$POSIXct)),
aes(color='Observed')) +
scale_colour_discrete("") +
labs(x="Date", y="Monthly Flow Volume (acre-ft)") +
ggtitle(paste0("Monthly Flow Volume: ", stnid)) +
theme(plot.title = element_text(face="bold", vjust=1))
return(gg)
}
Then we can plot to graphic:
PlotMoVolBasin("ALATERCO")
Or plot to PNG file in batch:
for (i in 1:length(basList)) {
gg <- PlotMoVolBasin(basList[i])
ggsave(filename=paste0(plotPath, "/qvol_wy2014_", basList[i], ".png"), plot=gg,
units="in", width=6, height=4, dpi=200)
}
Or plot by water year for all basins in one image:
PlotMoVolWY <- function(wyid) {
gg <- ggplot(NULL, aes(x=POSIXct, y=qvol_acft)) +
geom_line(data=subset(modLdasout.mo, modLdasout.mo$wy==wyid), aes(color='Model')) +
geom_line(data=subset(obsStr.mo, obsStr.mo$wy==wyid), aes(color='Observed')) +
facet_wrap(~Station) +
scale_colour_discrete("") +
labs(x="Date", y="Monthly Flow Volume (acre-ft)") +
ggtitle(paste0("Monthly Flow Volume: WY ", wyid)) +
theme(plot.title = element_text(face="bold", vjust=1))
return(gg)
}
PlotMoVolWY(2014)
We use the CalModPerfMulti tool to generate statistics for each gage, then we stack the gage stat rows into a dataframe.
perfStats <- data.frame()
for (i in 1:length(basList)) {
out <- CalcModPerfMulti( subset(modLdasout, modLdasout$Station==basList[i]),
subset(obsStr, obsStr$Station==basList[i]) )
out$Station <- basList[i]
perfStats <- rbind(perfStats, out)
}
## Warning in cor(flxDf.mod.min10$qcomp.mod, flxDf.mod.min10$qcomp.obs, use = "na.or.complete"): the standard deviation is zero
## Warning in cor(flxDf.mod.min10$qcomp.mod, flxDf.mod.min10$qcomp.obs, use = "na.or.complete"): the standard deviation is zero
perfStats
## Warning: package 'pander' was built under R version 3.1.2
t_n | t_nse | t_nselog | t_cor | t_rmse | t_rmsenorm |
---|---|---|---|---|---|
364 | 0.34 | -0.31 | 0.69 | 2.93 | 15.11 |
363 | 0.01 | -0.43 | 0.37 | 8.21 | 14.98 |
364 | 0.13 | -0.31 | 0.81 | 18.48 | 21.03 |
364 | -0.2 | -0.47 | 0.78 | 8.3 | 20.08 |
364 | -15.77 | -3.03 | 0.04 | 7.06 | 91.36 |
364 | -42.57 | -3.28 | 0.71 | 2.73 | 126.1 |
t_bias | t_mae | t_errfdc | dy_n | dy_nse | dy_nselog |
---|---|---|---|---|---|
54.9 | 2.27 | 1.32 | 364 | 0.34 | -0.31 |
-2.8 | 5.66 | 0.23 | 363 | 0.01 | -0.43 |
80.6 | 14.05 | 11.3 | 364 | 0.13 | -0.31 |
97.2 | 5.96 | 4.13 | 364 | -0.2 | -0.47 |
142.5 | 4.51 | 3.14 | 364 | -15.77 | -3.03 |
477.2 | 1.78 | 1.34 | 364 | -42.57 | -3.28 |
dy_cor | dy_rmse | dy_rmsenorm | dy_bias | dy_mae |
---|---|---|---|---|
0.69 | 2.93 | 15.11 | 54.9 | 2.27 |
0.37 | 8.21 | 14.98 | -2.8 | 5.66 |
0.81 | 18.48 | 21.03 | 80.6 | 14.05 |
0.78 | 8.3 | 20.08 | 97.2 | 5.96 |
0.04 | 7.06 | 91.36 | 142.5 | 4.51 |
0.71 | 2.73 | 126.1 | 477.2 | 1.78 |
dy_errcom | dy_errmaxt | dy_errfdc | mo_n | mo_nse |
---|---|---|---|---|
0 | 0 | 1.32 | 12 | 0.27 |
0 | 0 | 0.23 | 12 | -0.06 |
0 | 0 | 11.3 | 12 | 0.11 |
0 | 0 | 4.13 | 12 | -0.34 |
0 | 0 | 3.14 | 12 | -18.63 |
0 | 0 | 1.34 | 12 | -44.56 |
mo_nselog | mo_cor | mo_rmse | mo_rmsenorm | mo_bias |
---|---|---|---|---|
-0.19 | 0.7 | 2.54 | 29.85 | 55.3 |
-0.24 | 0.38 | 6.92 | 34.49 | -2.2 |
-0.23 | 0.83 | 16.73 | 29.49 | 80.9 |
-0.32 | 0.83 | 7.22 | 37.77 | 97.2 |
-3.65 | 0.02 | 6.31 | 149.3 | 142.7 |
-3.82 | 0.7 | 2.4 | 192.3 | 475.2 |
mo_mae | mo_errcom | mo_errmaxt | yr_n | yr_bias | yr_mae |
---|---|---|---|---|---|
1.93 | -0.42 | 3.58 | 1 | 54.9 | 1.23 |
5.23 | 0 | 7.67 | 1 | -2.8 | 0.2 |
13.34 | -0.58 | 5.17 | 1 | 80.6 | 12.49 |
5.81 | -0.22 | 8.42 | 1 | 97.2 | 4.84 |
4.22 | 0.83 | 1.67 | 1 | 142.5 | 3.9 |
1.77 | -0.42 | 0.42 | 1 | 477.2 | 1.78 |
yr_errcom | yr_errmaxt | max10_n | max10_nse | max10_nselog |
---|---|---|---|---|
-38 | -34 | 36 | -0.66 | -1.73 |
-44 | -34 | 37 | -3.91 | -12.36 |
-32 | -35 | 37 | 0.16 | 0.14 |
-26 | -34 | 37 | -4.35 | -3.73 |
3 | 112 | 37 | -9.96 | -14.09 |
-8 | -6 | 37 | -184.4 | -15.85 |
max10_cor | max10_rmse | max10_rmsenorm | max10_bias |
---|---|---|---|
0.44 | 4.46 | 37.19 | -25.8 |
-0.06 | 18.41 | 49.13 | -53.4 |
0.69 | 12.11 | 28.88 | 5.3 |
-0.07 | 15.27 | 59.83 | 27.1 |
0.33 | 3.13 | 115 | 3 |
0.35 | 6.34 | 442.4 | 332 |
max10_mae | min10_n | min10_nse | min10_nselog | min10_cor |
---|---|---|---|---|
3.97 | 112 | -Inf | -Inf | NA |
16.65 | 37 | -708.2 | -76.74 | 0.18 |
8.17 | 115 | -26719173 | -89523 | -0.61 |
13.06 | 120 | -Inf | -Inf | NA |
2.69 | 37 | -4398 | -121.9 | -0.08 |
4.73 | 40 | -3500 | -139.8 | -0.07 |
min10_rmse | min10_rmsenorm | min10_bias | min10_mae | Station |
---|---|---|---|---|
1.76 | Inf | 4807 | 1.67 | ALATERCO |
5.38 | 523.5 | 328.8 | 4.9 | CONMOGCO |
13.89 | 213209 | 6886 | 13.26 | RIOWAGCO |
5.25 | Inf | Inf | 4.87 | RIOSFKCO |
8.99 | 1175 | 812.4 | 7.64 | SAGSAGCO |
0.57 | 1788 | 1311 | 0.56 | TRITURCO |