Climategate Code Analysis Part 2
Filed Under: Environmental News on December 8, 2009
Aaron’s note: This assessment, along with his first (linked below), is one of the most fair go-overs of the data and computer programming in the Climategate files I’ve seen so far. Read it, digest it, consider it, and think for yourself.
by Robert Greiner, Cube Antics
There are three common issues that have been raised in my previous post that I would like to officially address concerning the CRU’s source code.
If you only get one thing from this post, please get this. I am only making a statement about the research methods of the CRU and trying to show proof that they had the means and intent to falsify data. And, until the CRU’s research results can be verified by a 3rd party, they cannot be trusted.
Here are the four most frequent concerns dealing with the CRU’s source code:
- The source code that actually printed the graph was commented out and, therefore, is not valid proof.
- No proof exists that shows this code was used in publishing results.
- Interpolation is a normal part of dealing with large data sets, this is no different.
- You need the raw climate data to prove that foul play occurred.
If anyone can think of something I missed, please let me know.
THE SOURCE CODE THAT ACTUALLY PRINTED THE GRAPH WAS COMMENTED OUT AND, THEREFORE, IS NOT VALID PROOF.
Had I done a better job with my source analysis, I would have found a later revision of the briffa_sep98_d.pro source file (linked to in my previous post) contained in a different working tree which shows the fudge-factor array playing a direct result in the (uncommented) plotting of the data.
Snippit from: harris-tree/briffa_sep98_e.pro (see the end of the post for the full source listing)
- ;
- ; APPLY ARTIFICIAL CORRECTION
- ;
- yearlyadj=interpol(valadj,yrloc,x)
- densall=densall+yearlyadj
- ;
- ; Now plot them
- ;
- filter_cru,20,tsin=densall,tslow=tslow,/nan
- cpl_barts,x,densall,title=‘Age-banded MXD from all sites’,$
- xrange=[1399.5,1994.5],xtitle=‘Year’,/xstyle,$
- zeroline=tslow,yrange=[-7,3]
- oplot,x,tslow,thick=3
- oplot,!x.crange,[0.,0.],linestyle=1
- ;
Now, we can finally put this concern to rest.
INTERPOLATION IS A NORMAL PART OF DEALING WITH LARGE DATA SETS, THIS IS NO DIFFERENT.
This is partially true, the issue doesn’t lie in the fact that the CRU researchers used interpolation. The issue is the weight of the valadj array with respect to the raw data. valadj simply introduces too large of an influence to the original data to do anything productive with it.
Here is the graph I plotted of the valadj array. When we’re talking about trying to interpret temperature data that grows on the scale of one-tenths of a degree over a period of time, “fudging” a value by 2.5 is going to have a significant impact on the data set.

