Regular zoo Series
zooreg.Rdzooreg is the creator for the S3 class "zooreg"
for regular "zoo" series. It inherits from "zoo"
and is the analogue to ts.
Arguments
- data
a numeric vector, matrix or a factor.
- start
the time of the first observation. Either a single number or a vector of two integers, which specify a natural time unit and a (1-based) number of samples into the time unit.
- end
the time of the last observation, specified in the same way as
start.- frequency
the number of observations per unit of time.
- deltat
the fraction of the sampling period between successive observations; e.g., 1/12 for monthly data. Only one of
frequencyordeltatshould be provided.- ts.eps
time series comparison tolerance. Frequencies are considered equal if their absolute difference is less than
ts.eps.- order.by
a vector by which the observations in
xare ordered. If this is specified the argumentsstartandendare ignored andzoo(data, order.by, frequency)is called. Seezoofor more information.- calendar
logical. Should
yearqtroryearmonbe used for a numeric time index with frequency 4 or 12, respectively?
Details
Strictly regular series are those whose time points are equally spaced.
Weakly regular series are strictly regular time series in which some
of the points may have been removed but still have the original
underlying frequency associated with them.
"zooreg" is a subclass of "zoo" that is used to represent both weakly
and strictly regular series. Internally, it is the same as "zoo" except
it also has a "frequency" attribute. Its index class is more restricted
than "zoo". The index: 1. must be numeric or a class which can be coerced
via as.numeric (such as yearmon, yearqtr,
Date, POSIXct, tis,
xts, etc.).
2. when converted to numeric
must be expressible as multiples of 1/frequency. 3.
group generic functions Ops should be defined, i.e.,
adding/subtracting a numeric to/from the index class should produce the correct
value of the index class again.
zooreg is the zoo analogue to ts. The arguments
are almost identical, only in the case where order.by is specified,
zoo is called with zoo(data, order.by, frequency). It
creates a regular series of class "zooreg" which inherits from "zoo".
It is essentially a "zoo" series with an additional "frequency"
attribute. In the creation of "zooreg" objects (via zoo,
zooreg, or coercion functions) it is always check whether the
index specified complies with the frequency specified.
The class "zooreg" offers two advantages over code "ts": 1. The
index does not have to be plain numeric (although that is the default), it just
must be coercible to numeric, thus printing and plotting can be customized.
2. This class can not only represent strictly regular series, but also series
with an underlying regularity, i.e., where some observations from a regular grid
are omitted.
Hence, "zooreg" is a bridge between "ts" and "zoo" and
can be employed to coerce back and forth between the two classes. The coercion
function as.zoo.ts returns therefore an object of class "zooreg"
inheriting from "zoo". Coercion between "zooreg" and "zoo"
is also available and drops or tries to add a frequency respectively.
For checking whether a series is strictly regular or does have an underlying
regularity the generic function is.regular can be used.
Methods to standard generics for regular series such as frequency,
deltat and cycle are available for both "zooreg"
and "zoo" objects. In the latter case, it is checked first (in a data-driven way)
whether the series is in fact regular or not.
as.zooreg.tis has a class argument whose value represents the
class of the index of the zooreg object into which the tis
object is converted. The default value is "ti". Note that the
frequency of the zooreg object will not necessarily be the same
as the frequency of the tis object that it is converted from.
Value
An object of class "zooreg" which inherits from "zoo".
It is essentially a "zoo" series with a "frequency"
attribute.
Examples
## equivalent specifications of a quarterly series
## starting in the second quarter of 1959.
zooreg(1:10, frequency = 4, start = c(1959, 2))
#> 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3
#> 1 2 3 4 5 6 7 8 9 10
as.zoo(ts(1:10, frequency = 4, start = c(1959, 2)))
#> 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3
#> 1 2 3 4 5 6 7 8 9 10
zoo(1:10, seq(1959.25, 1961.5, by = 0.25), frequency = 4)
#> 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3
#> 1 2 3 4 5 6 7 8 9 10
## use yearqtr class for indexing the same series
z <- zoo(1:10, yearqtr(seq(1959.25, 1961.5, by = 0.25)), frequency = 4)
z
#> 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3
#> 1 2 3 4 5 6 7 8 9 10
z[-(3:4)]
#> 1959 Q2 1959 Q3 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3
#> 1 2 5 6 7 8 9 10
## create a regular series with a "Date" index
zooreg(1:5, start = as.Date("2000-01-01"))
#> 2000-01-01 2000-01-02 2000-01-03 2000-01-04 2000-01-05
#> 1 2 3 4 5
## or with "yearmon" index
zooreg(1:5, end = yearmon(2000))
#> Jan 1996 Jan 1997 Jan 1998 Jan 1999 Jan 2000
#> 1 2 3 4 5
## lag and diff (as diff is defined in terms of lag)
## act differently on zoo and zooreg objects!
## lag.zoo moves a point to the adjacent time whereas
## lag.zooreg moves a point by deltat
x <- c(1, 2, 3, 6)
zz <- zoo(x, x)
zr <- as.zooreg(zz)
lag(zz, k = -1)
#> 2 3 6
#> 1 2 3
lag(zr, k = -1)
#> 2 3 4 7
#> 1 2 3 6
diff(zz)
#> 2 3 6
#> 1 1 3
diff(zr)
#> 2 3
#> 1 1
## lag.zooreg wihtout and with na.pad
lag(zr, k = -1)
#> 2 3 4 7
#> 1 2 3 6
lag(zr, k = -1, na.pad = TRUE)
#> 1 2 3 4 6 7
#> NA 1 2 3 NA 6
## standard methods available for regular series
frequency(z)
#> [1] 4
deltat(z)
#> [1] 0.25
cycle(z)
#> 1959 Q2 1959 Q3 1959 Q4 1960 Q1 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3
#> 2 3 4 1 2 3 4 1 2 3
cycle(z[-(3:4)])
#> 1959 Q2 1959 Q3 1960 Q2 1960 Q3 1960 Q4 1961 Q1 1961 Q2 1961 Q3
#> 2 3 2 3 4 1 2 3
zz <- zoo(1:6, as.Date(c("1960-01-29", "1960-02-29", "1960-03-31",
"1960-04-29", "1960-05-31", "1960-06-30")))
# this converts zz to "zooreg" and then to "ts" expanding it to a daily
# series which is 154 elements long, most with NAs.
if (FALSE) { # \dontrun{
length(as.ts(zz)) # 154
} # }
# probably a monthly "ts" series rather than a daily one was wanted.
# This variation of the last line gives a result only 6 elements long.
length(as.ts(aggregate(zz, as.yearmon, c))) # 6
#> [1] 6
zzr <- as.zooreg(zz)
dd <- as.Date(c("2000-01-01", "2000-02-01", "2000-03-01", "2000-04-01"))
zrd <- as.zooreg(zoo(1:4, dd))