-
7
Mar -
Surface Temperatures – estimating the SD of the trends
Posted by David Stockwell in All
How cold does it need to be to prove the theory of global warming wrong? What are the exact conditions under which global warming statements can be falsified? Over at the blackboard, Lucia has been giving this controversial topic well deserved attention. After all, it is pretty much agreed that scientific theories should be falsifiable. One would think that understanding of climate is flawed if three conditions occur together: a constant temperature trend, IPCC predicts a rising temperature trend, and CO2 continues to rise. She states:
If, the average trend for the years 2008-2017 is negative, then any trend of 2.0 C/year or higher, will be found to be “inconsistent with the measured trend” to the 95% confidence level. That is: current projections of that warming may be 2.0 C/year or higher will be falsified.
By my calculations using more robust statistics, it would take 20 years or more than twice as many years to produce a 95% confidence interval of 0.2C per decade or 2C per century.
The problem is, she makes some assumptions — which she correctly acknowledges — and one of the main ones is independence of the temperature data. On the contrary, temperature measurements are serially correlated to a degree that affects statistics such as measures of variability, particularly the standard deviation (SD). In a serial correlation the new temperature is determined in part by the previous one. Stated another way, there appears to be more information in the series than there really is. One of consequences is that the calculated SD is lower than it should be, making the confidence limits smaller than they should be.
Lucia has been working on the correcting for serial autocorrelation here. To me, the quickest and most reliable way to check when you are not sure, is to generate the distribution of the actual statistic of interest, in this case the trend. Below is a script in R to generate all trends for a specific number of years d. The script is at the end of the post and can be run as follows. First, it reads the global surface temperatures into a variable g. The trends for every interval of 10 years are collected into a vector and the SD calculated av. It prints the SD for that choice of time interval.
Source("sdtemptrend.R")
av< -trend(g,d=10)
[1] 0.02153519
The script produces the graphs like the ones below, showing the temperature measurements, and the trend per decade for the previous d years, with the 95% confidence limit. The blue dashed lines show the significance levels. The first figure was run at d=30 and illustrates the very significant 30 year trend to the present. This shows agreement with statements such as ‘the world is warming’. Run at d=10, the trend is not significant.
Figure: Global temperatures (black), trend of global temperatures (red) with significance of the trend at 95% confidence level (dashed blue). The first figure shows a 30 year trend, the second a 10 year trend. The y-axis is temperature anomaly and decadal temperature trend.
Lucia derived an SD of surface temperature of 0.1 from the detrended annual temperature measurements here. When we estimate distribution of the statistic directly, by repeatedly calculating the trend for all possible years, we get a larger SD of 0.22 for the 10 year interval. An estimate of the actual SD of the trends for a selection of years is shown below.
5 years SD = 0.5 10 years SD = 0.216 15 years SD = 0.15 20 years SD = 0.12
So the SD of the trend estimated directly from the temperature data is about twice the estimate given by Lucia. With double the SD, it would take 20 years or more than twice as many years to falsify a prediction of a trend of 0.2C per decade or 2C per century as estimated by assuming independence. This is typical of the difference incorrect assumptions of normality make.
One of the themes of this blog are documenting cases where assumed and actual distributions give different results. Independence assumptions are virtually never justified in these sorts of temperature data, and can lead to considerable errors.
Script for calculating SD of surface temperatures
readCRU< -function(source="http://www.cru.uea.ac.uk/cru/data/temperature/crutem3gl.txt",temps=2:13,plot=T) {
f<-read.table(source,fill=TRUE)
d<-as.vector(t(as.matrix(f[seq(1,length(f[,1]),by=2),temps])))
ts(d,frequency=length(temps),start=1850)
}
g<-readCRU(temps=14)
mylin<-function(y,duration=5) {
x<-1:duration
l<-lm(y[1:duration] ~ x )
as.vector(l$coefficients[2])
}
trend<-function(y,d=5,scale=10) {
x<-c()
for(i in 1:(length(y)-d ) ) {
x[i]<-mylin(y[i:(i+d )],duration=d)
}
t<-ts(x,start=tsp(y)[1]+d,frequency=tsp(y)[3])
s<-sd(t)
print(s)
s<-scale*s
plot(y)
lines(t*scale,col="red")
lines(tsp(y)[1:2],c(0,0),col="blue")
lines(tsp(y)[1:2],c(0,0)+s*1.96,col="blue",lty=2)
lines(tsp(y)[1:2],c(0,0)-s*1.96,col="blue",lty=2)
s
}
- Published by David Stockwell in: All
- If you like this blog please take a second from your precious time and subscribe to my rss feed!