NO PROOF EXISTS THAT SHOWS THIS CODE WAS USED IN PUBLISHING RESULTS.
Correct! That’s why I am (and always have) taken the following stand: Enough proof exists that the CRU had both the means and intent to intentionally falsify data. This means that all of their research results cannot be trusted until they are verified. Period.
The fact that the “fudge-factor” source code exists in the first place is reason enough for alarm. Hopefully, they didn’t use fudged results in the CRU research results, but the truth is, we just don’t know.
YOU NEED THE RAW CLIMATE DATA TO PROVE THAT FOUL PLAY OCCURRED.
This is assuming the raw data are valid, which I maintain that it probably is. Several people question the validity of the climate data gathering methods used by the different climate research institutions, but I am not enough of a climate expert to have an opinion one way or the other. Furthermore, It simply doesn’t matter if the raw climate data are correct or not to demonstrate the extreme bias the valadj array forces on the raw data.
So, the raw data could actually be temperature data or corporate sales figures, the result is the same; a severe manipulation of data.
FULL SOURCE LISTING
As promised, here is the entire source listing for: harris-tree/briffa_sep98_e.pro
- ;
- ; PLOTS ‘ALL’ REGION MXD timeseries from age banded and from hugershoff
- ; standardised datasets.
- ; Reads Harry’s regional timeseries and outputs the 1600-1992 portion
- ; with missing values set appropriately. Uses mxd, and just the
- ; “all band” timeseries
- ;****** APPLIES A VERY ARTIFICIAL CORRECTION FOR DECLINE*********
- ;
- yrloc=[1400,findgen(19)*5.+1904]
- valadj=[0.,0.,0.,0.,0.,-0.1,-0.25,-0.3,0.,-0.1,0.3,0.8,1.2,1.7,2.5,2.6,2.6,$
- 2.6,2.6,2.6]*0.75 ; fudge factor
- if n_elements(yrloc) ne n_elements(valadj) then message,‘Oooops!’
- ;
- loadct,39
- def_1color,20,color=‘red’
- plot,[0,1]
- multi_plot,nrow=4,layout=‘large’
- if !d.name eq ‘X’ then begin
- window, ysize=800
- !p.font=-1
- endif else begin
- !p.font=0
- device,/helvetica,/bold,font_size=18
- endelse
- ;
- ; Get regional tree lists and rbar
- ;
- restore,filename=‘reglists.idlsave’
- harryfn=['nwcan','wnam','cecan','nweur','sweur','nsib','csib','tib',$
- 'esib','allsites']
- ;
- rawdat=fltarr(4,2000)
- for i = nreg-1 , nreg-1 do begin
- fn=‘mxd.’+harryfn(i)+‘.pa.mean.dat’
- print,fn
- openr,1,fn
- readf,1,rawdat
- close,1
- ;
- densadj=reform(rawdat(2:3,*))
- ml=where(densadj eq -99.999,nmiss)
- densadj(ml)=!values.f_nan
- ;
- x=reform(rawdat(0,*))
- kl=where((x ge 1400) and (x le 1992))
- x=x(kl)
- densall=densadj(1,kl) ; all bands
- densadj=densadj(0,kl) ; 2-6 bands
- ;
- ; Now normalise w.r.t. 1881-1960
- ;
- mknormal,densadj,x,refperiod=[1881,1960],refmean=refmean,refsd=refsd
- mknormal,densall,x,refperiod=[1881,1960],refmean=refmean,refsd=refsd
- ;
- ; APPLY ARTIFICIAL CORRECTION
- ;
- yearlyadj=interpol(valadj,yrloc,x)
- densall=densall+yearlyadj
- ;
- ; Now plot them
- ;
- filter_cru,20,tsin=densall,tslow=tslow,/nan
- cpl_barts,x,densall,title=‘Age-banded MXD from all sites’,$
- xrange=[1399.5,1994.5],xtitle=‘Year’,/xstyle,$
- zeroline=tslow,yrange=[-7,3]
- oplot,x,tslow,thick=3
- oplot,!x.crange,[0.,0.],linestyle=1
- ;
- endfor
- ;
- ; Restore the Hugershoff NHD1 (see Nature paper 2)
- ;
- xband=x
- restore,filename=‘../tree5/densadj_MEAN.idlsave’
- ; gets: x,densadj,n,neff
- ;
- ; Extract the post 1600 part
- ;
- kl=where(x ge 1400)
- x=x(kl)
- densadj=densadj(kl)
- ;
- ; APPLY ARTIFICIAL CORRECTION
- ;
- yearlyadj=interpol(valadj,yrloc,x)
- densadj=densadj+yearlyadj
- ;
- ; Now plot it too
- ;
- filter_cru,20,tsin=densadj,tslow=tshug,/nan
- cpl_barts,x,densadj,title=‘Hugershoff-standardised MXD from all sites’,$
- xrange=[1399.5,1994.5],xtitle=‘Year’,/xstyle,$
- zeroline=tshug,yrange=[-7,3],bar_color=20
- oplot,x,tshug,thick=3,color=20
- oplot,!x.crange,[0.,0.],linestyle=1
- ;
- ; Now overplot their bidecadal components
- ;
- plot,xband,tslow,$
- xrange=[1399.5,1994.5],xtitle=‘Year’,/xstyle,$
- yrange=[-6,2],thick=3,title=‘Low-pass (20-yr) filtered comparison’
- oplot,x,tshug,thick=3,color=20
- oplot,!x.crange,[0.,0.],linestyle=1
- ;
- ; Now overplot their 50-yr components
- ;
- filter_cru,50,tsin=densadj,tslow=tshug,/nan
- filter_cru,50,tsin=densall,tslow=tslow,/nan
- plot,xband,tslow,$
- xrange=[1399.5,1994.5],xtitle=‘Year’,/xstyle,$
- yrange=[-6,2],thick=3,title=‘Low-pass (50-yr) filtered comparison’
- oplot,x,tshug,thick=3,color=20
- oplot,!x.crange,[0.,0.],linestyle=1
- ;
- ; Now compute the full, high and low pass correlations between the two
- ; series
- ;
- perst=1400.
- peren=1992.
- ;
- openw,1,‘corr_age2hug.out’
- thalf=[10.,30.,50.,100.]
- ntry=n_elements(thalf)
- printf,1,‘Correlations between timeseries’
- printf,1,‘Age-banded vs. Hugershoff-standardised’
- printf,1,‘ Region Full <10 >10 >30 >50 >100′
- ;
- kla=where((xband ge perst) and (xband le peren))
- klh=where((x ge perst) and (x le peren))
- ts1=densadj(klh)
- ts2=densall(kla)
- ;
- r1=correlate(ts1,ts2)
- rall=fltarr(ntry)
- for i = 0 , ntry-1 do begin
- filter_cru,thalf(i),tsin=ts1,tslow=tslow1,tshigh=tshi1,/nan
- filter_cru,thalf(i),tsin=ts2,tslow=tslow2,tshigh=tshi2,/nan
- if i eq 0 then r2=correlate(tshi1,tshi2)
- rall(i)=correlate(tslow1,tslow2)
- endfor
- ;
- printf,1,‘ALL SITES’,r1,r2,rall,$
- format=‘(A11,2X,6F6.2)’
- ;
- printf,1,‘ ’
- printf,1,‘Correlations carried out over the period ’,perst,peren
- ;
- close,1
- ;
- end
WHAT DO YOU THINK?
Join the conversation! Don’t just accept what one person says, gather the evidence and make an informed decision.


