RSS Amplifier

Agus’s Substack · Aug 18, 2026

The Geometry of a Causal Arrow

0
Sign in to vote or save

Agus Sudjianto · Agus’s Substack

Correlation gives you an angle. Two variables, one number between them: a covariance, a regression slope, a cosine. It is often all you need, and it is completely blind to direction. Swap the labels of the two variables and the number does not move. That is not a weakness of any particular estimator. It is the reason a symmetric measure, on its own, can never tell you whether x drives y or y drives x. Wrap it in a factorization, a likelihood or an optimizer, and the symmetry survives all of it.

Our paper, Causal Discovery using Geometric Algebra, takes that fact seriously and asks a narrow question: if the angle carries no direction, where does direction actually live? The answer is clean. It lives in a different grade of the same geometric object, an antisymmetric part that the angle throws away. Geometric algebra does not invent causal information. It tells you exactly which piece of the data can carry an arrow, and which piece never could.

Take two mean-centered vectors x and y. The geometric product splits them into two pieces. The inner product is the familiar cosine,

\(x\cdot y=\lVert x\rVert\lVert y\rVert\cos\theta\)

and after normalization cos θ is just Pearson correlation. The other piece is the wedge, x ∧ y — the oriented area the two vectors span:

\(\lVert x\wedge y\rVert=\lVert x\rVert\lVert y\rVert\lvert\sin\theta\rvert\)

In geometric algebra this area element is a bivector: the plane spanned by x and y. It is the same quantity the cross product returns in three dimensions, lifted to any number of them. Cosine and sine, alignment and spanned area which together they give the angle, and neither one points anywhere. Both are unchanged when you swap x and y.

The picture lifts straight to many variables. Normalize p vectors and take their full wedge; you get a blade, the oriented volume they span, and its squared magnitude is the determinant of the correlation matrix:

\(\lVert u_1\wedge\cdots\wedge u_p\rVert^2=\det R\)

This one is worth sitting with, because it quietly absorbs machinery that other methods build by hand. A correlation matrix is positive-definite exactly when this blade has nonzero volume. The spherical angles people extract from a Cholesky factor are the same angles you get by orthogonalizing the vectors one at a time and reading off each rejection (Cholesky of a Gram matrix is Gram-Schmidt written in matrix form). The order-dependence of that triangular factor is not forced on you: strip scale with the rotational part of a polar decomposition instead, and you get a chart that does not care which column happened to come first. All of this is a faithful, order-invariant description of how the variables are arranged. None of it points from one variable to another.

Direction has to enter through an operation that is not symmetric, and there is exactly one on offer: regressing b on a is not the same as regressing a on b. Bin the data along a candidate cause a, fit the local trend and look at what is left over. The residual, read as a cross-sectional volume, is a Schur complement:

\(V(b\mid a\text{-bin})=\operatorname{Var}(b)-\frac{\operatorname{Cov}(a,b)^2}{\operatorname{Var}(a)}\)

The deterministic slope drops out. What is left is the thickness of the noise tube around the mechanism, the area the cause spans with the residual it leaves behind.

Now do it both ways and collect the answers in a matrix C, where C[a,b] is the normalized residual b leaves after being predicted from a. This matrix is not symmetric, and that asymmetry is the entire point. Split it into its symmetric and antisymmetric parts:

\(C=C_S+C_A,\qquad C_S=\tfrac12\!\left(C+C^\top\right),\qquad C_A=\tfrac12\!\left(C-C^\top\right)\)

The symmetric part C_S is mutual predictability (association), the same thing the angle measured. The antisymmetric part is orientation:

\(C_A=-\tfrac12\,DS,\qquad DS[a,b]=C[b,a]-C[a,b]\)

with DS[a,b] > 0 favoring a → b. And here is the payoff the geometric-algebra framing was built for: C_A is a bivector. It is the same kind of skew object as the wedge, the same generator you would hand to a rotor to turn one edge around. Association and direction are not two methods bolted together. They are two grades of one operator, a symmetric grade that behaves like a positive-definite kernel, and an antisymmetric grade that carries the arrow.

This also makes precise why correlation was doomed from the start. Write the ground truth as an antisymmetric target T, with +1 for a → b and −1 for b → a. Under the Frobenius inner product, symmetric and antisymmetric matrices are orthogonal, so for any symmetric affinity M — a correlation, a symmetric-kernel value, the wedge magnitude, anything —

\(\langle M,\,T\rangle=\operatorname{tr}\!\left(M^\top T\right)=0\quad\Longrightarrow\quad\lVert M-T\rVert^2\ge\lVert T\rVert^2\)

The best a symmetric measure can do at matching the direction target is to give up and predict nothing. A rule that reads correlation alone is not merely weak at orientation. It is at chance, exactly, by construction.

There is a catch, and the paper is upfront about it. Residual variance is not the whole story. For an invertible mechanism with small noise, a monotone curve you can almost run backward, both directions look nearly equally predictable, the volumes nearly match, and the variance-based score fades even though the direction is perfectly identifiable in principle.

The quantity that does characterize identifiability uses residual independence rather than residual size. Let R(b∣a) be the residual of b after predicting it from a, and score its distance covariance with the cause:

\(DSD[a,b]=D(b\to a)-D(a\to b),\qquad D(a\to b)=\operatorname{dCov}^2\!\left(R(b\mid a),\,a\right)\)

