In the following sections we introduce basic operations for time series analysis. We disuses the following topics:

• Subsetting and indexing
• Summary statistics
• Aggregation of time series data

As mentioned in the previous section there exist many different R-packages to work with time series. Please be aware that basic operations on time series are implemented in most of them. Hence, it is very important to be aware of the object class and respectively, the data representation. This representation dictates which functions will be available for loading, processing, analyzing, printing, and plotting the time series data.

For the purpose of demonstration we load the monthly (ts_FUB_monthly), daily (ts_FUB_daily) and hourly (ts_FUB_hourly) time series data for the weather station Berlin-Dahlem (FU) into R. We can do that by using the load() function. Check out the previous section on data sets used to remind yourself how we processed the data.

library(xts)
load(url("https://userpage.fu-berlin.de/soga/data/r-data/DWD_FUB.RData"))

First, we check to object classes for the three data sets:

class(ts_FUB_monthly)
## [1] "xts" "zoo"
str(ts_FUB_monthly)
## An xts object on 1719-01-01 / 2021-12-01 containing:
##   Data:    double [3636, 1]
##   Index:   Date [3636] (TZ: "UTC")
class(ts_FUB_daily)
## [1] "xts" "zoo"
str(ts_FUB_daily)
## An xts object on 1950-01-01 / 2021-12-31 containing:
##   Data:    double [26298, 2]
##   Columns: Temp, Rain
##   Index:   Date [26298] (TZ: "UTC")
class(ts_FUB_hourly)
## [1] "xts" "zoo"
str(ts_FUB_hourly)
## An xts object on 2002-01-28 11:00:00 / 2021-12-31 23:00:00 containing:
##   Data:    double [174023, 1]
##   Columns: Rain
##   Index:   POSIXct,POSIXt [174023] (TZ: "UTC")

The data sets are of class xts and zoo. Note that xts is just an extension of the zoo class. Visit the vignettes for these both packages to refresh your knowledge on these type of data representation. Type vignette('zoo') and vignette('xts') into your console to open the vignettes.

In order to extract the data vector from the xts object, in our case the ts_FUB_daily object, we apply the coredata() function on it.

x <- coredata(ts_FUB_daily)
head(x, 15)
##       Temp Rain
##  [1,] -3.2  2.2
##  [2,]  1.0 12.6
##  [3,]  2.8  0.5
##  [4,] -0.1  0.5
##  [5,] -2.8 10.3
##  [6,]  2.6  7.2
##  [7,]  5.7  0.4
##  [8,]  7.0  0.0
##  [9,]  5.8  3.7
## [10,] -2.4  4.5
## [11,] -7.2  0.6
## [12,]  0.6  7.1
## [13,]  2.5  0.0
## [14,]  5.4  0.0
## [15,]  5.8  3.8

To get the time index we apply the index() function on the xts object.

t <- index(ts_FUB_daily)
head(t, 15)
##  [1] "1950-01-01" "1950-01-02" "1950-01-03" "1950-01-04" "1950-01-05"
##  [6] "1950-01-06" "1950-01-07" "1950-01-08" "1950-01-09" "1950-01-10"
## [11] "1950-01-11" "1950-01-12" "1950-01-13" "1950-01-14" "1950-01-15"

#### Plotting

Now let us plot the monthly data with the plot.ts() function.

plot.ts(ts_FUB_monthly)

We could as well have used the autoplot() function from the ggfortify package (alternatively from the ggplot2 package). Let us now visualize the ts_FUB_monthly object using the autoplot() function.

library(ggfortify)
autoplot(ts_FUB_monthly)

Exercise: Plot the daily and hourly data sets using the autoplot() function

## Your code here...
Show code
autoplot(ts_FUB_daily)

## Your code here...
Show code
autoplot(ts_FUB_hourly)

The xts object ts_FUB_daily stores two time series: one for temperatures (Temp) and one for rainfall (Rain). The autoplot() function can deal with more than one time series stored in an xts object and, by default, plots all variables in the data set in one graph.

##### The ts class

For the sake of this tutorial we transform the monthly data set (ts_FUB_monthly) into a ts object. The ts object class is less flexible compared to the zoo or xts object classes, however, this object class is widely used and thus, we believe it is important to know how to interact with that particular object class. Therefore, we apply the ts() function, which converts a vector into a time series.

The ts function needs at least these arguments:

• x: a vector with data
• start: starting date of the series
• end: ending date of the series
• frequency: number of observations in the series per unit of time

In order to extract the data vector from the xts object, we again apply the coredata() function.

x_monthly <- coredata(ts_FUB_monthly)
head(x_monthly)
##      [,1]
## [1,]  2.8
## [2,]  1.1
## [3,]  5.2
## [4,]  9.0
## [5,] 15.1
## [6,] 19.0

Further, to extract the start argument we apply the index() function on of the ts_FUB_monthly object and combine it with the year() and month() function. The start argument is either a single number or a vector of two integers, which specify a natural time unit.

library(lubridate)
start <- c(
year(index(ts_FUB_monthly)[01]),
month(index(ts_FUB_monthly)[01])
)
start
## [1] 1719    1

As we are dealing with monthly data we set the argument frequency = 12.

Putting it all together gives

ts_FUB_monthly <- ts(x_monthly,
start = start,
frequency = 12
)
class(ts_FUB_monthly)
## [1] "ts"
str(ts_FUB_monthly)
##  Time-Series [1:3636, 1] from 1719 to 2022: 2.8 1.1 5.2 9 15.1 19 21.4 18.8 13.9 9 ...
##  - attr(*, "dimnames")=List of 2
##   ..$: NULL ## ..$ : chr "Series 1"

The ts_FUB_monthly object contains a time series of monthly mean temperatures from January 1719 to December 2021.

Let us plot the ts object with the generic plot() function.

plot(ts_FUB_monthly)

As before, we could as well have used the autoplot() function.

Citation

The E-Learning project SOGA-R was developed at the Department of Earth Sciences by Kai Hartmann, Joachim Krois and Annette Rudolph. You can reach us via mail by soga[at]zedat.fu-berlin.de.

You may use this project freely under the Creative Commons Attribution-ShareAlike 4.0 International License.

Please cite as follow: Hartmann, K., Krois, J., Rudolph, A. (2023): Statistics and Geodata Analysis using R (SOGA-R). Department of Earth Sciences, Freie Universitaet Berlin.