Problem 2. Cointegration was developed in economics to deal with a problem of spurious correlation between series with stochastic trends. Why should spurious correlation be a concern if the trends in temperature and GHGs are deterministic?

Sometimes I’ve been accused of over-simplifying, but I do try to make models as simple as possible, because it avoids a lot of speculation. With that view, this simple model represents paradoxical features of unit roots. Even if there was a deterministic relation of temperature and CO2, the correlation is spurious.

This simple model shows why temperature can look like a random walk but not go off to infinity.

The model simply includes a reaction to disequilibrium, like a half-pipe – that’s it.

There are a few ways you could get to this model. You could assume a restoring ‘force’ — a second derivative — is a linear function of the anomaly temperature T (difference from equilibrium). Or you could invoke Stefan-Boltzmans Law which states that radiant flux increases with the fourth power of temperature.

The model consists of the non-linear restoring effect f=b*T which is some fraction of T with remembered ‘shocks’ e. The simplification follows:

T(t+1) = T(t)+e-b*T(t)
T(t+1) = (1-b)*T(t)+e

Without f (or b=0), T would this would be a simple random walk RW (black). With f (and b=0.01 my model) (shown in green) the series T (red) has a slight restoring effect.

fig1

RW Dickey-Fuller = -3.0692, Lag order = 4, p-value = 0.1337
T – Dickey-Fuller = -2.9767, Lag order = 4, p-value = 0.1721

It doesn’t take many runs to find one that looks like current global temperature, and the random walk vs T is almost identical over 100 points. Moreover, the adf.test does not reject the presence of a unit root in T (is not stationary).

However, their real difference becomes clear with more data. At 1000 points the random walk (RW) is unbridled, while the T drifts off, it eventually crosses zero again (is mean-reverting).

fig2

Dickey-Fuller = -2.4645, Lag order = 9, p-value = 0.3817
Dickey-Fuller = -3.7678, Lag order = 9, p-value = 0.02060

The adf test now correctly shows that T is stationary, shown by the low p-value, while the RW is not rejected. The series contains a ‘fractional unit root’ of 0.99 instead of one. This difficult to detect difference is enough to guarantee the series reverts to the mean.

The probability distributional is also instructive. The histogram of temperatures has broad flat distribution (red), as would be expected from ‘surfing the half-pipe’, created by the restoring effect (shown in green).

fig3

Moreover, if you squint you can see periodicity in the series. This is because the series hangs around the upper or lower limit for a while, before eventually moving back. The period is only an illusion though. Could this the the origin of PDO?

Also, it’s not hard to see a ‘break’ in the series in the first figure — another illusion.

The distribution of these temperatures is in a broad and flat ‘niche’. Within that ‘niche’ the series is relatively unconstrained, like a random walk, but responding deterministically to small forcings (like CO2?). It is only with more data that the half-pipe is apparent.

It seems to me, that the problem for the deterministic paradigm is that even if CO2 increases temperature deterministically, this deterministic relationship breaks down as the temperature hits the sides and encounters resistance from the non-linear response.

At most, as CO2 keeps increasing, temperature would stay pinned to the side of the bowl, surfing up and down at the limit. When locked into the deterministic view, you would be wondering ‘where is the heat going‘ as extrapolation from increasing CO2 fails.

Global temperature can look like a unit root for all purposes over the last 150 years, but even a small negative feedback in a random walk provides physically-realistic behaviour.

R Code

sim1<-function() {
l<-1000
plot(rep(0,l),ylab="Anomaly",type="l",ylim=c(-10,10))
a=0;b=0.01
v=NULL;d=NULL
r<-rnorm(l,sd=0.2)
c<-cumsum(r)
for (i in r) {
x<-b*a^3
a=a+i-x
v=c(v,x)
d<-c(d,a)
}
lines(c)
lines(d,col=2)
lines(v,col=3)
print(adf.test(c))
print(adf.test(d))
}