Kerem Özdemir

Case study · instrument three

carbon-bridge

Four causes for one change in emissions, with nothing left over.

The problem

Emissions moved between two years and somebody has to say why. The usual answer is a sentence: output was down, or the grid got cleaner. Both can be true at the same time and in opposite directions, and a sentence cannot carry that. A company that made less of a dirty product and more of a clean one, while its suppliers changed underneath it, has four stories running at once.

The arithmetic usually reached for makes it worse. Changing one factor at a time and holding the others still leaves a remainder that belongs to none of the four. The remainder is then ignored, or split evenly, or quietly folded into whichever effect the report wants to be largest. A decomposition with a residual in it can be argued in either direction, which is the same as saying it settles nothing.

The method

The logarithmic mean Divisia index, in its additive form, LMDI-I. The identity underneath is that a segment's emissions are total output, times that segment's share of output, times its energy per unit, times its emissions per unit of energy. Each of the four factors is then given a share of the observed change, weighted by the logarithmic mean of the segment's emissions in the two periods.

The property that matters is that the four effects add exactly to the change. LMDI-I has no residual term at all, so there is nothing to allocate by judgement and nothing for a reader to be talked out of. The instrument prints the identity and the difference on every redraw, so the claim is checkable rather than asserted.

E = sum over segments of   Q × S(i) × I(i) × F(i)

    Q     total output          S(i)  segment share of output
    I(i)  energy per unit       F(i)  emissions per unit of energy

    w(i)      = (E1(i) - E0(i)) / (ln E1(i) - ln E0(i))

    activity  = sum of  w(i) × ln( Q1 / Q0 )
    mix       = sum of  w(i) × ln( S1(i) / S0(i) )
    intensity = sum of  w(i) × ln( I1(i) / I0(i) )
    factor    = sum of  w(i) × ln( F1(i) / F0(i) )

    activity + mix + intensity + factor = E1 - E0        exactly

w(i) is the logarithmic mean of the segment's emissions in the two periods. Where the two are equal it is that value, so the weight is defined at every input rather than dividing by a difference of logarithms that has gone to zero. The page carries three segments, coated sheet, extrusions and castings, and two periods, 2023 and 2026, with output in units, MWh per unit and tCO2e per MWh. All eighteen fields are editable and the decomposition is redrawn on every keystroke.

What it does

The output is a waterfall of six bars: the base year total, the four effects in order, and the target year total. Under it stands the check, which is the part I would keep if I had to throw the chart away. It prints the four effects to six decimal places, their sum, the observed difference between the two years, and the residual between those two lines in exponential notation.

Inputsthree segments, two periods, three rows each: output, MWh per unit, tCO2e per MWh
Effectsoutput, mix, energy intensity, emission factor
Charta waterfall of six bars on a scale that states its own range
The checkthe four terms, their sum, the observed change, and the residual between them

What it refuses to do

It refuses to hide the residual, which is why the residual line exists at all. LMDI-I leaves none analytically, so what appears there is floating point noise and nothing else. It is printed on every redraw in exponential notation, next to the two lines it is the difference of. If a change to the code ever broke the identity, that line would say so before anything else did.

It refuses to run without output. If total output is zero or below in either period the instrument prints one line, that total output must be above zero in both periods, and draws nothing. Segment shares are undefined there, and a decomposition of an undefined quantity is theatre.

It refuses negative inputs. A negative number typed into any of the eighteen fields is read as zero rather than accepted. A negative output or a negative emission factor has no meaning in this identity, and it would put a logarithm outside its domain and produce four effects that are all not a number.

It refuses to pass off a substitution as a result. Values that are zero or below are replaced by 1e-12 before the logarithms are taken, so a segment that exists in one period and not the other gets a weight near zero instead of crashing the page. That is a numerical convenience and not a finding, and it is named here because the chart will not name it.

It refuses to draw the chart from zero and say nothing. The four effects are small next to the totals they explain, so the scale is computed from the values it has to show, and a line under the waterfall states the range it runs over. A truncated axis is a legitimate choice and a silent one is not.

It refuses to explain. The four numbers say how much of the change sits with output, mix, energy intensity and the emission factor. They do not say why the emission factor moved, and the instrument makes no attempt to guess. A decomposition is an accounting statement about a change, not a cause of it.

Try it

The instrument runs in the projects page. Change any of the eighteen numbers and watch the check: the sum of the effects and the observed change stay equal.

Run carbon-bridge on the projects page

github.com/Keremozdemirra/esg-toolkit

I wanted a bridge chart whose numbers could not be moved by whoever happened to be drawing it.

All projects