Skip to contents

This function computes the cross-sectional bottom-up reconciled forecasts (Dunn et al., 1976) for all series by appropriate summation of the bottom base forecasts \(\widehat{\mathbf{b}}\): $$\widetilde{\mathbf{y}} = \mathbf{S}_{cs}\widehat{\mathbf{b}},$$ where \(\mathbf{S}_{cs}\) is the cross-sectional structural matrix.


csbu(base, agg_mat, sntz = FALSE)



A (\(h \times n_b\)) numeric matrix or multivariate time series (mts class) containing bottom base forecasts; \(h\) is the forecast horizon, and \(n_b\) is the total number of bottom variables.


A (\(n_a \times n_b\)) numeric matrix representing the cross-sectional aggregation matrix. It maps the \(n_b\) bottom-level (free) variables into the \(n_a\) upper (constrained) variables.


If TRUE, the negative base forecasts are set to zero before applying bottom-up.


A (\(h \times n\)) numeric matrix of cross-sectional reconciled forecasts.


Dunn, D. M., Williams, W. H. and Dechaine, T. L. (1976), Aggregate versus subaggregate models in local area forecasting, Journal of the American Statistical Association 71(353), 68–71. doi:10.1080/01621459.1976.10481478

See also

Bottom-up reconciliation: ctbu(), tebu()

Cross-sectional framework: csboot(), cscov(), cslcc(), csmo(), csrec(), cstd(), cstools()


# (3 x 2) bottom base forecasts matrix (simulated), Z = X + Y
bts <- matrix(rnorm(6, mean = c(10, 10)), 3, byrow = TRUE)

# Aggregation matrix for Z = X + Y
A <- t(c(1,1))
reco <- csbu(base = bts, agg_mat = A)

# Non negative reconciliation
bts[2,2] <- -bts[2,2] # Making negative one of the base forecasts for variable Y
nnreco <- csbu(base = bts, agg_mat = A, sntz = TRUE)