In the causal direction the residual is independent of the cause, so that term is zero; in the wrong direction it generally is not. The result is an if-and-only-if: under standard additive-noise conditions direction is identifiable exactly when DSD ≠ 0, and its sign is the arrow. On a linear-Gaussian pair, the textbook case where the two directions are genuinely indistinguishable, DSD is zero and the method abstains, which is the right move rather than a failure to talk around. And there is a matching test: split the sample, fit on one half, run a distance-covariance permutation test on the other, and you get asymptotic level and power. That is a real p-value for “this direction is a legitimate noise model,” not just a score with a sign.

So the conditional volume is the practical estimator and the residual-independence grade is the object with guarantees. The volume is a proxy. It’s cheap, GPU-friendly and, being a scale signal itself, it stays informative under heteroscedastic noise where a naive scheme would break. But it identifies only part of the space; the independence grade covers all of it and comes with the test. Keeping those two straight is most of the honesty in the paper.

Here is a mistake that is easy to make. The additive-noise story suggests a shortcut: the causal direction is the one with constant noise width. Slice a noisy parabola along the cause and the tube is uniform; slice it along the effect and the two arms fold together and the width changes. So far so good, invariance picks the arrow.

Now try a sine wave. It is many-to-one in both directions, and the noise width looks stable whichever way you cut it. An invariance test has nothing to grab, and in our experiments it sits at chance: 0.30 on the plain sinusoid, and 0.00 once the noise is lognormal, where it is reliably wrong. The magnitude of the residual volume still separates the two. A good forward predictor leaves a thin tube, while one effect value maps back to several causes, so the reverse tube is fat. On the same sinusoids where invariance is at chance, magnitude orients correctly on every seed and it stays exact on the parabola and the monotone cubic where invariance also works.

The lesson is worth stating plainly: an invariant is not automatically an identifying statistic. A quantity can be beautifully constant and still tell you nothing about direction. To orient a mechanism the statistic has to respond differently to the two competing stories, and constancy alone does not.

Two variables can look tightly related for the dull reason that something upstream drives both. Before orienting an edge you have to decide whether it should exist at all, and that is a different question from which way it runs. Conditioning is how you ask it, and in this language conditioning is a blade rejection: project onto the orthogonal complement of the adjustment set and see what dependence survives. On a simple chain X → M → Y, the raw score reports that X and Y are related; condition on the mediator M and the direct link is gone (the score jumps from 0.66 to 0.98). Reachability collapses to no adjacency, which is exactly right.

The rejection has to be nonlinear. A linear adjustment leaves a nonlinear confounder sitting in the residuals, and a polynomial one blows up on heavy-tailed data, where high powers of a few extreme points swamp everything. We reject onto a radial-basis blade instead, with ridge regularization and landmarks placed by farthest-point sampling so the basis actually reaches the tails where the confounding hides. Outliers saturate instead of taking over.

The full algorithm keeps adjacency and orientation apart on purpose. A constraint-based skeleton, a PC search with collider and Meek rules, settles which edges exist and orients everything the constraints already fix; the volume score is spent only on the edges left genuinely open, the ones a constraint method hands back as an undirected equivalence class. A directional statistic is the wrong tool for deciding whether an edge belongs, and a constraint rule is the wrong tool for the last mile of orientation, so each does the job it is good at. The whole thing runs batched on a GPU.

On random-graph benchmarks with nonlinear mechanisms the hybrid has the lowest structural Hamming distance across noise types up to twenty nodes, and the part that matters, the margin over CAM, NOTEARS-MLP and DAGMA widens as the graph grows. At twenty nodes on Gaussian noise it sits at 5.3 against 11.3 for the best baseline; the competitors degrade faster with size. On an ADIA-Lab-style role-classification task it is the strongest unsupervised method, and on the real Tuebingen cause-effect pairs it takes the highest weighted accuracy among additive-noise and location-scale baselines.

And it is weak on linear-Gaussian data, where the linear methods win. That is not a bug to bury in a footnote. A linear-Gaussian pair is non-identifiable, the antisymmetric grade is zero, and the method abstains by design. Anything that claimed to orient a linear-Gaussian edge would be claiming to read information that is not in the data. Losing that benchmark on purpose is the same discipline that makes the wins worth trusting.

None of this manufactures causal information out of correlation. The angles, the Gram determinants and the wedge volumes describe symmetric structure and how the variables sit relative to each other and when that geometry goes flat. The arrow shows up only after conditioning, in the antisymmetric grade, when one direction is made to account for the residual the other leaves. The contribution is not a new signal. It is a language that puts association and direction in the same object as two grades, together with results that say when the directional grade can be trusted and how to test it.

The code, a minimal bivariate example, the hybrid routine, the random-DAG reproduction and the GPU primitives, is in the companion GitHub repository, GA-Causal-Discovery. The first experiment worth running is the smallest: compute the two residuals for a nonlinear pair, watch the arrow appear in the antisymmetric part, then add a common driver and watch a convincing pairwise arrow lose its claim to be direct. That last move using this same conditioning to strip a confounded lead-lag out of real market data, where an apparent equity sector rotation turns out to be a market-mediated stress effect rather than a causal edge. It is a story in its own right, and it gets its own post next.

Read the original on agussudjianto.substack.com

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.