Commit da0aef74 authored by aho's avatar aho
Browse files

Merge branch 'develop-ACC' into 'master'

Develop acc

See merge request !40
parents 9edfc681 bed79371
Pipeline #5076 passed with stage
in 2 minutes and 59 seconds
# Generated by roxygen2: do not edit by hand
export(ACC)
export(AMV)
export(AnimateMap)
export(Ano)
......@@ -27,6 +28,7 @@ export(LeapYear)
export(Load)
export(MeanDims)
export(Persistence)
export(PlotACC)
export(PlotAno)
export(PlotClim)
export(PlotEquiMap)
......@@ -91,6 +93,8 @@ importFrom(stats,pf)
importFrom(stats,pt)
importFrom(stats,qchisq)
importFrom(stats,qnorm)
importFrom(stats,qt)
importFrom(stats,quantile)
importFrom(stats,rnorm)
importFrom(stats,sd)
importFrom(stats,ts)
......
This diff is collapsed.
#'Plot Plumes/Timeseries Of Anomaly Correlation Coefficients
#'
#'Plots plumes/timeseries of ACC from an array with dimensions
#'(output from \code{ACC()}): \cr
#'c(nexp, nobs, nsdates, nltime, 4)\cr
#'where the fourth dimension is of length 4 and contains the lower limit of
#'the 95\% confidence interval, the ACC, the upper limit of the 95\%
#'confidence interval and the 95\% significance level given by a one-sided
#'T-test.
#'
#'@param ACC An ACC array with with dimensions:\cr
#' c(nexp, nobs, nsdates, nltime, 4)\cr
#' with the fourth dimension of length 4 containing the lower limit of the
#' 95\% confidence interval, the ACC, the upper limit of the 95\% confidence
#' interval and the 95\% significance level.
#'@param sdates A character vector of startdates: c('YYYYMMDD','YYYYMMDD').
#'@param toptitle A character string of the main title, optional.
#'@param sizetit A multiplicative factor to scale title size, optional.
#'@param ytitle A character string of the title of Y-axis for each experiment:
#' c('', ''), optional.
#'@param limits A numeric vector c(lower limit, upper limit): limits of the
#' Y-axis, optional.
#'@param legends A character vector of flags to be written in the legend,
#' optional.
#'@param freq A integer: 1 = yearly, 12 = monthly, 4 = seasonal, ... Default: 12.
#'@param biglab A logical value for presentation/paper plot, Default = FALSE.
#'@param fill A logical value if filled confidence interval. Default = FALSE.
#'@param linezero A logical value if a line at y=0 should be added. Default = FALSE.
#'@param points A logical value if points instead of lines. Default = TRUE.\cr
#' Must be TRUE if only 1 leadtime.
#'@param vlines A vector of x location where to add vertical black lines, optional.
#'@param fileout A character string of the output file name. Extensions allowed:
#' eps/ps, jpeg, png, pdf, bmp and tiff. Default is NULL.
#'@param width A numeric of the file width, in the units specified in the
#' parameter size_units (inches by default). Takes 8 by default.
#'@param height A numeric of the file height, in the units specified in the parameter
#' size_units (inches by default). Takes 5 by default.
#'@param size_units A character string of the units of the size of the device
#' (file or window) to plot in. Inches ('in') by default. See ?Devices and the
#' creator function of the corresponding device.
#'@param res Resolution of the device (file or window) to plot in. See
#' ?Devices and the creator function of the corresponding device.
#'@param \dots Arguments to be passed to the method. Only accepts the following
#' graphical parameters:\cr
#' adj ann ask bg bty cex.sub cin col.axis col.lab col.main col.sub cra crt
#' csi cxy err family fg fig fin font font.axis font.lab font.main font.sub
#' lend lheight ljoin lmitre mar mex mfcol mfrow mfg mkh oma omd omi page
#' plt smo srt tck tcl usr xaxp xaxs xaxt xlog xpd yaxp yaxs yaxt ylbias ylog\cr
#' For more information about the parameters see `par`.
#'
#'@examples
#' \dontshow{
#'startDates <- c('19851101', '19901101', '19951101', '20001101', '20051101')
#'sampleData <- s2dv:::.LoadSampleData('tos', c('experiment'),
#' c('observation'), startDates,
#' leadtimemin = 1,
#' leadtimemax = 4,
#' output = 'lonlat',
#' latmin = 27, latmax = 48,
#' lonmin = -12, lonmax = 40)
#' }
#'sampleData$mod <- Season(sampleData$mod, monini = 11, moninf = 12, monsup = 2)
#'sampleData$obs <- Season(sampleData$obs, monini = 11, moninf = 12, monsup = 2)
#'clim <- Clim(sampleData$mod, sampleData$obs)
#'ano_exp <- Ano(sampleData$mod, clim$clim_exp)
#'ano_obs <- Ano(sampleData$obs, clim$clim_obs)
#'acc <- ACC(ano_exp, ano_obs)
#'acc_bootstrap <- ACC(ano_exp, ano_obs, conftype = 'bootstrap')
#'# Combine acc results for PlotACC
#'res <- array(c(acc$conf.lower, acc$acc, acc$conf.upper, acc$p.val),
#' dim = c(dim(acc$acc), 4))
#'res_bootstrap <- array(c(acc$acc_conf.lower, acc$acc, acc$acc_conf.upper, acc$p.val),
#' dim = c(dim(acc$acc), 4))
#' \donttest{
#'PlotACC(res, startDates)
#'PlotACC(res_bootstrap, startDates)
#' }
#'@importFrom grDevices dev.cur dev.new dev.off
#'@importFrom stats ts
#'@export
PlotACC <- function(ACC, sdates, toptitle = "", sizetit = 1, ytitle = "",
limits = NULL, legends = NULL, freq = 12, biglab = FALSE,
fill = FALSE, linezero = FALSE, points = TRUE, vlines = NULL,
fileout = NULL,
width = 8, height = 5, size_units = 'in', res = 100, ...) {
# Process the user graphical parameters that may be passed in the call
## Graphical parameters to exclude
excludedArgs <- c("cex", "cex.axis", "cex.lab", "cex.main", "col", "lab", "las", "lty", "lwd", "mai", "mgp", "new", "pch", "pin", "ps", "pty")
userArgs <- .FilterUserGraphicArgs(excludedArgs, ...)
# If there is any filenames to store the graphics, process them
# to select the right device
if (!is.null(fileout)) {
deviceInfo <- .SelectDevice(fileout = fileout, width = width, height = height, units = size_units, res = res)
saveToFile <- deviceInfo$fun
fileout <- deviceInfo$files
}
#
if (length(dim(ACC)) != 5 | dim(ACC)[5] != 4) {
stop("5 dim needed : c(nexp, nobs, nsdates, nltime, 4)")
}
nexp <- dim(ACC)[1]
nobs <- dim(ACC)[2]
nleadtime <- dim(ACC)[4]
nsdates <- dim(ACC)[3]
if (is.null(limits) == TRUE) {
ll <- min(ACC, na.rm = TRUE)
ul <- max(ACC, na.rm = TRUE)
if (biglab) {
ul <- ul + 0.3 * (ul - ll)
} else {
ul <- ul + 0.2 * (ul - ll)
}
} else {
ll <- limits[1]
ul <- limits[2]
}
yearinit <- as.integer(substr(sdates[1], 1, 4))
moninit <- as.integer(substr(sdates[1], 5, 6))
lastyear <- as.integer(substr(sdates[nsdates], 1, 4)) + (moninit + (
nleadtime - 1) * 12 / freq - 1) %/% 12
lastmonth <- (moninit + (nleadtime - 1) * (12 / freq) - 1) %% 12 + 1
empty_ts <- ts(start = c(yearinit, (moninit - 1) %/% (12 / freq) + 1),
end = c(lastyear, (lastmonth - 1) %/% (12 / freq) + 1),
frequency = freq)
color <- c("red4", "dodgerblue4", "lightgoldenrod4", "deeppink4",
"mediumpurple4", "green4", "orange4", "lightblue4", "mediumorchid4",
"olivedrab4")
colorblock <- c("red1", "dodgerblue1", "lightgoldenrod1", "deeppink1",
"mediumpurple1", "green1", "orange1", "lightblue1",
"mediumorchid1", "olivedrab1")
# Open connection to graphical device
if (!is.null(fileout)) {
saveToFile(fileout)
} else if (names(dev.cur()) == 'null device') {
dev.new(units = size_units, res = res, width = width, height = height)
}
# Load the user parameters
par(userArgs)
if (biglab) {
par(mai = c(1, 1.1, 0.5, 0), mgp = c(2.8, 0.9, 0))
par(cex = 1.3, cex.lab = 2, cex.axis = 1.8)
cexmain <- 2.2
legsize <- 1.5
} else {
par(mai = c(0.8, 0.8, 0.5, 0.1), mgp = c(2, 0.5, 0))
par(cex = 1.3, cex.lab = 1.5, cex.axis = 1.1)
cexmain <- 1.5
legsize <- 1
}
plot(empty_ts, ylim = c(ll, ul), xlab = "Time (years)", ylab = ytitle,
main = toptitle, cex.main = cexmain * sizetit)
for (jexp in 1:nexp) {
for (jobs in 1:nobs) {
numcol <- jobs + (jexp - 1) * nobs
for (jdate in 1:nsdates) {
year0 <- as.integer(substr(sdates[jdate], 1, 4))
mon0 <- as.integer(substr(sdates[jdate], 5, 6))
start <- (year0 - yearinit) * freq + 1
end <- start + nleadtime - 1
var <- array(dim = c(3, length(empty_ts)))
var[, start:end] <- t(ACC[jexp, jobs, jdate, , 1:3])
if (fill) {
par(new = TRUE)
bordup <- ACC[jexp, jobs, jdate, , 3]
borddown <- ACC[jexp, jobs, jdate, , 1]
tmp <- c(start:end)
xout <- is.na(bordup + borddown)
tmp <- tmp[which(xout == FALSE)]
xx <- c(tmp, rev(tmp))
bordup <- bordup[which(xout == FALSE)]
borddown <- borddown[which(xout == FALSE)]
yy <- c(bordup, rev(borddown))
if (jdate == 1) {
matplot(t(var), type = "l", lty = 1, lwd = 1, ylim = c(ll, ul),
col = color[numcol], xlab = "", ylab = "", axes = FALSE)
}
polygon(xx, yy, col = colorblock[numcol], border = NA)
}
if (points) {
par(new = TRUE)
plot(var[2, ], type = "p", lty = 1, lwd = 6, ylim = c(ll, ul),
col = color[numcol], xlab = "", ylab = "", axes = FALSE,
cex = 0.6)
par(new = TRUE)
plot(var[1, ], type = "p", pch = 6, lwd = 3, ylim = c(ll, ul),
col = color[numcol], xlab = "", ylab = "", axes = FALSE,
cex = 0.6)
par(new = TRUE)
plot(var[3, ], type = "p", pch = 2, lwd = 3, ylim = c(ll, ul),
col = color[numcol], xlab = "", ylab = "", axes = FALSE,
cex = 0.6)
par(new = TRUE)
for (jind in start:end) {
lines(c(jind, jind), var[c(1, 3), jind], lwd = 1,
ylim = c(ll, ul), col = color[numcol], xlab = "",
ylab = "", axes = FALSE)
}
} else {
par(new = TRUE)
plot(var[2, ], type = "l", lty = 1, lwd = 4, ylim = c(ll, ul),
col = color[numcol], xlab = "", ylab = "", axes = FALSE)
par(new = TRUE)
plot(var[1, ], type = "l", lty = 1, lwd = 1, ylim = c(ll, ul),
col = color[numcol], xlab = "", ylab = "", axes = FALSE)
par(new = TRUE)
plot(var[3, ], type = "l", lty = 1, lwd = 1, ylim = c(ll, ul),
col = color[numcol], xlab = "", ylab = "", axes = FALSE)
}
}
}
}
if (linezero) {
abline(h = 0, col = "black")
}
if (is.null(vlines) == FALSE) {
for (x in vlines) {
abline(v = x, col = "black")
}
}
if (is.null(legends) == FALSE) {
if (points) {
legend(0, ul, legends[1:(nobs * nexp)], lty = 3, lwd = 10,
col = color[1:(nobs * nexp)], cex = legsize)
} else {
legend(0, ul, legends[1:(nobs * nexp)], lty = 1, lwd = 4,
col = color[1:(nobs * nexp)], cex = legsize)
}
}
# If the graphic was saved to file, close the connection with the device
if(!is.null(fileout)) dev.off()
}
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/ACC.R
\name{ACC}
\alias{ACC}
\title{Compute the anomaly correlation coefficient between the forecast and corresponding observation}
\usage{
ACC(exp, obs, dat_dim = "dataset", space_dim = c("lat", "lon"),
avg_dim = "sdate", memb_dim = "member", lat = NULL, lon = NULL,
lonlatbox = NULL, conf = TRUE, conftype = "parametric",
conf.lev = 0.95, pval = TRUE, ncores = NULL)
}
\arguments{
\item{exp}{A numeric array of experimental anomalies with named dimensions.
It must have at least 'dat_dim' and 'space_dim'.}
\item{obs}{A numeric array of observational anomalies with named dimensions.
It must have the same dimensions as 'exp' except the length of 'dat_dim'
and 'memb_dim'.}
\item{dat_dim}{A character string indicating the name of dataset (nobs/nexp)
dimension. The default value is 'dataset'.}
\item{space_dim}{A character string vector of 2 indicating the name of the
latitude and longitude dimensions (in order) along which ACC is computed.
The default value is c('lat', 'lon').}
\item{avg_dim}{A character string indicating the name of the dimension to be
averaged. It must be one of 'time_dim'. The mean ACC is calculated along
averaged. If no need to calculate mean ACC, set as NULL. The default value
is 'sdate'.}
\item{memb_dim}{A character string indicating the name of the member
dimension. If the data are not ensemble ones, set as NULL. The default
value is 'member'.}
\item{lat}{A vector of the latitudes of the exp/obs grids. Only required when
the domain of interested is specified. The default value is NULL.}
\item{lon}{A vector of the longitudes of the exp/obs grids. Only required when
the domain of interested is specified. The default value is NULL.}
\item{lonlatbox}{A numeric vector of 4 indicating the corners of the domain of
interested: c(lonmin, lonmax, latmin, latmax). Only required when the domain
of interested is specified. The default value is NULL.}
\item{conf}{A logical value indicating whether to retrieve the confidence
intervals or not. The default value is TRUE.}
\item{conftype}{A charater string of "parametric" or "bootstrap".
"parametric" provides a confidence interval for the ACC computed by a
Fisher transformation and a significance level for the ACC from a one-sided
student-T distribution. "bootstrap" provides a confidence interval for the
ACC and MACC computed from bootstrapping on the members with 100 drawings
with replacement. To guarantee the statistical robustness of the result,
make sure that your experiment and observation always have the same number
of members. "bootstrap" requires 'memb_dim' has value. The default value is
'parametric'.}
\item{conf.lev}{A numeric indicating the confidence level for the
regression computation. The default value is 0.95.}
\item{pval}{A logical value indicating whether to compute the p-value or not.
The default value is TRUE.}
\item{ncores}{An integer indicating the number of cores to use for parallel
computation. The default value is NULL.}
}
\value{
A list containing the numeric arrays:\cr
\item{acc}{
The ACC with the dimensions c(nexp, nobs, the rest of the dimension except
space_dim and memb_dim). nexp is the number of experiment (i.e., dat_dim in
exp), and nobs is the number of observation (i.e., dat_dim in obs).
}
\item{conf.lower (if conftype = "parametric") or acc_conf.lower (if
conftype = "bootstrap")}{
The lower confidence interval of ACC with the same dimensions as ACC. Only
present if \code{conf = TRUE}.
}
\item{conf.upper (if conftype = "parametric") or acc_conf.upper (if
conftype = "bootstrap")}{
The upper confidence interval of ACC with the same dimensions as ACC. Only
present if \code{conf = TRUE}.
}
\item{p.val}{
The p-value with the same dimensions as ACC. Only present if
\code{pval = TRUE} and code{conftype = "parametric"}.
}
\item{macc}{
The mean anomaly correlation coefficient with dimensions
c(nexp, nobs, the rest of the dimension except space_dim, memb_dim, and
avg_dim). Only present if 'avg_dim' is not NULL.
}
\item{macc_conf.lower}{
The lower confidence interval of MACC with the same dimensions as MACC.
Only present if \code{conftype = "bootstrap"}.
}
\item{macc_conf.upper}{
The upper confidence interval of MACC with the same dimensions as MACC.
Only present if \code{conftype = "bootstrap"}.
}
}
\description{
Calculate the anomaly correlation coefficient for the ensemble mean of each
model and the corresponding references over a spatial domain. It can return a
forecast time series if the data contain forest time dimension, and also the
start date mean if the data contain start date dimension.
The domain of interest can be specified by providing the list
of longitudes/latitudes (lon/lat) of the data together with the corners
of the domain: lonlatbox = c(lonmin, lonmax, latmin, latmax).
}
\examples{
\dontshow{
startDates <- c('19851101', '19901101', '19951101', '20001101', '20051101')
sampleData <- s2dv:::.LoadSampleData('tos', c('experiment'),
c('observation'), startDates,
leadtimemin = 1,
leadtimemax = 4,
output = 'lonlat',
latmin = 27, latmax = 48,
lonmin = -12, lonmax = 40)
}
sampleData$mod <- Season(sampleData$mod, monini = 11, moninf = 12, monsup = 2)
sampleData$obs <- Season(sampleData$obs, monini = 11, moninf = 12, monsup = 2)
clim <- Clim(sampleData$mod, sampleData$obs)
ano_exp <- Ano(sampleData$mod, clim$clim_exp)
ano_obs <- Ano(sampleData$obs, clim$clim_obs)
acc <- ACC(ano_exp, ano_obs)
acc_bootstrap <- ACC(ano_exp, ano_obs, conftype = 'bootstrap')
# Combine acc results for PlotACC
res <- array(c(acc$conf.lower, acc$acc, acc$conf.upper, acc$p.val),
dim = c(dim(acc$acc), 4))
res_bootstrap <- array(c(acc$acc_conf.lower, acc$acc, acc$acc_conf.upper, acc$p.val),
dim = c(dim(acc$acc), 4))
\donttest{
PlotACC(res, startDates)
PlotACC(res_bootstrap, startDates)
}
}
\references{
Joliffe and Stephenson (2012). Forecast Verification: A
Practitioner's Guide in Atmospheric Science. Wiley-Blackwell.
}
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/PlotACC.R
\name{PlotACC}
\alias{PlotACC}
\title{Plot Plumes/Timeseries Of Anomaly Correlation Coefficients}
\usage{
PlotACC(ACC, sdates, toptitle = "", sizetit = 1, ytitle = "",
limits = NULL, legends = NULL, freq = 12, biglab = FALSE,
fill = FALSE, linezero = FALSE, points = TRUE, vlines = NULL,
fileout = NULL, width = 8, height = 5, size_units = "in", res = 100,
...)
}
\arguments{
\item{ACC}{An ACC array with with dimensions:\cr
c(nexp, nobs, nsdates, nltime, 4)\cr
with the fourth dimension of length 4 containing the lower limit of the
95\% confidence interval, the ACC, the upper limit of the 95\% confidence
interval and the 95\% significance level.}
\item{sdates}{A character vector of startdates: c('YYYYMMDD','YYYYMMDD').}
\item{toptitle}{A character string of the main title, optional.}
\item{sizetit}{A multiplicative factor to scale title size, optional.}
\item{ytitle}{A character string of the title of Y-axis for each experiment:
c('', ''), optional.}
\item{limits}{A numeric vector c(lower limit, upper limit): limits of the
Y-axis, optional.}
\item{legends}{A character vector of flags to be written in the legend,
optional.}
\item{freq}{A integer: 1 = yearly, 12 = monthly, 4 = seasonal, ... Default: 12.}
\item{biglab}{A logical value for presentation/paper plot, Default = FALSE.}
\item{fill}{A logical value if filled confidence interval. Default = FALSE.}
\item{linezero}{A logical value if a line at y=0 should be added. Default = FALSE.}
\item{points}{A logical value if points instead of lines. Default = TRUE.\cr
Must be TRUE if only 1 leadtime.}
\item{vlines}{A vector of x location where to add vertical black lines, optional.}
\item{fileout}{A character string of the output file name. Extensions allowed:
eps/ps, jpeg, png, pdf, bmp and tiff. Default is NULL.}
\item{width}{A numeric of the file width, in the units specified in the
parameter size_units (inches by default). Takes 8 by default.}
\item{height}{A numeric of the file height, in the units specified in the parameter
size_units (inches by default). Takes 5 by default.}
\item{size_units}{A character string of the units of the size of the device
(file or window) to plot in. Inches ('in') by default. See ?Devices and the
creator function of the corresponding device.}
\item{res}{Resolution of the device (file or window) to plot in. See
?Devices and the creator function of the corresponding device.}
\item{\dots}{Arguments to be passed to the method. Only accepts the following
graphical parameters:\cr
adj ann ask bg bty cex.sub cin col.axis col.lab col.main col.sub cra crt
csi cxy err family fg fig fin font font.axis font.lab font.main font.sub
lend lheight ljoin lmitre mar mex mfcol mfrow mfg mkh oma omd omi page
plt smo srt tck tcl usr xaxp xaxs xaxt xlog xpd yaxp yaxs yaxt ylbias ylog\cr
For more information about the parameters see `par`.}
}
\description{
Plots plumes/timeseries of ACC from an array with dimensions
(output from \code{ACC()}): \cr
c(nexp, nobs, nsdates, nltime, 4)\cr
where the fourth dimension is of length 4 and contains the lower limit of
the 95\% confidence interval, the ACC, the upper limit of the 95\%
confidence interval and the 95\% significance level given by a one-sided
T-test.
}
\examples{
\dontshow{
startDates <- c('19851101', '19901101', '19951101', '20001101', '20051101')
sampleData <- s2dv:::.LoadSampleData('tos', c('experiment'),
c('observation'), startDates,
leadtimemin = 1,
leadtimemax = 4,
output = 'lonlat',
latmin = 27, latmax = 48,
lonmin = -12, lonmax = 40)
}
sampleData$mod <- Season(sampleData$mod, monini = 11, moninf = 12, monsup = 2)
sampleData$obs <- Season(sampleData$obs, monini = 11, moninf = 12, monsup = 2)
clim <- Clim(sampleData$mod, sampleData$obs)
ano_exp <- Ano(sampleData$mod, clim$clim_exp)
ano_obs <- Ano(sampleData$obs, clim$clim_obs)
acc <- ACC(ano_exp, ano_obs)
acc_bootstrap <- ACC(ano_exp, ano_obs, conftype = 'bootstrap')
# Combine acc results for PlotACC
res <- array(c(acc$conf.lower, acc$acc, acc$conf.upper, acc$p.val),
dim = c(dim(acc$acc), 4))
res_bootstrap <- array(c(acc$acc_conf.lower, acc$acc, acc$acc_conf.upper, acc$p.val),
dim = c(dim(acc$acc), 4))
\donttest{
PlotACC(res, startDates)
PlotACC(res_bootstrap, startDates)
}
}
context("s2dv::ACC tests")
##############################################
##NOTE: bootstrap is not tested because sample() is used inside.
# dat1
set.seed(1)
exp1 <- array(rnorm(60), dim = c(dataset = 1, member = 2, sdate = 5,
ftime = 1, lat = 2, lon = 3))
set.seed(2)
obs1 <- array(rnorm(30), dim = c(dataset = 1, member = 1, sdate = 5,
ftime = 1, lat = 2, lon = 3))
# dat2
set.seed(1)
exp2 <- array(rnorm(60), dim = c(dataset = 2, sdate = 5,
ftime = 1, lat = 2, lon = 3))
set.seed(2)
obs2 <- array(rnorm(30), dim = c(dataset = 1, sdate = 5,
ftime = 1, lat = 2, lon = 3))
set.seed(2)
na <- floor(runif(2, min = 1, max = 30))
obs2[na] <- NA
##############################################
test_that("1. Input checks", {
expect_error(
ACC(c(), c()),
"Parameter 'exp' and 'obs' cannot be NULL."
)
expect_error(
ACC(c('b'), c('a')),
"Parameter 'exp' and 'obs' must be a numeric array."
)
expect_error(
ACC(c(1:10), c(2:4)),
paste0("Parameter 'exp' and 'obs' must have at least dimensions ",
"dat_dim and space_dim.")
)
expect_error(
ACC(array(1:10, dim = c(2, 5)), array(1:4, dim = c(2, 2))),
"Parameter 'exp' and 'obs' must have dimension names."
)
expect_error(
ACC(array(1:10, dim = c(a = 2, c = 5)), array(1:4, dim = c(a = 2, b = 2))),
"Parameter 'exp' and 'obs' must have same dimension name"
)
expect_error(
ACC(exp1, obs1, dat_dim = 1),
"Parameter 'dat_dim' must be a character string."
)
expect_error(
ACC(exp1, obs1, dat_dim = 'a'),
"Parameter 'dat_dim' is not found in 'exp' or 'obs' dimension."
)
expect_error(
ACC(exp1, obs1, space_dim = c('lon')),
"Parameter 'space_dim' must be a character vector of 2."
)
expect_error(