Iterative procedure which produces cross-temporally reconciled forecasts by alternating forecast reconciliation along one single dimension (either cross-sectional or temporal) at each iteration step. Each iteration consists in the first two steps of the heuristic procedure by Kourentzes and Athanasopoulos (2019), so the forecasts are reconciled by alternating cross-sectional (contemporaneous) reconciliation, and reconciliation through temporal hierarchies in a cyclic fashion. The choice of the dimension along which the first reconciliation step in each iteration is performed is up to the user (param start_rec), and there is no particular reason why one should perform the temporal reconciliation first, and the cross-sectional reconciliation then. The iterative procedure allows the user to get non-negative reconciled forecasts.

iterec(basef, thf_comb, hts_comb, res, itmax = 100, tol = 1e-5,
       start_rec = "thf", norm = "inf", note = TRUE, plot = "mti", ...)



(\(n \times h(k^\ast+m)\)) matrix of base forecasts to be reconciled, \(\widehat{\mathbf{Y}}\); \(n\) is the total number of variables, \(m\) is the highest time frequency, \(k^\ast\) is the sum of (a subset of) (\(p-1\)) factors of \(m\), excluding \(m\), and \(h\) is the forecast horizon for the lowest frequency time series. Each row identifies a time series, and the forecasts are ordered as [lowest_freq' ... highest_freq']'.

hts_comb, thf_comb

Type of covariance matrix (respectively (\(n \times n\)) and (\((k^\ast + m) \times (k^\ast + m)\))) to be used in the cross-sectional and temporal reconciliation, see more in comb param of htsrec() and thfrec().


(\(n \times N(k^\ast + m)\)) matrix containing the residuals at all the temporal frequencies ordered [lowest_freq' ... highest_freq']' (columns) for each variable (row), needed to estimate the covariance matrix when hts_comb = {"wls", "shr", "sam"} and/or hts_comb = {"wlsv", "wlsh", "acov", "strar1", "sar1", "har1", "shr", "sam"}. The row must be in the same order as basef.


Max number of iteration (100, default) (old version maxit).


Convergence tolerance (1e-5, default).


Dimension along with the first reconciliation step in each iteration is performed: it start from temporal reconciliation with "thf" (default), from cross-sectional with "hts" and it does both reconciliation with "auto".


Norm used to calculate the temporal and the cross-sectional incoherence. There are two alternatives: "inf" (\(\max{|x_1|, |x_2|,\dots}\), default) or "one" (\(\sum |x_i|\)).


If note = TRUE (default) the function writes some notes to the console, otherwise no note is produced (also no plot).


Some useful plots: "mti" (default) marginal trend inconsistencies, "pat" step by step inconsistency pattern for each iteration, "distf" distance forecasts iteration i and i-1, "all" all the plots.


any other options useful for htsrec() and thfrec(), e.g. m, C (or Ut and nb), nn (for non negativity reconciliation only at first step), mse, corpcor, type, sol, settings, W, Omega,...


iterec returns a list with:


(\(n \times h(k^\ast + m)\)) reconciled forecasts matrix, \(\widetilde{\mathbf{Y}}\).


Cross-sectional incoherence at each iteration.


Temporal incoherence at each iteration.


Starting coherence dimension (thf or hts).




Control code (see details).


Elapsed time.


If start_rec = "auto", matrix of distances of the forecasts reconciled from the base.


This reconciliation procedure can be seen as an extension of the well known iterative proportional fitting procedure (Deming and Stephan, 1940, Johnston and Pattie, 1993), also known as RAS method (Miller and Blair, 2009), to adjust the internal cell values of a two-dimensional matrix until they sum to some predetermined row and column totals. In that case the adjustment follows a proportional adjustment scheme, whereas in the cross-temporal reconciliation framework each adjustment step is made according to the penalty function associated to the single-dimension reconciliation procedure adopted.

Control status of iterative reconciliation:


Temporal/Cross-sectional reconciliation does not work.


Convergence not achieved (maximum iteration limit reached).


Convergence achieved.


Convergence achieved: incoherence has increased in the next iteration (at least one time).


Convergence achieved: incoherence has increased in the next two or more iteration (at least one time).


The forecasts are already reconciled.


Deming, E., Stephan, F.F. (1940), On a least squares adjustment of a sampled frequency table when the expected marginal totals are known, The Annals of Mathematical Statistics, 11, 4, 427–444.

Di Fonzo, T., Girolimetto, D. (2020), Cross-Temporal Forecast Reconciliation: Optimal Combination Method and Heuristic Alternatives, Department of Statistical Sciences, University of Padua, arXiv:2006.08570.

Johnston, R.J., Pattie, C.J. (1993), Entropy-Maximizing and the Iterative Proportional Fitting Procedure, The Professional Geographer, 45, 3, 317–322.

Kourentzes, N., Athanasopoulos, G. (2019), Cross-temporal coherent forecasts for Australian tourism, Annals of Tourism Research, 75, 393-409.

Miller, R.E., Blair, P.D. (2009), Input-output analysis: foundations and extensions, 2nd edition, New York, Cambridge University Press.

Schäfer, J.L., Opgen-Rhein, R., Zuber, V., Ahdesmaki, M., Duarte Silva, A.P., Strimmer, K. (2017), Package `corpcor', R package version 1.6.9 (April 1, 2017), corpcor.

Schäfer, J.L., Strimmer, K. (2005), A Shrinkage Approach to Large-Scale Covariance Matrix Estimation and Implications for Functional Genomics, Statistical Applications in Genetics and Molecular Biology, 4, 1.

Stellato, B., Banjac, G., Goulart, P., Bemporad, A., Boyd, S. (2020). OSQP: An Operator Splitting Solver for Quadratic Programs, Mathematical Programming Computation, 12, 4, 637-672.

Stellato, B., Banjac, G., Goulart, P., Boyd, S., Anderson, E. (2019), OSQP: Quadratic Programming Solver using the `OSQP' Library, R package version (October 10, 2019),

See also

Other reconciliation procedures: cstrec(), ctbu(), htsrec(), lccrec(), octrec(), tcsrec(), tdrec(), thfrec()


# \donttest{
obj <- iterec(FoReco_data$base, note = FALSE,
  m = 12, C = FoReco_data$C, thf_comb = "acov",
  hts_comb = "shr", res = FoReco_data$res, start_rec = "thf")
# }