This function allows the user to easily build the (\(n_a \times n_b\)) cross-sectional (contemporaneous) matrix mapping the \(n_b\) bottom level series into the \(n_a\) higher level ones. (Experimental version)

Cmatrix(formula, data, sep = "_", sparse = TRUE, top_label = "Total")

Arguments

formula

Specification of the hierarchical structure: grouped hierarchies are specified using ~ g1 * g2 and nested hierarchies are specified using ~ parent / child. Mixtures of the two formulations are also possible, like ~ g1 * (grandparent / parent / child).

data

A dataset in which each column contains the values of the variables in the formula and each row identifies a bottom level time series.

sep

Character to separate the names of the aggregated series (default is "_").

sparse

Option to return sparse matrix (default is TRUE).

top_label

Label of the top level variable (default is "Total").

Value

A (na x nb) matrix.

Examples

## Balanced hierarchy
#         T
#    |--------|
#    A        B
#  |---|   |--|--|
# AA   AB  BA BB BC
# Names of the bottom level variables
data_bts <- data.frame(X1 = c("A", "A", "B", "B", "B"),
                       X2 = c("A", "B", "A", "B", "C"),
                       stringsAsFactors = FALSE)
# Cross-sectional aggregation matrix
C <- Cmatrix(~ X1 / X2, data_bts, sep = "")
#> ------ Cross-sectional information ------
#>   Number of total time series (n): 8
#>  Number of upper time series (na): 3
#> Number of bottom time series (nb): 5
#>                  Number of levels: 2

## Unbalanced hierarchy (1)
#             T
#    |--------|------|
#    A        B      C
#  |---|   |--|--|
# AA   AB  BA BB BC
# Names of the bottom level variables
data_bts <- data.frame(X1 = c("A", "A", "B", "B", "B", "C"),
                       X2 = c("A", "B", "A", "B", "C", NA),
                       stringsAsFactors = FALSE)
# Cross-sectional aggregation matrix
C <- Cmatrix(~ X1 / X2, data_bts, sep = "")
#> ------ Cross-sectional information ------
#>   Number of total time series (n): 9
#>  Number of upper time series (na): 3
#> Number of bottom time series (nb): 6
#>                  Number of levels: 2

## Unbalanced hierarchy (2)
#                 T
#       |---------|---------|
#       A         B         C
#     |---|     |---|     |---|
#    AA   AB   BA   BB   CA   CB
#  |----|         |----|
# AAA  AAB       BBA  BBB
# Names of the bottom level variables
data_bts <- data.frame(X1 = c("A", "A", "A", "B", "B", "B", "C", "C"),
                       X2 = c("A", "A", "B", "A", "B", "B", "A", "B"),
                       X3 = c("A", "B", NA, NA, "A", "B", NA, NA),
                       stringsAsFactors = FALSE)
# Cross-sectional aggregation matrix
C <- Cmatrix(~ X1 / X2 / X3, data_bts, sep = "")
#> ------ Cross-sectional information ------
#>   Number of total time series (n): 14
#>  Number of upper time series (na): 6
#> Number of bottom time series (nb): 8
#>                  Number of levels: 3

## Grouped hierarchy
#         C               S
#    |--------|      |--------|
#    A        B      M        F
#  |---|    |---|
# AA   AB  BA   BB
# Names of the bottom level variables
data_bts <- data.frame(X1 = c("A", "A", "B", "B", "A", "A", "B", "B"),
                       X2 = c("A", "B", "A", "B", "A", "B", "A", "B"),
                       Y1 = c("M", "M", "M", "M", "F", "F", "F", "F"),
                       stringsAsFactors = FALSE)
# Cross-sectional aggregation matrix
C <- Cmatrix(~ Y1 * (X1 / X2), data_bts, sep = "")
#> ------ Cross-sectional information ------
#>   Number of total time series (n): 21
#>  Number of upper time series (na): 13
#> Number of bottom time series (nb): 8
#>                  Number of levels: 5