← all posts

Making multivariate training data out of univariate series

An architecture that can use covariates still has to learn to use them, and that takes training data full of real cross-variate structure. This post covers how TiRex-2 builds that data on the fly from plain univariate series.

The data problem

In the previous post I described how TiRex-2 routes targets, past covariates and future-known covariates through different paths. All of that machinery is useless if the model never sees training examples where covariates actually carry information about the target.

That's harder than it sounds. Large univariate time series corpora are plentiful: sales, traffic, energy, weather, plus synthetic series from Gaussian processes. Multivariate corpora with genuine, diverse dependencies between variates are scarce and narrow. Train on them alone, and the model learns the few dependency patterns they happen to contain, and little else.

So we went the other way: keep the big univariate pool, and couple its series into multivariate samples during training, with dependency structures we control. Every training step sees a freshly composed sample, so the model never sees the same combination twice.

Synthetic coupling pipeline: univariate series are augmented, coupled by a randomly drawn mechanism, post-processed, and returned as a multivariate sample. Univariate series Augmentation Coupling mechanism Post-processing Multivariate sample m ~ Uniform(M) linear mixing nonlinear SCM cointegration functional ⋮ covariate enrichment smooth time warping discretization future masking
Figure 1. The synthetic coupling pipeline. A batch of univariate series is augmented independently, coupled by a mechanism \(m \sim \mathrm{Uniform}(M)\), then post-processed into the final multivariate sample. Dotted lines mark masked future values. Adapted from the paper.

Step 1: augment each series on its own

Before any coupling happens, each series drawn from the pool is perturbed independently:

The result is cropped or NaN-padded to the target length \(T\). Missing data is part of the job, so the model should see it during training too.

Step 2: couple them

Next, one mechanism is drawn uniformly from a small set. Each mechanism turns \(F\) augmented series \(u_1,\dots,u_F\) into \(F\) output variates \(x_1,\dots,x_F\) with a known kind of dependency. Try them out:

Figure 2. In auto mode the demo draws a new sample twice per second and switches to a random mechanism every two seconds; hover to pause, or pick a mechanism yourself. A toy re-implementation of the six mechanism families, for illustration only (the real pipeline samples many more parameters). Pool series marked “not used” don’t feed the selected mechanism: half of the time all three are used, otherwise one sits out. Which pool series take which role is drawn at random, just like in training.

Each mechanism stands in for a pattern we see in real systems:

Step 3: make it look like the real world

Coupled series are still too clean. The final step adds the mess that real covariates come with:

Figure 3. Three of the post-processing steps applied to a single univariate series; the original is drawn faintly behind the result. In auto mode the demo draws a new sample twice per second and switches to another step every two seconds; hover to pause, or pick a step yourself. A toy re-implementation, for illustration only.

Does the model actually use its covariates?

The whole point of the pipeline is a model that exploits covariates instead of ignoring them. The experiments in the paper evaluate the full model, so they don't single out the pipeline, but they do show that TiRex-2 learned exactly that skill:

Takeaway

If you want a foundation model to use covariates, you have to show it many different ways in which covariates relate to targets, far more than any curated multivariate corpus contains. Composing that data on the fly from univariate series is cheap, controllable and effectively unlimited. And because every mechanism is known, it also gives us a clear way to ask which kinds of structure the model actually needs.

TiRex-2: Generalizing TiRex to Multivariate Data and Streaming
Patrick Podest*, Marco Pichler*, Elias Bürger, Levente Zólyomi, Bernhard Voggenberger, Wilhelm Berghammer, Daniel Klotz, Sebastian Böck, Günter Klambauer, Sepp Hochreiter. NeurIPS 2026 (Oral).

arXiv · BibTeX