Tuesday, March 09, 2010

Did Monbiot try to understand climate science?

In The Guardian's Comment is Free section there's an article by George Monbiot called The trouble with trusting complex science which argues that:

The detail of modern science is incomprehensible to almost everyone, which means that we have to take what scientists say on trust.

He does this in the context of climate change science. I wonder if he actually tried to read the key paper that describes why we know that the global temperature is increasing. The paper is Uncertainty estimates in regional and global observed temperature changes: a new dataset from 1850. Go on, read it. I dare you.

The critical thing you need to be able to understand to understand that paper is... how to calculate an average. That's a GCSE level maths subject; here's a quick page to revise that in case you've forgotten how to average.

Because, you see, the entire process described in that paper involves the following steps:

1. Get temperature data (i.e. thermometer readings) at different places around the world for many, many years
2. Work out the average temperature at each location by averaging the values between 1961 and 1990 on a monthly basis. So you end up knowing things like the average January temperature at Heathrow.
3. Now go back and work out how much the temperature for any given month and year deviates from the average: all that means is subtract the average temperature from the observed temperature for the same month. Now you know how 'different' the temperature is. This is called the anomaly. If it's getting hotter the anomalies will get bigger.
4. Divide the globe up into squares 5 degrees on each side. Find all the thermometers inside each square, find their anomalies for each month and year. Average them to get an average anomaly for that square.
5. Take all the squares in the northern hemisphere, average their anomalies for each month and year. Draw a graph showing the temperature changing. Repeat the for southern hemisphere.
6. Now take the northern and southern hemisphere temperatures for each month and year and average them to get a global temperature anomaly chart.

Child's play? Yes.

I'll admit that the rest of the paper has some harder concepts (standard deviation, anyone?). But I'll wager that the real reason that people don't understand science is not because it's too hard to understand, but because they aren't motivated.

Yes, there are parts of science that require a lot of knowledge, but covering your eyes and not trying to understand is likely where many people go wrong.

Or to put it Monbiot's way:

My heart rebels against this project: I would rather be pelting scientists with eggs than trying to understand their datasets.

Labels:

Monday, March 01, 2010

The reason I managed to find errors in the Met Office data and code

It turns out the reason is rather simple. In the evidence being given today to the Parliamentary Science and Technology Committee the Met Office says of their quality control procedures:

Manual inspection, including real-time quality control using GIS software; quality control described in literature for the various regional studies.

Contrast that with what they say about NOAA's procedures for the same sort of data:

A long series of automatic quality control tests based on both statistics and physics (e.g., outlier tests, identical values two months in row, etc.)

Given the amount of data it's unsurprising that 'manual inspection' isn't enough.

Update There's a lovely bit of evidence from Professor Darrel Ince about software quality that I wholeheartedly agree with.

Labels:

Thursday, February 25, 2010

Something a bit confusing from UEA/CRU

UEA and CRU have issued a document that they have submitted to the Parliamentary Select Committee on Science and Technology who are looking into the taking of email and documents from CRU. The document can be found here.

In it there are two interesting paragraphs concerning software:

3.4.7 CRU has been accused of the effective, if not deliberate, falsification of findings through deployment of “substandard” computer programs and documentation. But the criticized computer programs were not used to produce CRUTEM3 data, nor were they written for third-party users. They were written for/by researchers who understand their limitations and who inspect intermediate results to identify and solve errors.

3.4.8 The different computer program used to produce the CRUTEM3 dataset has now been released by the MOHC with the support of CRU.

It's 3.4.8 that's surprising. I assume that they are referring to the code released by the Met Office on this page (MOHC = Met Office Hadley Centre). On that page they say (my emphasis):

station_gridder.perl takes the station data files and makes gridded fields in the same way as used in CRUTEM3. The gridded fields are output in the ASCII format used for distributing CRUTEM3.

My reading of "in the same way as" has always been that this code is not the actual code that they used for CRUTEM3 but something written to operate in the same manner. In which case 3.4.8 is either incorrect, or referring to some other code that I can't lay my hands on.

Has anyone seen any other CRUTEM3 code released by the Met Office?

More information

Looking into this a bit further there's a description of the CRUTEM3 data format on the CRU site here. Here's what it says:

for year = 1850 to endyear
for month = 1 to 12 (or less in endyear)
format(2i6) year, month
for row = 1 to 36 (85-90N,80-85N,75-70N,...75-80S,80-85S,85-90S)
format(72(e10.3,1x)) 180W-175W,175W-170W,...,175-180E

In that the interesting thing is the format command. That is an IDL command (and not a Perl command). The first one pads the year and month to 6 characters, the second one outputs a row of 72 values each 10 characters wide in exponent format with three characters after the decimal point (the 1x gives a single space of separation).

The other oddness is that the NetCDF files that are available for download were not produced by Perl, they were produced by XConv (specifically, version 1.90 on Mon Feb 22 18:26:48 GMT 2010). And I've tested XConv and it can't read the output of the Perl program supplied by the Met Office.

It's not definitive, but all that points to the Perl programs released by the Met Office not being the actual programs used to produce CRUTEM3. Which leads me back to my original question: has anyone seen any other CRUTEM3 code released by the Met Office?

PS I think the Perl code released by the Met Office was likely written by Philip Brohan (he's the lead author on the CRUTEM3 paper), the style is very, very similar to this code. Given that he's written a lot of Perl code, perhaps I'm simply wrong and the Perl code released by the Met Office is the actual CRUTEM3 generating code.

Update Confusion cleared up by Phil Jones of CRU talking to the Parliamentary committee. He stated that CRU has not released their code for generating CRUTEM3 because it is written in Fortran. The code released by the Met Office (the Perl code) is their version that produces the same result.

Here's the relevant exchange (my transcript):

Graham Stringer MP: So have you now released the code, the actual code used for CRUTEM3?

Professor Jones: Uh, the Met Office has. They have released their version.

Stringer: Well, have you released your version?

Jones: We haven't released our version. But it produces exactly the same result.

Stringer: So you haven't released your version?

Jones: We haven't released our version, but I can assure you...

Stringer: But it's different.

Jones: It's different because the Met Office version is written in a computer language called Perl and they wrote it independently of us and ours is written in Fortran.

It's worth noting that above I said that the format command is present in IDL, it's also present in Fortran which jibes with Professor Jones' statement above.

Later the same day Graham Stringer asked a panel about scientific software and here's part of the response from Professor Julia Slingo representing the Met Office:

Slingo: I mean, around the UEA issue, of course, we did put the code out. Um, at Christmas time. Before Christmas, to, along with the data. Because, we, I felt very strongly that we needed to have the code out there so that it could be checked.

(The rest of her answer doesn't concern CRUTEM3. It was a discussion of code used for climate modeling; I'm going to ignore what she said as it seems to have little bearing on the code I've looked at).

Labels:

Wednesday, February 24, 2010

The station errors in CRUTEM3 and HadCRUT3 are incorrect

I'm told by a BBC journalist that the Met Office has said through their press office that the errors that were pointed out by Ilya Goz and I have been confirmed. The station errors are being incorrectly calculated (almost certainly because of a bug in the software) and that the Met Office is rechecking all the error data.

I haven't heard directly from the Met Office yet; apparently the Met Office is waiting to write to me when they have rechecked their entire dataset.

The outcome is likely to be a small reduction in the error bars surrounding the temperature trend. The trend itself should stay the same, but the uncertainty about the trend will be slightly less.

Labels:

Tuesday, February 16, 2010

The magic of sub-editors

In the print version of my Times article today there's been significant cutting to get it to fit into the space available. This is the magic work of sub-editors.

Here's the full text of the article with the words that remained in the sub-edited version (which appeared in the paper):

The history of science is filled with stories of amateur scientists who made significant contributions. In 1937 the American amateur astronomer Grote Reber built a pioneering dish-shaped radio telescope in his back garden and produced the first radio map of the sky. And in the 19th century the existence of dominant and recessive genes was described by a priest, Gregor Mendel, after years of experimentation with pea plants.

But with the advent of powerful home computers, even the humble amateur like myself can make a contribution.

Using my laptop and my knowledge of computer programming I accidentally uncovered errors in temperature data released by the Met Office that form part of the vital records used to show that the climate is changing. Although the errors don’t change the basic message of global warming, they do illustrate how open access to data means that many hands make light work of replicating and checking the work of professional scientists.

After e-mails and documents were taken from the Climatic Research Unit at the University of East Anglia late last year, the Met Office decided to release global thermometer readings stretching back to 1850 that they use to show the rise in land temperatures. These records hadn’t been freely available to the public before, although graphs drawn using them had.


Apart from seeing Al Gore’s film An Inconvenient Truth I’d paid little attention to the science of global warming until the e-mail leaks from UEA last year.

I trusted the news stories about the work of the IPCC, but I thought it would be a fun hobby project to write a program to read the Met Office records on global temperature readings and draw the sort of graphs (a graph) that show(ing) how it’s hotter now than ever before.

Since my training is in mathematics and computing I thought it best to write self-checking code: I’m unfamiliar with the science of climate change(climate science) and so having my program perform internal checks for consistency was vital to making sure I didn’t make a mistake.

To my surprise the program complained about average temperatures in Australia and New Zealand. At first I assumed I’d made a mistake in the code and used (having checked the results with) a pocket calculator to double check the calculations.

The result was unequivocal: something was wrong with the average temperature data in Oceania. And I also stumbled upon other small errors in calculations.

About a week after I’d told the Met Office about these problems I received a response confirming that I was correct: a problem in the process of updating Met Office records had caused the wrong average temperatures to be reported. Last month the Met Office updated their public temperature records to include my corrections.

Labels: ,

Monday, February 15, 2010

The Times writes up my Met Office discoveries

Here's a major newspaper writing about what I found in the Met Office data:

A science blogger has uncovered a catalogue of errors in Met Office records that form a central part of the scientific evidence for global warming.

The mistakes, which led to the data from a large number of weather stations being discarded or misused, had been overlooked by professional scientists and were only
discovered when the Met Office’s Hadley Centre made data publicly available in December after the “climategate” e-mail row.

Thanks, Hannah Devlin.

And here's the bit I wrote:

The history of science is filled with stories of amateur scientists who made significant contributions. In 1937 the American amateur astronomer Grote Reber built a pioneering dish-shaped radio telescope in his back garden and produced the first radio map of the sky. And in the 19th century the existence of dominant and recessive genes was described by a priest, Gregor Mendel, after years of experimentation with pea plants.

But with the advent of powerful home computers, even the humble amateur like myself can make a contribution.


Update And now the story has been picked up by Nature. And Fox News.

Labels:

Climate Change Skepticism: You're doing it wrong

The following is a popular picture used by climate change skeptics to attempt to show that there's something seriously wrong with the the surface temperature record which is used to show that the world is getting hotter.


It appears to show that two weather stations with Stevenson screens are situated right at the end of the runway of Rome Ciampino. It's not hard to put two and two together and see that the wash from the engines of departing jets would cause the temperature indicated by the thermometers to be much too high.

Between the two Stevenson screened boxes is an automated weather observation station used by the airport. So it too would be affected by aircraft wash.

Now, any pilot will tell you that knowing the barometric pressure at the airport (as reported by the QFE code) and the local temperature are vital data in setting the altimeter correctly when landing. Aircraft altimeters work on atmospheric pressure and when approaching the airport the pilot is told the current pressure so they can set their instrument correctly.

The temperature also matters because it can affect the altimeter reading when the weather is cold. Pilots need to know both accurately to land safely. So does it seem likely that at Rome airport the weather station is heated by aircraft wash?

Of course not, and if you zoom out from that picture and orient it North/South (rather than South/North) you'll see a different picture:


You can make our the stations near the top left-middle of the picture. They are far from the runway and positioned near an aircraft parking area.

If you are going to be a skeptic go with the Wikipedia definition: A scientific (or empirical) skeptic is one who questions the reliability of certain kinds of claims by subjecting them to a systematic investigation.. One picture does not a systematic investigation make.

Update That picture was alluded to in a Sunday Times article this weekend:

Watts has also found examples overseas, such as the weather station at Rome airport, which catches the hot exhaust fumes emitted by taxiing jets.

And The Daily Telegraph has a similar story:

A weather station at Rome airport was found to catch the hot exhaust fumes emitted by taxiing jets.

That statement is inaccurate. The weather station is not near a taxiway, it's near a parking area. And not even a parking area next to the terminal building.

And even if it was, one bad thermometer doesn't mean climate change can be thrown out the window.

Labels:

Wednesday, February 10, 2010

The Rank Amateur

In 1937 an amateur American astronomer named Grote Reber completed construction of a 9 meter radio telescope in his back garden. By 1940 he had verified that there were radio signals coming from the heavens and by 1943 he had completed a radio frequency map of the sky. Reber, with his enormous hand-built dish, kick started radio astronomy and eventually sold his invention to the US government.

One of the biggest advances in the understanding of genetic inheritance was made by Gregor Mendel. Mendel was a Augustinian priest. In 1866 his paper on plant hybridization (Mendel had spent years observing and experimenting with pea plants) showed the existence of dominant and recessive genes. Mendel's discoveries went largely unnoticed until rediscovered two professional scienstists.

Amateurs like Reber and Mendel have made enormous contributions to science ever since science was called natural philosophy. So it's dismaying to see a professor from Oxford University write in The Guardian: "The most effective people at finding errors in scientific reasearch are scientists: it was professional glaciologists, after all, who exposed the error in the IPCC 2007 case study of Himalayan glaciers." To exclude the amateur is to deny a large part of the history of science.

Another amateur who made a big impact on science is Albert Einstein. Although Einstein had received a scientific education (after having been refused entry to the prestigious ETH Zurich) he was unable to find a research post and did all his pioneering work while working for the Swiss Patent Office.

I'm no Reber, Mendel or Einstein, but don't rule us amateurs out. In December 2009 the Met Office released thousands of records of temperature readings from around the globe stretching from the present day to 1850. These records form a vital part of the evidence that the globe is warming and the climate changing.

I thought it would be a fun hobby project to use those records to reproduce the worrying charts that show the increase in global temperatures. Since I'm a professional computer programmer I wrote software to process the Met Office data. You can see the result in this YouTube video.

Because I was working with unfamiliar data I put special functions into my program to ensure that I wasn't making any mistakes. To my surprise these functions began reporting that there was something wrong with temperature data in Australia and New Zealand. I whipped out a pocket calculator and checked that my program wasn't mistaken and then reported the problems to the Met Office. They quickly acknowledged that I was right.

Last month the Met Office released an update to CRUTEM3 and HADCRUT3, the critical data sets used to track global warming. The new version contains corrections for all the errors I reported.

Making a distinction between professional and amateur in science is artificial: what matters is the 'what' of science not the 'who'. And amateurs have by their very nature something that professionals don't need to have: passion. Without the comfort of a tenured position, a subsidized bed in an ivory tower, or a well funded laboratory, the only thing keeping amateurs going is a love for their subject.

PS In the comments a professional scientist wrote to object to my final paragraph. I urge you to read his comment since it makes good points. In my defense I didn't mean to say that professional scientists lack passion, just that that's all the amateurs have got. His point is that professionals need to have passion because the funding environment for science is so bad that they're certainly not in it for the money or security!

Labels: ,

Sunday, February 07, 2010

Something odd in the CRUTEM3 station errors

Out of the blue I got a comment on my blog about CRUTEM3 station errors. The commenter wanted to know if I'd tried to verify them: I said I hadn't since not all the underlying data for CRUTEM3 had been released. The commenter (who I now know to be someone called Ilya Goz) correctly pointed out that although a subset had been released, for some years and some locations on the globe that subset was in fact the entire set of data and so the errors could be checked.

Ilya went on to say that he was having a hard time reproducing the Met Office's numbers. I encouraged him to write a blog post with an example. He did that (and it looks like he had to create a blog to do it). Sitting in the departures lounge at SFO I read through his blog post and Brohan et al.. Ilya's reasoning seemed sound, his example was clear and I checked his underlying data against that given by the Met Office.

The trouble was Ilya's numbers didn't match the Met Office's. And his numbers weren't off by a constant factor or constant difference. They followed a similar pattern to the Met Office's, but they were not correct. At first I assumed Ilya was wrong and so I checked and double checked has calculations. His calculations looked right; the Met Office numbers looked wrong.

Then I wrote out the mathematics from the Brohan et al. paper and looked for where the error could be. And I found the source. I quickly emailed Ilya and boarded the plane to dream of CRUTEM and HadCRUT as I tried to sleep upright.

Mathematical Interlude

The station error consists of three components: the measurement error, the homogenisation error and the normal error. The first two are estimated in the paper as 0.03°C and 0.4°C respectively. The normal error is calculated from the standard deviation information in the station files.

The formula for the normal error for a single month, i, is as follows:



Unfortunately, the paper uses rather sloppy mathematical language because the N on the left is not the N on the right, the subscript i isn't defined, and so I am going to express this a bit more clearly as follows:



This means that normal error for month i is the standard deviation for month i (that's σi) divided by the square root of the number of years used to generate the normal values in the station files (which I call mi). Typically we have:



because 30 years of data from 1961 to 1990 are used. In cases where less than 30 years are available (because of missing data) then a number less than 30 is used.

Now to get the station error, εi, the three error components are joined together by quadrature as follows:



That works for any grid square where for any month there's just a single station reporting a temperature, but in general there are more. So when there are many station errors they are averaged using a root mean square and then divided by the square root of the number of stations.

Suppose there are n stations each with a station error εi,j (to which I've added the subscript j to differentiate them) then the final station error for a month i is as follows:




Return to narrative

What Ilya had discovered was that the formula above (from the paper) works only when there is a single station in a grid square. When there were two or more it failed; that's when he approached me asking for help.

What I discovered at the airport was that if you replaced the number 30 with 15 the formula worked and the values for station errors for grid squares containing exactly two stations were now correct.

Both Ilya and I came to the same conclusion that in fact the number 15 wasn't picked from thin air, but in fact was 30 divided by 2 (the number of stations in the grid square). We both tested this hypothesis on squares with more than two stations and found that it worked.

So it appears that the normal error used as part of the calculation of the station error is being scaled by the number of stations in the grid square. This leads to an odd situation that Ilya noted: the more stations in a square the worse the error range. That's counterintuitive, you'd expect the more observations the better estimate you'd have.

Examples

Ilya had shown me an example in 1947, but I didn't want to take his word for it (although he later showed me a program to check all the stations errors so I should have believed him), and so I took a look at three locations in January 1850. For these three locations all the data underlying CRUTEM3 had been released:

1. The grid square which consists of the single station 723660: this corresponds to the grid square with corner 35N, 105W. Here the Met Office data gives station errors of: 0.5072 0.5424 0.4857 0.4962 -1e+30 -1e+30 0.4407 0.4407 -1e+30 0.4756 -1e+30 0.5186. The strange negative numbers are missing data (it's missing because in the underlying file there are no normals for 1850 in those months, although the actual normals aren't needed for the station error calculation so it doesn't matter). Using the formula from the paper give the correct answer: 0.5072 0.5424 0.4857 0.4962 0.4486 0.4756 0.4407 0.4407 0.4661 0.4756 0.5072 0.5186. This makes sense since our correction value of 1 for 1 station in the square doesn't change the formula.

There is, however, something else wrong with this. The paper says that if less than 30 years of data are available the number mi should be set to the number of years. In 723660 there are only 17 years of data, so this station error appears to have been incorrectly calculated based on 30 years.

2. The grid square which consists of the two stations 753041, 756439: this corresponds to the grid square with corner 35N, 80W. Here the Met Office data gives station errors of: 0.6168 0.569 0.5452 0.4008 0.4345 0.3642 0.3373 0.353 0.3881 0.4624 0.4076 0.5767 and using the formula from the paper (without our correction): 0.4801 0.4496 0.4346 0.3472 0.3669 0.3264 0.3116 0.3202 0.3399 0.3836 0.3511 0.4545. If a correction of 2 is used so that each σi is divided by the square root of 15 instead of 30 the correct values are generated.

3. The grid square which consists of the four stations 720388, 724080, 756192, 756490: this corresponds to the grid square with corner 35N, 75W. Here the Met Office data gives station errors of: 0.5073 0.4409 0.4329 0.3361 0.3286 0.2905 0.2712 0.2807 0.2973 0.3739 0.3325 0.4613 and using the formula from the paper (without our correction): 0.3074 0.2807 0.2775 0.2417 0.2391 0.2264 0.2204 0.2233 0.2286 0.2552 0.2404 0.2887. If a correction of 4 is used so that each σi is divided by the square root of 7.5 instead of 30 the correct values are generated.

Conclusion

I have no idea why the correction given in this blog post by Ilya and I works: perhaps it indicates a genuine bug in the software used to generate CRUTEM3, perhaps it means Ilya and I have failed to understand something, or perhaps it indicates a missing explanation from Brohan et al. I also don't understand why when there are less than 30 years of data the number 30 appears to still be used.

If these are bugs then it indicates that CRUTEM3 will need to be reissued because the error ranges will be all wrong.

I've emailed the Met Office asking them to help. If you see an error in our working please let us know!

Labels:

Friday, January 29, 2010

New version of CRUTEM3 and HADCRUT3

There's a new version of the Met Office land surface temperature record out with lots and lots more stations.

Plus it includes corrections for all the problems I found with the data (they didn't make good on their promise to acknowledge me, sadly).

But my handiwork is shown by the points in green:


My two corrections: A and B.

I'll run these through my own programs to see what they produce.

Labels:

Saturday, January 23, 2010

A not very illuminating reply from the Met Office

On the 15th I posted about six additional stations that can be used with the Met Office land surface temperature record. The Met Office kindly replied to my query about the six saying that they could be used despite the missing standard deviations.

I followed up with this query:

Thank you. I'll post on note on my blog with your reply.
Was there a particular rationale for using 16 instead of 15?

They have now replied. Unfortunately, the reply doesn't really shed any light on the situation because they don't say why 16 vs. 15 just that they were calculated separately:

Thank you for your email.

The normals and standard deviations were calculated separately and the limits (15 years and 16 years) were set independent of one another.

I wonder why? Brohan et al. 2006 clearly says 15 is the limit:

(the requirement now is simply to have at least 15 years of data in this period)

I just might be possible that the Met Office isn't telling my why because the why could be a bug. Since there are two programs this could be one of those classic off by one errors that crop up in programming all the time.

It's not hard to imagine the normals program doing

if ( number_of_years >= 15 )
...

and the standard deviation program doing

if ( number_of_years > 15 )
...

Equally that's almost groundless speculation on my part and perhaps there's some other good reason that the Met Office decided not, or hasn't taken the time, to tell me about.

Either way the six stations can be used.

Labels:

Friday, January 15, 2010

Met Office has confirmed that it's ok to use the extra six stations

I wrote the other day about files that have normals but no standard deviations in the Met Office land surface temperature record. In parallel, I asked the Met Office to double check my working:

It appears that there are a small number of stations in the file that have normals but no standard deviations. Looking at just those whose 'Normals source' is 'Data' it appears there are six where it should be possible to calculate the standard deviations (since the normals are being calculated from the 1961 to 1990 data): 104880, 606700, 680140, 829830, 835790, and 961090. In each case it would appear that there's enough data in the 1961 to 1990 period to meet the '15 years of data' criteria in Brohan et al. 2006. And given that there are normals generated from 'Data', it would appear that you could get the standard deviations.

Is there any reason why I can't calculate them and safely include these six files? Both your code and my code currently discard these stations because the standard deviations are missing.

They've been kind enough to reply:

When the station standard deviations were calculated, a slightly different criterion was used to judge what was a sufficient number of years: 16 years was used instead of 15 years. There is little harm in relaxing that criterion as it appears only to affect these stations.

I've followed up asking if there was a rationale for 15 for normals, but 16 for standard deviations. But looks like those stations can be safely included.

Update The Met Office has replied to the 16 vs. 15 question.

Labels:

Monday, January 11, 2010

Six additional stations for the Met Office land surface climate station record

Running through some final diagnostics on the Met Office land surface climate station records I revisited a minor issue that had been in the back of my mind: some of the stations have 'normals' but 'no standard deviations'.

There are 39 stations that fall into that category. Of those 30 have normals from WMO data, 3 are 'extrapolated' and 6 come from the data itself ('Data'). The final six are interesting because if the normals are from the 1961-1990 data present in the station file itself it should be possible to calculate the standard deviations as well.

The six files that are affected are: 10/104880, 60/606700, 68/680140, 82/829830, 83/835790, 96/961090.

Since these files have no standard deviations they are not being used by my program, or the program released by the Met Office. However, it is possible to calculate the standard deviations for all those locations because there is 15 years of data for each month between 1961 and 1990 (that's the criteria in Brohan et al. 2006.

So here for your use are the standard deviations for those files (one decimal place of accuracy):

10/104880: 3.6 3.3 2.4 1.1 1.4 1.2 1.7 1.1 1.5 1.3 1.5 1.8
60/606700: 1.8 1.9 1.7 1.4 1.2 0.9 1.0 0.7 0.7 1.3 1.6 1.7
68/680140: 1.5 1.3 0.9 1.0 1.0 1.1 0.7 1.0 1.0 0.8 1.0 1.0
82/829830: 1.0 1.4 0.8 0.9 1.0 1.0 0.6 0.7 0.7 1.2 0.9 1.4
83/835790: 1.5 1.5 1.1 1.8 1.2 1.2 2.2 1.1 1.7 1.2 1.1 0.7
96/961090: 0.7 0.6 0.6 0.6 0.6 0.6 0.5 0.5 0.4 0.5 0.6 0.5


Update The Met Office says it's OK to use these stations.

Labels:

Thursday, January 07, 2010

Reply from the Met Office regarding the 'bug' I thought I had found

A few days ago I posted what I thought was a bug in code from the Met Office. It turns out that the code was not in error, the Met Office explanation of what the fields are was. Here's the Met Office reply:

The bug isn't a bug. That is what the code is supposed to do.
When we first put this web page out:

http://www.metoffice.gov.uk/climatechange/science/monitoring/subsets.html

We mistakenly said that data before the "first good year" were
not used. This was not true and we have since amended the page.

So, what looked like a bug was an error in the documentation given by the Met Office.

PS At the time of writing the page does not appear to have been amended (it still talks about the First Good Year), nor does it seem to acknowledge the real dataset problem I found.

Labels:

Wednesday, December 23, 2009

Phew! Got the limited coverage error sorted out

I had been worried about reproducing the error range shown in Brohan et al. section 6.1 because I was getting much larger error bars than in the paper.

But I wrote some tests and dug into the code and discovered a problem where my regridder/subsampler was ignoring some data because of a difference in the way longitude was reported between my gridding program and the NetCDF file from the reanalysis data.

Bottom line: I now get values much, much closer to the published information and all my worries about the temperature for 2009 appearing inside the error bars for the 1860s are gone.

Phew.

Here's the new chart showing the smoothed trend line with 95% confidence bars.


And here for comparison is the chart from the paper (mine is northern hemisphere and this is global but you can clearly see the similarity now).


Now, I can retire from amateur climatology... I've worked through Brohan et al. using the Met Office data, found a few problems, but mostly reproduced their results.

Labels:

Tuesday, December 22, 2009

And now for a bug in my code

There was a bug in my code that caused the global trend graph to be wrong. When I added the cosine weighting I hadn't updated the code that outputted the file for gnuplot for the global trend (it was correct for the northern and southern hemisphere). This is what happens when you hack things together and don't write a test suite. Slap on the wrist.

The corrected code is now in the repository.

Here's the corrected comparison between the output of my program and the output of the Met Office program (with my bug fix to their code).


Now that's a pretty picture.

There are some very small differences that could probably be looked into, but I'm getting a little tired and this is looking really nice now.

Labels:

There's a hole in my bucket, dear Liza, dear Liza

So the Met Office released source code for analysis of the recently released land surface temperature data and there appears to be a bug in it.

If you take a look at lines 87-91 of station_gridder.perl there's a loop that reads data from the observation files and extract data between the start and end years. Unfortunately, this appears to be wrong and the program ends up reading suspect data and using it.

# Push anomaly for each year and month to @GridA
for (
my $i = $Station->{start_year} ;
$i <= $Station->{end_year} ;
$i++
)

The $Station hash (actually hash reference) contains entries for start_year, end_year and first_good_year. These correspond to the entries Start year, End year and First Good year in the observation files.

The First Good year is documented as "First Good Year — data before that year are suspect." (see here). My program uses that to remove any suspect data, the Met Office version does not.

This means that it adds suspect data to the averages. I don't know if this really matters, but since they say data before those years is suspect I was assuming that it shouldn't be used.

You can fix the program by changing the lines to:

# Push anomaly for each year and month to @GridA
for (
my $i = $Station->{first_good_year} ;
$i <= $Station->{end_year} ;
$i++
)

If you run the two versions you'll see a slight change in the trend (which affects the early period when data was considered suspect). Here's a chart showing the original version (the red line) and the corrected version (the green line).


Notice something funny? There's a gap at 1855. In fact there's no data output for 1855. Digging in, this turns out to happen because there are no valid southern hemisphere measurements at all in 1855.

Hence there's no global average for 1855.

That's a bit odd, but not serious. But it makes me suspect something: I'll bet a mince pie that this code the Met Office has released is not the code they actually use to create CRUTEM3. I bet they wrote it especially for this release.

Of course, I could be wrong about that.

UPDATE. See this blog posting for the Met Office's reply. Looks like the bug is not a bug, it's an error in their documentation.

Labels:

The Met Office source code

The Met Office has released the source code for analysis of the land surface temperature data.

It consists of two Perl scripts: station_gridder.perl and make_global_average_ts_ascii.perl.

The first one produces the gridded output for the temperature anomalies across the globe by year since 1850. The second takes the output of the first and produces a text file that can shows the global temperature anomaly since 1850.

I've run them both on the same data as my program (and produced an annual average version of the output of my script). Here's a graph that shows their trend (in red) and my trend (in green). Nice, I'm getting essentially the same results as they are.


Note. The output of station_gridder.perl is similar to the current CRUTEM3 file, but not the same. There are small differences.

Here's a graph that compares CRUTEM3 (in green) and the output of station_gridder.perl (in red) on the released data.


And finally a plot of all three data munches: CRUTEM3 (in green), station_gridder.perl (in red) and me (in blue):

Labels:

Update to my program to analyze the Met Office data

I've pushed an update to the script to the project. It adds reading, verifying and using the standard deviation data. The standard deviations are used to remove outlying temperature observations as defined in Brohan et al.

If an observation is greater than 5 sigma from the normal then it is dropped.

I've recomputed everything and it makes a very minor difference to the results. Here's a graph showing the northern and southern hemisphere and global trends smoothed from the new data. It's barely different from before. But at least I'm doing what's specified in the paper.


Red is northern hemisphere, green is southern and blue is global.

I'm still worried about the limited coverage error and I'm still don't fully get the Met Office response. Will post more when I hear from them.

Here's the updated trend chart for the northern hemisphere with the error bars for 95% confidence from the sub-sampling:


UPDATE: Since I only have land data the chart I should probably be comparing with in Brohan et al. is this one (top chart from Figure 12):


This looks a lot more like the errors shown in my chart, now it's just a question of accounting for the magnitude, since for the 1860s this chart shows an error of about 0.3C whereas my chart has more like 1.4C.

So need to track that down.

If you also look at Figure 12 you can see that the anomaly errors for the sea component of HadCRUT3 are really minimal. That probably explains why the global chart I was looking at before didn't have the same error range as my analysis. Need to stay just looking at the land data.

Labels:

Monday, December 21, 2009

Climate change skeptics / deniers pay better

I don't make any real money from my blog ads, in fact I make pennies. Until this last month when I've been writing about climate change. If I track the incoming links to my site and correlate with advertising revenue look what I find when I examine all clicks since December 1:


The top two sites there are blogs that cover climate change from a skeptical angle. The third is the general URL site StumbleUpon.

So the blogs account for $3.04 and StumbleUpon for $0.04 (all the other referrers resulted in $0.00). Wow, those climate change skeptics account for 98.7% of my ad revenue (and, by the way, a typical month for me is $0.50 in revenue). I made an additional $0.28 from people who came directly to my site.

So, thanks, climate change skeptics.

I wonder if this implies something about gullibility.

Labels:

The bipolar world

An article on a web site I'd not previously seen called American Thinker says the following about me:

(There are also efforts by true believers to justify the code. Try following the logic of the post in that last link.)

So, I'm a climate change 'true believer' am I? You mean because I blogged something that doesn't agree with your interpretation of the facts I must be from the other side?

Well, guess what. I don't believe in this bipolar world of yours where you're with us or against us, pro-choice or pro-life, or, frankly, any of the other ridiculous black or white notions beloved of people who get involved in politics (of any kind).

If I was a 'true believer', pray tell, why I would have analyzed raw data from the Met Office and found an error in it, or gone on TV in the UK and criticized the quality of code taken from CRU, blogged about all the errors in it?

My take on global warming is... unless you can demonstrate to me that it's false I'm going to believe the scientists who've been working on it. Pretty much the same way I do about any other bit of science. That's how science works, unlike politics.

Labels: ,

The full respone from the Met Office

Here's my original mail to the Met Office and the full reply.

I suppose I need to begin this by declaring that I'm not a climate change nutjob... I am a mathematician by training who's had a great deal of fun using your recently released land surface dataset to reproduce some of your gridded data. If you are curious about what I did with your data, this YouTube video I made will take 9 minutes of your time and tell you about it:
http://www.jgc.org/blog/2009/12/met-office-land-surface-temperature.html

A couple of questions have arisen, and I'm hopeful that you can answer them for me.

1. I've noticed that there seems to be a big difference between the 'Normals' given in many of the datafiles for Australisia and the actual normal values calculated from the 1961-1990 data. See for example, this blog of entry of mine about one of them:
http://www.jgc.org/blog/2009/12/theres-something-seriously-odd-about.html

Do you know of any issues with these values?

2. In following through the calculations in section 6.1 of the Brohan paper I'm surprised that the sampling error isn't much greater for the mid-1800s. In the mid-1800s there were less than 100 stations reporting temperature and yet if you look at Figure 11 (top) in the paper the green band is the 95% error value based on sampling error.

It appears to be of similar size no matter what year is being examined. Yet my own recalculation of the values (by sub-sampling the NCEP/NCAR dataset) show that the standard deviation in the anomalies is about 1 whereas for 2009 it's around 0.05. Intuitively this makes sense given that the number of stations increased greatly over the years. Do you know why this isn't reflected in the paper?

3. The sub-sampling of NCEP/NCAR also gives a mean value for the sampling error. The paper doesn't seem to talk about using that mean value to adjust the calculated values. Is that correct? It would seem to me that you'd want to use the mean to adjust for sampling error. If you do it reduces the temperatures up until the mid-1970s by around 0.5C and then has a small effect on the warming trend after that. Is it reasonable to use the mean from the sub-sampled data in that way?

Thank you for taking the time to answer me questions and Merry Christmas.

Cheers,
John.

And the full reply:

Dear John,

Thank you for your interest in the data.

1. First off, thank you for bringing this to our attention. We have undertaken further investigation upon the full dataset and confirmed this. The error affects <1% of the network and is primarily in Oceania. It arises because normals were calculated outside of the update cycle and the normals for these stations were not updated when extra data were added in the normals period as CRUTEM3 was being finalised for publication.

We intend to add this information to our online Q and A for the data and we would like to credit you with pointing out the error. Would you be happy to be mentioned in this way?

2. Figure 11 shows annual hemispheric-averages combined land and sea-surface temperature data, which have been smoothed using a 21-point binomial filter. A large proportion of the coverage error (the green area on the diagram) arises because there are few observations over the Arctic and Antarctic. Temperatures in these areas exhibit high variability and therefore contribute significantly to the uncertainty on estimates of hemispheric and global average temperature. Because this is a large component of the uncertainty on global average temperatures and because coverage at high latitudes is still relatively poor, the uncertainty range is not much narrower now than it was in the 19th century.

3. We do not use the mean NCEP error to 'correct' the data because it is important that CRUTEM3 and HadCRUT3 provide an observational estimate of temperature change that is independent of all models. Furthermore, the mean error would only be representative of changes during the period covered by the reanalysis and not applicable outside this range.

Best regards and Merry Christmas,

Tim Hill

I'm still not sure I 100% understand part 2 there, and I've sent a follow-up question to the Met Office. I'm guessing from their reply that the sub-sampling mentioned in the Brohan et al. paper isn't done in a simple fashion (as I had imagined) since they are specifically talking there about taking into account the variability at the high latitudes.

Will publish their response when I get it.

Labels: ,

Friday, December 18, 2009

Well, I was right about one thing

Just received a nice mail from the Met Office in response to my queries about the data showing that I was right about one thing: there is something odd about the values in Australasia (or as they say, Oceania).

I had written to them saying:

I've noticed that there seems to be a big difference between the 'Normals' given in many of the datafiles for Australisia and the actual normal values calculated from the 1961-1990 data. See for example, this blog of entry of mine about one of them:
http://www.jgc.org/blog/2009/12/theres-something-seriously-odd-about.html

Do you know of any issues with these values?

Tonight they have replied:

First off, thank you for bringing this to our attention. We have undertaken further investigation upon the full dataset and confirmed this. The error affects <1% of the network and is primarily in Oceania. It arises because normals were calculated outside of the update cycle and the normals for these stations were not updated when extra data were added in the normals period as CRUTEM3 was being finalised for publication.

We intend to add this information to our online Q and A for the data and we would like to credit you with pointing out the error. Would you be happy to be mentioned in this way?

Wow. I shall now pat myself on the back, drink a little toast to Perl and openness in science, and go to bed.

Labels: ,

Thursday, December 17, 2009

Adjusting for coverage bias and smoothing the Met Office data

As I've worked through Uncertainty estimates in regional and global observed temperature changes: a new dataset from 1850 to reproduce the work done by the Met Office I've come up against something I don't understand. I've written to the Met Office about it, but until I get a reply this blog post is to ask for opinions from any of my dear readers.

In section 6.1 Brohan et al. talk about the problem of coverage bias. If you read this blog post you'll see that in the 1800s there weren't many temperature stations operating and so only a small fraction of the Earth's surface was being observed. There was a very big jump in the number of stations operating in the 1950s.

That means that when using data to estimate the global (or hemispheric) temperature anomaly you need to take into account some error based on how well a small number of stations act as a proxy for the actual temperature over the whole globe. I'm calling this the coverage bias.

To estimate that Brohan et al. use the NCEP/NCAR 40-Year Reanalysis Project data to get an estimate of the error for the groups of stations operating in any year. Using that data it's possible on a year by year basis to calculate the mean error caused by limited coverage and its standard deviation (assuming a normal distribution).

I've now done the same analysis and I have two problems:

1. I get much wider error range for the 1800s than is seen in the paper.

2. I don't understand why the mean error isn't taken into account.

Note that in the rest of this entry I am using smoothed data as described by the Met Office here. I am applying the same 21 point filter to the data to smooth it. My data starts at 1860 because the first 10 years are being used to 'prime' the filter. I extend the data as described on that page.

First here's the smooth trend line for the northern hemisphere temperature anomaly derived from the Met Office data as I have done in other blog posts and without taking into account the coverage bias.


And here's the chart showing the number of stations reporting temperatures by year (again this is smoothed using the same process).


Just looking at that chart you can see that there were very few stations reporting temperature in the mid-1800s and so you'd expect a large error when trying to extrapolate to the entire northern hemisphere.

This chart shows the number of stations by year (as in the previous chart), it's the green line, and then the mean error because of the coverage bias (red line). For example, in 1860 the coverage bias error is just under 0.4C (meaning that if you use the 1860 stations to get to the northern hemisphere anomaly you'll be too hot by about 0.4C. You can see that as the number of stations increases and global coverage improves the error drops.


And more interesting still is the coverage bias error with error bars showing one standard deviation. As you might expect the error is much greater when there are fewer stations and settles down as the number increases. With lots of stations you get a mean error near 0 with very little variation: i.e. it's a good sample.


Now, to put all this together I take the mean coverage bias error for each year and use it to adjust the values from the Met Office data. This causes a small downward change which emphasizes that warming appears to have started around 1900. The adjusted data is the green line.


Now if you plot just the adjusted data but put back in the error bars (and this time the error bars are 1.96 standard deviations since the published literature uses a 95% confidence) you get the following picture:


And now I'm worried because something's wrong, or at least something's different.

1. The published paper on HadCRUT3 doesn't show error bars anything like this for the 1800s. In fact the picture (below) shows almost no difference in the error range (green area) when the coverage is very, very small.

2. The paper doesn't talk about adjusting using the mean.

So I think there are two possibilities:

A. There's an error in the paper and I've managed to find it. I consider this a remote possibility and I'd be astonished if I'm actually right and the peer reviewed paper is wrong.

B. There's something wrong in my program in calculating the error range from the sub-sampling data.

If I am right and the paper is wrong there's a scary conclusion... take a look at the error bars for 1860 and scan your eyes right to the present day. The current temperature is within the error range for 1860 making it difficult to say that we know that it's hotter today than 150 years ago. The trend is clearly upwards but the limited coverage appears to say that we can't be sure.

So, dear readers, is there someone else out there who can double check my work? Go do the sub-sampling yourself and see if you can reproduce the published data. Read the paper and tell me the error of my ways.

UPDATE It suddenly occurred to me that the adjustment that they are probably using isn't the standard deviation but the standard error. I'll need to rerun the numbers to see what the shape looks like, but it should reduce the error bounds a lot.

UPDATE Here's what the last graph looks like if I swap out the standard deviation for the standard error.


That's more like it, I'm going to guess that this what Brohan et al. are doing (without saying it explicitly). But that doesn't explain why their error seems to remain constant. Anyone help with that?

UPDATE The Met Office has replied to my email with an explanation of what's going on with the mean and standard deviation and I'll post it shortly.

UPDATE Please read this post which shows that my code contained an error in interpreting longitude which results in a chart that looks like the one from the Met Office.

Labels: ,

Data Visualization Disease

A few days ago I moaned about an inaccurate and ininterpretable visualization appearing in a book touting its own excellence at visualization. Now, I'm pointed to a visualization of the recently released Met Office land surface temperature record that makes similar mistakes.

Folks, data visualization isn't about pretty colours, or slapping some data into a CSV and asking Excel to make you a line graph. It's about thinking about how the data needs to be interpreted and then creating an appropriate visualization. Many of the 'infoporn' graphics that adorn the blogs and magazines of the digerati (a pejorative term) are little more than the fantasies of a graphic designer sprinkled with some magical 'data' or 'statistics' pixie dust.

But these designers shouldn't be messing around with magic like that. They aren't trained to handle it, Hermione.

Here's the first graph from the blog. It appears to show that it's 10C hotter now than in the 1800s. Holy cow, Batman, the Earth's on fire!


It's all wrong.

All they've done is averaged the temperature readings from across the globe to try to get a sense of global warming. Averages are fun because any fool can calculate them, but pity the fool who averages without thinking. Some questions:

1. Did they ask themselves about the distribution of temperature readings across the globe to ensure that the average correctly reflected the entire Earth's surface? For example, are there lots of thermometers clustered close to each other that might bias the average?

2. Did they ponder the fact that there's much more land in the northern hemisphere, hence many more readings, hence without weighting the average is dominated by northern climes?

3. Did they ask themselves if an average is what you want? Is it reasonable to take the temperature in London in December and the temperature in Sydney in December and average them? Given that it's winter up north and summer down south what does an average tell you?

4. Did they ever ask themselves why the standard deviation is so freakin' huge (see the 2008 numbers in the graph above)?

No, they made a CSV file and graphed it. And since they get some 'warming' out of it they are happy.

This is what I call Data Visualization Disease. You grab some data, you think of a fancy (or not so fancy) way to show it. You shade that it in pastel colours you picked by wandering around Habitat, label it in a sans-serif font, and you're a God of visualization.

What they should have done is taken the thermometer readings, calculated a long term average for each location, calculated the difference between each reading and the average (to understand how much temperature has changed, not the absolute values), mapped those onto a grid laid across the Earth's surface, averaged (perhaps with variance adjustment) values from all the thermometers in each grid square to get a grid anomaly value, then produced a weighted average for the hemispheres based on weighting by the cosine of the latitude (since the grid box area varies with latitude) to get hemisphere averages.

Then they could have plotted that.

But there's no infoporn in doing that, that sounds like actual work, and worse, thinking. Phew! No, thanks. Pass the Crayola.

Update: since writing this rant I've seen that the blog I'm criticizing has listened to the complaints of people who pointed out similar problems.

Labels: ,

Monday, December 14, 2009

An open source project for my Met Office data analyzer

Since some other people have been playing with my little Perl program to analyze the Met Office land surface temperature data, I've registered a project at SourceForge so that others can work with me on it.

I've also imported my latest version of the script which outputs data about the number of stations used to create the gridding data, and does cosine weighting of the northern and southern hemisphere trend data.

It can all be found at Land Surface Temperature Analyzer.

Labels: , ,

One more thing about the Met Office Land Surface Temperature data

If you've been following my posts you might have spotted an oddity: if you run the animation of gridding since 1850 it's pretty clear that there weren't many stations going into the mix up until the 1950s.

This introduces uncertainty when calculating the hemisphere and global figures. To get an idea about how little coverage there was, here's a graph showing the average number of stations used for calculating the monthly trend since 1850 (I've averaged over a year so that the graph is smaller).


In the 1850s there were around 50 stations to cover the whole world. By the 1990 there are over 1400. So the question is, how much uncertainty do the relative paucity of measurements in the 1850s introduce?

The answer in the published literature (see this paper section 6.1 for details) is 'very little'. If you take a look at the Figure 10 (below) from that paper the green error seems almost unchanged from the 1850s to today.


Since that's counter-intuitive that looks like a good place to start in checking the calculations performed. Would you expect 50 stations to give the same accuracy as 1400?

I really need to find the time to process the NCEP/NCAR 40-Year Reanalysis Project data and perform my own calculation of the uncertainty. If anyone else beats me to it, please let me know!

Labels: ,

Friday, December 11, 2009

Met Office Land Surface Temperature Data: The Video

If you don't have all the time to follow all my blog posts on messing with the Met Office data, I've made you a 9 minute YouTube that gives you the highlights...

Labels: ,

Thursday, December 10, 2009

Source code for processing the Met Office Land Surface Temperature data

The source code used to validate the Met Office data and produce all the visualizations on this blog is here. Enjoy!

This code does the following:

1. Reads and validates the Met Office Land Surface Temperature data file.

2. Spits out errors if it finds problems with the data.

3. Produces a Google Maps/Google Earth compatible KML file with pin marks of the locations of the weather stations used in step 4.

4. Performs gridding of temperature data on a 5 degree square grid.

5. Produces a Google Maps/Google Earth compatible KML file with gridded data for October 2009 to match the latest visualization from the Met Office. This gridding size can be adjusted and any month/year chosen.

6. Dumps CSV files for every weather station in 4 showing month by month anomaly data.

7. Dumps gnuplot compatible .dat files for northern and southern hemisphere and global temperature anomalies since 1850. These are used to produce these visualizations. Note that this does not do cosine-weighting of the grid temperatures (as in the the published literature). Adding it would be simple, but even without it the trend is clear.

8. Produces an experimental animated KML file showing the change in anomaly for October for every year since 1850 to 2009. My machine isn't powerful enough to run this through Google Earth very successfully so I can't guarantee that this is perfect.

If you do use it please refer back to me and this blog.

Labels: ,

There's something seriously odd about "NAPIER NELSON PK"

If you are messing with the Met Office temperature data there's one file which is really odd: 93/933710. It has temperature data for NAPIER NELSON PK at (-39.5, -176.8) There is actually a Napier Nelson Park in New Zealand but not quite at those coordinates. And I can't find a reference to a WMO station with the number 933710.

But leave that aside.

The really odd thing is the data in the file. There's a mismatch between the 1961-1990 data (which is present and complete) and the Normals (i.e. the averages for 1961-1990). According to the file the Normals come from the data itself, but they are off: almost consistently by 1C.

Here are the differences (Normals as is reported; Calculated is my calculation from the file):

Month Normals Calculated Difference

Jan 19.5 18.31 -1.19
Feb 19.0 17.94 -1.06
Mar 17.8 16.68 -1.12
Apr 14.8 13.85 -0.95
May 12.0 10.87 -1.13
Jun 9.7 8.55 -1.15
Jul 9.0 8.05 -0.95
Sep 11.9 10.88 -1.02
Oct 14.1 13.04 -1.06
Nov 16.2 15.05 -1.15
Dec 18.2 16.94 -1.26

So the normal temperature for this station is 1C higher than the observations indicate. That would end up meaning that any trend is actually lower than the real figures.

Very odd. And very odd that's almost exactly 1C off. Why? Some systematic error? Human intervention?

Labels: ,

Reconstruction of the 1850 to present day warming trend from Met Office data

Having got the gridding working of the recently released Met Office Land Surface Temperature data it was a short step to reconstruct the temperature trends for 1850 to the present day.

I've performed the same gridding as the HadCRUT3 dataset with one exception: I have not removed outliers (the papers on the subject describe removing outliers in the anomaly data that are greater than five standard deviations from the normals). I've left outliers in just to get a feel for the data as is, without clean up. That means that the graphs below are a bit more noisy than in the published literature, but the warming trends are clear.

Here's the northern hemisphere chart:


and here's the (less dramatic) southern hemisphere chart:

and here's the global chart (which is taken by averaging the north and south on a month by month basis):

Labels: ,

Tuesday, December 08, 2009

A first look at gridded data from the Met Office Land Surface Temperature Record

Well, I've got it working and here's a KML file for you to explore in Google Earth. When I say 'it' I mean:

1. Extract the data from the Met Office files

2. Check the Normals

3. Calculate anomaly data for all stations

4. Grid data onto 5 degree square portions of globe using algorithm in the HadCRUT3 paper

5. Turn all that into a coloured KML file for display in Google Earth

And here it is (that is the gridded anomaly data for October 2009 with the 1961-1990 average baseline):


For comparison here's the Met Office's higher resolution picture for the same period. Just staring at the two you can see that approximately the same thing is being plotted with western Europe warmer and Scandinavia and central Europe cooler (you can just make out the same cool spot in Scotland on both).


Phew. That was hard work.

I'll release the code once I've convinced myself that it works correctly.

Labels:

Problems to watch for in the Met Office Land Surface Temperature Data

As I've been working through verifying the integrity of this data I've noticed a number of problems/gotchas that you'll need to watch for.

These have come up while verifying the 'Normals' data which should be the monthly average data for 1961 to 1990 where there's data and at least 15 years worth of data available (see Uncertainty estimates in regional and global observed temperature changes: a new dataset from 1850 for details of how the calculations should be performed).

1. If the Normals source is Data then the normals values have been calculated from within the file itself. You should be able to verify (with appropriate rounding to one decimal place) the averages on a month by month basis. I have done this.

2. If the Normals source is WMO or Extrapolated then the normals values came from the WMO or from the extrapolation by A Grid Point Surface Air Temperature Data Set for the Northern Hemisphere. You will not be able to check these against the data in the files and there are significant variances (sometime of the order of 1 or 2 degrees).

A question for the Met Office is how they work with data series that have an average drawn from a different series of data. If the average is off by 1 or 2 degrees for these data points what's the resulting influence on the final data or error bars?

Concrete example is 48/489300 where there are 16 readings between 1961 and 1990 giving an average value for February of 20.6C, but the WMO data gives a value of 19.1C (variance of 1.5C).

Also, in that file the average comes from WMO, but the standard deviation from the data in the file. That's odd.

3. There's something odd about Australia and New Zealand. Specifically in the files 93/* and 94/* files there are lots of variances between the calculated normals for these areas and the reported normals. The differences are of the order of fractions of a degree (although there are some up to 1C).

Here's the full output of my program reporting anomalies:

31/314160: Normals -0.1 != -0.00333333333333334 (diff 0.0966666666666667) (mon 3)
35/357460: Normals -0.1 != -0.00999999999999999 (diff 0.09) (mon 10)
44/442300: Normals -0.1 != -0.0285714285714286 (diff 0.0714285714285714) (mon 9)
47/474260: Normals -0.1 != -0.00666666666666668 (diff 0.0933333333333333) (mon 2)
93/930120: Normals 19.3 != 19.45 (diff 0.150000000000002) (mon 0)
93/930120: Normals 19.8 != 19.97 (diff 0.169999999999995) (mon 1)
93/930120: Normals 19.0 != 19.0966666666667 (diff 0.0966666666666676) (mon 2)
93/930120: Normals 16.7 != 16.85 (diff 0.150000000000002) (mon 3)
93/930120: Normals 14.4 != 14.5366666666667 (diff 0.136666666666663) (mon 4)
93/930120: Normals 11.7 != 11.77 (diff 0.0700000000000021) (mon 6)
93/930120: Normals 12.0 != 12.1233333333333 (diff 0.123333333333331) (mon 7)
93/930120: Normals 12.8 != 13.0033333333333 (diff 0.203333333333335) (mon 8)
93/930120: Normals 14.1 != 14.3666666666667 (diff 0.266666666666666) (mon 9)
93/930120: Normals 15.8 != 15.98 (diff 0.18) (mon 10)
93/930120: Normals 17.7 != 17.8166666666667 (diff 0.116666666666671) (mon 11)
93/931190: Normals 19.3 != 19.4533333333333 (diff 0.153333333333332) (mon 0)
93/931190: Normals 16.3 != 16.21 (diff -0.0899999999999999) (mon 3)
93/931190: Normals 10.8 != 10.6533333333333 (diff -0.146666666666665) (mon 6)
93/931190: Normals 11.5 != 11.4 (diff -0.0999999999999996) (mon 7)
93/931190: Normals 16.0 != 16.0966666666667 (diff 0.0966666666666676) (mon 10)
93/932920: Normals 19.0 != 19.4758620689655 (diff 0.475862068965519) (mon 0)
93/932920: Normals 18.7 != 19.0724137931035 (diff 0.372413793103451) (mon 1)
93/932920: Normals 17.3 != 17.7137931034483 (diff 0.413793103448274) (mon 2)
93/932920: Normals 14.6 != 15.0448275862069 (diff 0.444827586206891) (mon 3)
93/932920: Normals 11.8 != 12.2862068965517 (diff 0.486206896551721) (mon 4)
93/932920: Normals 9.9 != 10.1931034482759 (diff 0.293103448275863) (mon 5)
93/932920: Normals 9.2 != 9.47241379310345 (diff 0.272413793103446) (mon 6)
93/932920: Normals 10.0 != 10.3724137931034 (diff 0.372413793103446) (mon 7)
93/932920: Normals 11.6 != 11.9586206896552 (diff 0.358620689655176) (mon 8)
93/932920: Normals 13.5 != 14.0034482758621 (diff 0.50344827586207) (mon 9)
93/932920: Normals 15.6 != 16.0413793103448 (diff 0.441379310344827) (mon 10)
93/932920: Normals 17.6 != 17.9413793103448 (diff 0.341379310344827) (mon 11)
93/933090: Normals 17.5 != 17.6033333333333 (diff 0.103333333333339) (mon 0)
93/933710: Normals 19.5 != 18.3133333333333 (diff -1.18666666666667) (mon 0)
93/933710: Normals 19.0 != 17.9366666666667 (diff -1.06333333333333) (mon 1)
93/933710: Normals 17.8 != 16.6766666666667 (diff -1.12333333333333) (mon 2)
93/933710: Normals 14.8 != 13.8533333333333 (diff -0.946666666666671) (mon 3)
93/933710: Normals 12.0 != 10.8666666666667 (diff -1.13333333333333) (mon 4)
93/933710: Normals 9.7 != 8.55333333333333 (diff -1.14666666666666) (mon 5)
93/933710: Normals 9.0 != 8.05 (diff -0.949999999999998) (mon 6)
93/933710: Normals 10.0 != 8.94666666666667 (diff -1.05333333333333) (mon 7)
93/933710: Normals 11.9 != 10.8833333333333 (diff -1.01666666666667) (mon 8)
93/933710: Normals 14.1 != 13.0366666666667 (diff -1.06333333333334) (mon 9)
93/933710: Normals 16.2 != 15.0466666666667 (diff -1.15333333333333) (mon 10)
93/933710: Normals 18.2 != 16.94 (diff -1.26) (mon 11)
93/934340: Normals 16.7 != 16.9233333333333 (diff 0.223333333333336) (mon 0)
93/934340: Normals 16.8 != 16.99 (diff 0.190000000000001) (mon 1)
93/934340: Normals 15.8 != 15.9366666666667 (diff 0.136666666666661) (mon 2)
93/934340: Normals 13.5 != 13.6866666666667 (diff 0.186666666666667) (mon 3)
93/934340: Normals 9.0 != 9.10666666666667 (diff 0.106666666666667) (mon 7)
93/934340: Normals 10.4 != 10.5066666666667 (diff 0.106666666666667) (mon 8)
93/934340: Normals 11.9 != 12.0666666666667 (diff 0.166666666666666) (mon 9)
93/934340: Normals 13.4 != 13.5666666666667 (diff 0.166666666666664) (mon 10)
93/934340: Normals 15.3 != 15.4833333333333 (diff 0.183333333333328) (mon 11)
93/936150: Normals 7.8 != 7.89666666666667 (diff 0.0966666666666667) (mon 5)
93/936150: Normals 7.2 != 7.33666666666667 (diff 0.136666666666667) (mon 6)
93/937800: Normals 17.1 != 17.02 (diff -0.0800000000000054) (mon 0)
93/937800: Normals 16.6 != 16.7066666666667 (diff 0.106666666666662) (mon 1)
93/937800: Normals 15.1 != 15.1966666666667 (diff 0.0966666666666676) (mon 2)
93/937800: Normals 6.3 != 6.39 (diff 0.0899999999999999) (mon 5)
93/937800: Normals 5.9 != 6.12666666666667 (diff 0.226666666666666) (mon 6)
93/937800: Normals 7.2 != 7.37333333333333 (diff 0.173333333333332) (mon 7)
93/937800: Normals 11.7 != 11.55 (diff -0.149999999999997) (mon 9)
93/937800: Normals 13.8 != 13.4966666666667 (diff -0.303333333333331) (mon 10)
93/937800: Normals 15.9 != 15.6066666666667 (diff -0.293333333333337) (mon 11)
93/938440: Normals 13.9 != 13.9766666666667 (diff 0.0766666666666662) (mon 0)
93/938440: Normals 13.8 != 13.7366666666667 (diff -0.0633333333333308) (mon 1)
93/938440: Normals 12.7 != 12.6133333333333 (diff -0.0866666666666713) (mon 2)
93/938440: Normals 10.4 != 10.3366666666667 (diff -0.0633333333333308) (mon 3)
93/938440: Normals 7.8 != 7.73666666666667 (diff -0.0633333333333344) (mon 4)
93/938440: Normals 9.8 != 9.94666666666667 (diff 0.146666666666665) (mon 9)
93/939450: Normals 6.0 != 5.91666666666667 (diff -0.0833333333333321) (mon 4)
93/939450: Normals 5.3 != 5.09333333333333 (diff -0.206666666666666) (mon 5)
93/939450: Normals 5.0 != 4.93333333333333 (diff -0.0666666666666664) (mon 6)
93/939450: Normals 5.4 != 5.26 (diff -0.139999999999999) (mon 7)
93/939450: Normals 5.7 != 5.61 (diff -0.0900000000000007) (mon 8)
93/939450: Normals 8.8 != 8.88666666666667 (diff 0.086666666666666) (mon 11)
93/939870: Normals 14.3 != 14.3766666666667 (diff 0.0766666666666644) (mon 2)
93/939870: Normals 8.1 != 8.00333333333333 (diff -0.0966666666666676) (mon 6)
93/939870: Normals 9.2 != 9.29 (diff 0.0900000000000016) (mon 8)
93/939870: Normals 11.6 != 11.68 (diff 0.0800000000000001) (mon 10)
93/939940: Normals 21.9 != 21.9866666666667 (diff 0.086666666666666) (mon 0)
93/939940: Normals 22.1 != 22.17 (diff 0.0699999999999967) (mon 2)
93/939940: Normals 20.5 != 20.5966666666667 (diff 0.0966666666666569) (mon 3)
93/939940: Normals 18.7 != 18.7833333333333 (diff 0.0833333333333286) (mon 4)
93/939940: Normals 17.5 != 17.56 (diff 0.0600000000000023) (mon 5)
93/939940: Normals 16.2 != 16.31 (diff 0.110000000000007) (mon 6)
93/939940: Normals 16.1 != 16.19 (diff 0.0899999999999963) (mon 7)
93/939940: Normals 16.4 != 16.52 (diff 0.120000000000001) (mon 8)
93/939940: Normals 17.4 != 17.5166666666667 (diff 0.116666666666667) (mon 9)
94/941200: Normals 25.2 != 25.27 (diff 0.0700000000000038) (mon 5)
94/942030: Normals 29.4 != 29.0866666666667 (diff -0.313333333333329) (mon 1)
94/942030: Normals 29.5 != 29.11 (diff -0.390000000000004) (mon 2)
94/942030: Normals 28.3 != 28.1366666666667 (diff -0.163333333333334) (mon 3)
94/942030: Normals 25.0 != 24.57 (diff -0.43) (mon 4)
94/942030: Normals 22.1 != 21.3433333333333 (diff -0.756666666666671) (mon 5)
94/942030: Normals 21.1 != 20.85 (diff -0.25) (mon 6)
94/942030: Normals 22.4 != 21.68 (diff -0.720000000000002) (mon 7)
94/942030: Normals 25.1 != 24.2566666666667 (diff -0.843333333333334) (mon 8)
94/942030: Normals 27.5 != 27.4333333333333 (diff -0.06666666666667) (mon 9)
94/942030: Normals 29.4 != 28.9433333333333 (diff -0.456666666666671) (mon 10)
94/942030: Normals 30.2 != 29.6666666666667 (diff -0.533333333333328) (mon 11)
94/942120: Normals 30.2 != 30.4964285714286 (diff 0.296428571428571) (mon 0)
94/942120: Normals 29.7 != 29.9862068965517 (diff 0.286206896551718) (mon 1)
94/942120: Normals 28.9 != 29.248275862069 (diff 0.348275862068963) (mon 2)
94/942120: Normals 26.9 != 27.1266666666667 (diff 0.22666666666667) (mon 3)
94/942120: Normals 23.5 != 24.0233333333333 (diff 0.52333333333333) (mon 4)
94/942120: Normals 20.3 != 20.8933333333333 (diff 0.593333333333337) (mon 5)
94/942120: Normals 19.7 != 20.1633333333333 (diff 0.463333333333335) (mon 6)
94/942120: Normals 22.4 != 22.9066666666667 (diff 0.506666666666664) (mon 7)
94/942120: Normals 26.3 != 26.6827586206897 (diff 0.38275862068965) (mon 8)
94/942120: Normals 29.9 != 30.151724137931 (diff 0.251724137931031) (mon 9)
94/942120: Normals 31.4 != 31.748275862069 (diff 0.34827586206897) (mon 10)
94/942120: Normals 31.3 != 32.1766666666667 (diff 0.876666666666662) (mon 11)
94/942380: Normals 30.3 != 30.1045454545454 (diff -0.19545454545456) (mon 1)
94/942380: Normals 18.1 != 18.2772727272727 (diff 0.177272727272726) (mon 6)
94/942380: Normals 31.3 != 31.4090909090909 (diff 0.109090909090909) (mon 11)
94/942870: Normals 25.4 != 25.27 (diff -0.129999999999999) (mon 3)
94/942870: Normals 21.7 != 21.5866666666667 (diff -0.113333333333333) (mon 5)
94/942870: Normals 21.2 != 21.02 (diff -0.179999999999996) (mon 6)
94/942870: Normals 22.0 != 21.94 (diff -0.0600000000000023) (mon 7)
94/942870: Normals 23.4 != 23.2066666666667 (diff -0.193333333333328) (mon 8)
94/942870: Normals 24.9 != 24.8166666666667 (diff -0.0833333333333321) (mon 9)
94/942870: Normals 26.4 != 26.3133333333333 (diff -0.086666666666666) (mon 10)
94/942940: Normals 27.8 != 27.9566666666667 (diff 0.156666666666666) (mon 0)
94/942940: Normals 26.7 != 26.8066666666667 (diff 0.106666666666669) (mon 2)
94/942940: Normals 20.5 != 20.4 (diff -0.100000000000001) (mon 7)
94/942940: Normals 22.6 != 22.5166666666667 (diff -0.0833333333333393) (mon 8)
94/942940: Normals 26.9 != 26.8266666666667 (diff -0.0733333333333412) (mon 10)
94/942940: Normals 27.7 != 27.7966666666667 (diff 0.096666666666664) (mon 11)
94/943000: Normals 26.9 != 27.1266666666667 (diff 0.22666666666667) (mon 0)
94/943000: Normals 28.1 != 28.3466666666667 (diff 0.246666666666666) (mon 1)
94/943000: Normals 26.9 != 27.2466666666667 (diff 0.346666666666668) (mon 2)
94/943000: Normals 23.9 != 24.4033333333333 (diff 0.50333333333333) (mon 3)
94/943000: Normals 20.4 != 20.9666666666667 (diff 0.566666666666666) (mon 4)
94/943000: Normals 16.3 != 16.6433333333333 (diff 0.34333333333333) (mon 6)
94/943000: Normals 17.2 != 16.9233333333333 (diff -0.276666666666664) (mon 7)
94/943000: Normals 19.1 != 19.4533333333333 (diff 0.353333333333328) (mon 8)
94/943000: Normals 23.0 != 23.5066666666667 (diff 0.506666666666657) (mon 10)
94/943000: Normals 24.9 != 25.3166666666667 (diff 0.416666666666664) (mon 11)
94/943120: Normals 30.9 != 30.8137931034483 (diff -0.0862068965517295) (mon 0)
94/943120: Normals 30.8 != 30.8785714285714 (diff 0.0785714285714221) (mon 1)
94/943120: Normals 30.5 != 30.4275862068966 (diff -0.0724137931034434) (mon 2)
94/943120: Normals 28.1 != 27.58 (diff -0.520000000000003) (mon 3)
94/943120: Normals 23.8 != 23.73 (diff -0.0700000000000003) (mon 4)
94/943120: Normals 19.6 != 19.7433333333333 (diff 0.143333333333334) (mon 6)
94/943120: Normals 21.0 != 20.82 (diff -0.18) (mon 7)
94/943120: Normals 23.8 != 23.63 (diff -0.170000000000009) (mon 8)
94/943120: Normals 26.4 != 26.3275862068966 (diff -0.0724137931034399) (mon 9)
94/943120: Normals 28.7 != 28.4931034482759 (diff -0.206896551724135) (mon 10)
94/943130: Normals 31.5 != 31.5966666666667 (diff 0.0966666666666676) (mon 1)
94/943130: Normals 30.5 != 30.7266666666667 (diff 0.226666666666663) (mon 2)
94/943130: Normals 21.9 != 21.7866666666667 (diff -0.11333333333333) (mon 4)
94/943130: Normals 18.7 != 18.5666666666667 (diff -0.133333333333333) (mon 5)
94/943260: Normals 28.7 != 28.6 (diff -0.100000000000001) (mon 0)
94/943260: Normals 27.9 != 27.6366666666667 (diff -0.263333333333332) (mon 1)
94/943260: Normals 24.9 != 24.6866666666667 (diff -0.213333333333324) (mon 2)
94/943260: Normals 20.2 != 20.3733333333333 (diff 0.173333333333332) (mon 3)
94/943260: Normals 15.6 != 15.5233333333333 (diff -0.0766666666666644) (mon 4)
94/943260: Normals 12.4 != 12.0166666666667 (diff -0.383333333333333) (mon 5)
94/943260: Normals 14.2 != 13.9533333333333 (diff -0.246666666666664) (mon 7)
94/943260: Normals 18.2 != 18.2633333333333 (diff 0.0633333333333361) (mon 8)
94/943260: Normals 22.8 != 22.7366666666667 (diff -0.0633333333333326) (mon 9)
94/943260: Normals 25.9 != 25.7766666666667 (diff -0.123333333333331) (mon 10)
94/943260: Normals 27.8 != 27.51 (diff -0.289999999999999) (mon 11)
94/943400: Normals 30.4 != 30.0384615384615 (diff -0.361538461538455) (mon 0)
94/943400: Normals 29.9 != 29.4285714285714 (diff -0.471428571428575) (mon 1)
94/943400: Normals 28.3 != 27.9827586206896 (diff -0.317241379310353) (mon 2)
94/943400: Normals 25.2 != 24.9821428571429 (diff -0.217857142857145) (mon 3)
94/943400: Normals 17.1 != 17.3310344827586 (diff 0.231034482758616) (mon 6)
94/943400: Normals 19.2 != 19.5 (diff 0.300000000000001) (mon 7)
94/943400: Normals 22.8 != 23.0103448275862 (diff 0.210344827586201) (mon 8)
94/943400: Normals 26.5 != 26.8172413793103 (diff 0.317241379310339) (mon 9)
94/943400: Normals 29.2 != 29.2777777777778 (diff 0.0777777777777757) (mon 10)
94/943400: Normals 30.4 != 30.1384615384615 (diff -0.261538461538471) (mon 11)
94/943460: Normals 29.2 != 29.1 (diff -0.100000000000009) (mon 1)
94/943460: Normals 27.2 != 27.0733333333333 (diff -0.126666666666665) (mon 2)
94/943460: Normals 23.8 != 23.5827586206896 (diff -0.217241379310352) (mon 3)
94/943460: Normals 25.1 != 25.0233333333333 (diff -0.0766666666666644) (mon 9)
94/943460: Normals 29.7 != 29.6357142857143 (diff -0.0642857142857203) (mon 11)
94/943670: Normals 20.5 != 20.5833333333333 (diff 0.0833333333333321) (mon 4)
94/943670: Normals 17.6 != 17.6733333333333 (diff 0.0733333333333306) (mon 5)
94/943670: Normals 25.3 != 25.3633333333333 (diff 0.063333333333329) (mon 10)
94/943740: Normals 26.8 != 27.03 (diff 0.230000000000004) (mon 0)
94/943740: Normals 26.6 != 26.6733333333333 (diff 0.0733333333333341) (mon 1)
94/943740: Normals 25.5 != 25.5666666666667 (diff 0.0666666666666664) (mon 2)
94/943740: Normals 16.9 != 17.0633333333333 (diff 0.163333333333334) (mon 5)
94/943740: Normals 16.0 != 16.1266666666667 (diff 0.126666666666665) (mon 6)
94/943740: Normals 17.5 != 17.7 (diff 0.200000000000003) (mon 7)
94/943740: Normals 20.1 != 20.4533333333333 (diff 0.353333333333328) (mon 8)
94/943740: Normals 23.1 != 23.3666666666667 (diff 0.266666666666666) (mon 9)
94/943740: Normals 25.2 != 25.3866666666667 (diff 0.186666666666664) (mon 10)
94/943740: Normals 26.5 != 26.6266666666667 (diff 0.126666666666662) (mon 11)
94/944030: Normals 25.1 != 25.2033333333333 (diff 0.103333333333328) (mon 0)
94/944030: Normals 26.0 != 26.0833333333333 (diff 0.0833333333333357) (mon 1)
94/944030: Normals 15.5 != 15.5666666666667 (diff 0.0666666666666647) (mon 8)
94/944030: Normals 17.7 != 17.7733333333333 (diff 0.0733333333333306) (mon 9)
94/944030: Normals 22.9 != 22.9666666666667 (diff 0.0666666666666664) (mon 11)
94/944300: Normals 31.2 != 31.825 (diff 0.624999999999996) (mon 0)
94/944300: Normals 30.1 != 30.1892857142857 (diff 0.0892857142857153) (mon 1)
94/944300: Normals 23.1 != 23.33 (diff 0.229999999999993) (mon 3)
94/944300: Normals 17.7 != 17.9633333333333 (diff 0.263333333333335) (mon 4)
94/944300: Normals 14.3 != 14.4733333333333 (diff 0.173333333333332) (mon 5)
94/944300: Normals 13.1 != 13.4933333333333 (diff 0.393333333333334) (mon 6)
94/944300: Normals 14.8 != 15.01 (diff 0.209999999999999) (mon 7)
94/944300: Normals 18.4 != 18.5433333333333 (diff 0.143333333333334) (mon 8)
94/944300: Normals 22.2 != 22.48 (diff 0.279999999999998) (mon 9)
94/944300: Normals 25.9 != 26.31 (diff 0.410000000000004) (mon 10)
94/944300: Normals 29.3 != 29.5896551724138 (diff 0.289655172413791) (mon 11)
94/944610: Normals 30.2 != 29.99 (diff -0.209999999999997) (mon 0)
94/944610: Normals 22.6 != 22.85 (diff 0.25) (mon 3)
94/944610: Normals 17.3 != 17.8433333333333 (diff 0.543333333333329) (mon 4)
94/944610: Normals 14.1 != 13.9733333333333 (diff -0.126666666666663) (mon 5)
94/944610: Normals 13.2 != 13.58 (diff 0.380000000000004) (mon 6)
94/944610: Normals 15.4 != 15.89 (diff 0.490000000000002) (mon 7)
94/944610: Normals 19.8 != 19.34 (diff -0.460000000000001) (mon 8)
94/944610: Normals 24.0 != 24.5766666666667 (diff 0.576666666666661) (mon 9)
94/944610: Normals 27.1 != 27.4866666666667 (diff 0.386666666666667) (mon 10)
94/944610: Normals 29.2 != 29.0466666666667 (diff -0.15333333333334) (mon 11)
94/944760: Normals 30.1 != 30.0083333333333 (diff -0.0916666666666721) (mon 0)
94/944760: Normals 29.7 != 29.624 (diff -0.0759999999999934) (mon 1)
94/944760: Normals 26.6 != 26.2740740740741 (diff -0.32592592592593) (mon 2)
94/944760: Normals 21.5 != 21.3 (diff -0.199999999999996) (mon 3)
94/944760: Normals 16.5 != 16.3807692307692 (diff -0.119230769230771) (mon 4)
94/944760: Normals 13.3 != 13.1714285714286 (diff -0.128571428571428) (mon 5)
94/944760: Normals 12.9 != 12.4962962962963 (diff -0.403703703703705) (mon 6)
94/944760: Normals 15.1 != 14.4115384615385 (diff -0.688461538461533) (mon 7)
94/944760: Normals 18.6 != 18.4074074074074 (diff -0.19259259259259) (mon 8)
94/944760: Normals 22.8 != 22.6037037037037 (diff -0.1962962962963) (mon 9)
94/944800: Normals 29.7 != 29.35 (diff -0.349999999999994) (mon 0)
94/944800: Normals 29.4 != 28.9866666666667 (diff -0.413333333333334) (mon 1)
94/944800: Normals 26.5 != 26.0466666666667 (diff -0.45333333333333) (mon 2)
94/944800: Normals 21.5 != 20.98 (diff -0.52) (mon 3)
94/944800: Normals 16.6 != 15.98 (diff -0.620000000000003) (mon 4)
94/944800: Normals 13.2 != 12.8034482758621 (diff -0.396551724137931) (mon 5)
94/944800: Normals 12.4 != 12.27 (diff -0.130000000000003) (mon 6)
94/944800: Normals 14.2 != 13.7103448275862 (diff -0.489655172413789) (mon 7)
94/944800: Normals 17.8 != 17.4931034482759 (diff -0.306896551724137) (mon 8)
94/944800: Normals 21.8 != 21.451724137931 (diff -0.348275862068967) (mon 9)
94/944800: Normals 25.3 != 25.1366666666667 (diff -0.163333333333338) (mon 10)
94/944800: Normals 28.2 != 27.8833333333333 (diff -0.316666666666659) (mon 11)
94/944850: Normals 28.7 != 28.9241379310345 (diff 0.22413793103448) (mon 0)
94/944850: Normals 28.2 != 28.56 (diff 0.359999999999996) (mon 1)
94/944850: Normals 25.3 != 25.4433333333333 (diff 0.143333333333331) (mon 2)
94/944850: Normals 20.3 != 20.662962962963 (diff 0.36296296296296) (mon 3)
94/944850: Normals 15.4 != 15.5555555555556 (diff 0.155555555555553) (mon 4)
94/944850: Normals 12.0 != 12.4033333333333 (diff 0.403333333333332) (mon 5)
94/944850: Normals 11.2 != 11.5433333333333 (diff 0.343333333333334) (mon 6)
94/944850: Normals 13.0 != 13.52 (diff 0.520000000000001) (mon 7)
94/944850: Normals 16.8 != 17.19 (diff 0.390000000000001) (mon 8)
94/944850: Normals 20.9 != 21.27 (diff 0.370000000000001) (mon 9)
94/944850: Normals 24.5 != 24.7833333333333 (diff 0.283333333333335) (mon 10)
94/944850: Normals 27.5 != 27.5833333333333 (diff 0.083333333333325) (mon 11)
94/945100: Normals 27.8 != 27.562962962963 (diff -0.237037037037041) (mon 1)
94/945100: Normals 25.2 != 25.3137931034483 (diff 0.113793103448273) (mon 2)
94/945100: Normals 17.6 != 17.5 (diff -0.100000000000005) (mon 8)
94/945100: Normals 22.0 != 21.9275862068966 (diff -0.0724137931034434) (mon 9)
94/945100: Normals 25.2 != 25.2966666666667 (diff 0.0966666666666605) (mon 10)
94/945100: Normals 27.5 != 27.5827586206897 (diff 0.0827586206896527) (mon 11)
94/945680: Normals 25.3 != 24.9758620689655 (diff -0.324137931034485) (mon 0)
94/945680: Normals 24.9 != 24.6433333333333 (diff -0.256666666666664) (mon 1)
94/945680: Normals 23.4 != 23.1266666666667 (diff -0.27333333333333) (mon 2)
94/945680: Normals 20.7 != 20.29 (diff -0.409999999999993) (mon 3)
94/945680: Normals 17.1 != 16.7766666666667 (diff -0.323333333333334) (mon 4)
94/945680: Normals 14.2 != 13.8266666666667 (diff -0.373333333333333) (mon 5)
94/945680: Normals 13.1 != 12.6666666666667 (diff -0.433333333333334) (mon 6)
94/945680: Normals 14.4 != 13.9166666666667 (diff -0.483333333333334) (mon 7)
94/945680: Normals 17.3 != 16.8866666666667 (diff -0.413333333333338) (mon 8)
94/945680: Normals 20.4 != 20.0266666666667 (diff -0.373333333333335) (mon 9)
94/945680: Normals 22.7 != 22.4 (diff -0.300000000000001) (mon 10)
94/945680: Normals 24.6 != 24.3310344827586 (diff -0.26896551724138) (mon 11)
94/945890: Normals 22.7 != 23.19 (diff 0.489999999999995) (mon 0)
94/945890: Normals 23.0 != 23.3034482758621 (diff 0.303448275862063) (mon 1)
94/945890: Normals 22.1 != 22.3333333333333 (diff 0.233333333333327) (mon 2)
94/945890: Normals 20.1 != 20.2366666666667 (diff 0.136666666666663) (mon 3)
94/945890: Normals 17.3 != 17.4733333333333 (diff 0.173333333333336) (mon 4)
94/945890: Normals 14.9 != 15.05 (diff 0.15) (mon 5)
94/945890: Normals 13.9 != 14.05 (diff 0.150000000000006) (mon 6)
94/945890: Normals 14.8 != 14.9766666666667 (diff 0.176666666666661) (mon 7)
94/945890: Normals 16.8 != 17.0266666666667 (diff 0.22666666666667) (mon 8)
94/945890: Normals 18.7 != 19.0866666666667 (diff 0.386666666666667) (mon 9)
94/945890: Normals 20.3 != 20.71 (diff 0.409999999999997) (mon 10)
94/945890: Normals 21.8 != 22.3033333333333 (diff 0.503333333333334) (mon 11)
94/946010: Normals 20.7 != 20.6357142857143 (diff -0.0642857142857167) (mon 1)
94/946010: Normals 16.7 != 16.4266666666667 (diff -0.273333333333333) (mon 4)
94/946010: Normals 14.9 != 14.7344827586207 (diff -0.165517241379311) (mon 5)
94/946010: Normals 13.7 != 13.7703703703704 (diff 0.0703703703703695) (mon 7)
94/946010: Normals 14.4 != 14.4821428571429 (diff 0.0821428571428591) (mon 8)
94/946010: Normals 15.5 != 15.5933333333333 (diff 0.0933333333333337) (mon 9)
94/946010: Normals 17.1 != 17.21 (diff 0.109999999999999) (mon 10)
94/946010: Normals 19.0 != 19.0733333333333 (diff 0.073333333333327) (mon 11)
94/946100: Normals 24.2 != 24.2866666666667 (diff 0.0866666666666696) (mon 0)
94/946100: Normals 24.7 != 24.7666666666667 (diff 0.0666666666666664) (mon 1)
94/946100: Normals 22.7 != 22.8266666666667 (diff 0.126666666666669) (mon 2)
94/946100: Normals 14.1 != 13.99 (diff -0.109999999999998) (mon 5)
94/946100: Normals 13.0 != 12.9333333333333 (diff -0.0666666666666664) (mon 6)
94/946100: Normals 14.6 != 14.48 (diff -0.120000000000001) (mon 8)
94/946100: Normals 16.4 != 16.2866666666667 (diff -0.11333333333333) (mon 9)
94/946190: Normals 26.4 != 26.4689655172414 (diff 0.0689655172413808) (mon 0)
94/946190: Normals 26.2 != 26.5586206896552 (diff 0.358620689655176) (mon 1)
94/946190: Normals 23.8 != 24.0206896551724 (diff 0.220689655172414) (mon 2)
94/946190: Normals 19.5 != 19.8586206896552 (diff 0.358620689655169) (mon 3)
94/946190: Normals 15.4 != 15.7379310344828 (diff 0.337931034482761) (mon 4)
94/946190: Normals 12.7 != 12.9928571428571 (diff 0.292857142857146) (mon 5)
94/946190: Normals 11.6 != 11.7793103448276 (diff 0.17931034482759) (mon 6)
94/946190: Normals 12.1 != 12.3172413793103 (diff 0.217241379310348) (mon 7)
94/946190: Normals 14.3 != 14.5172413793103 (diff 0.217241379310348) (mon 8)
94/946190: Normals 20.9 != 21.0133333333333 (diff 0.113333333333333) (mon 10)
94/946190: Normals 24.2 != 24.29 (diff 0.0900000000000034) (mon 11)
94/946370: Normals 25.1 != 25 (diff -0.0999999999999979) (mon 1)
94/946370: Normals 19.0 != 18.8333333333333 (diff -0.166666666666671) (mon 3)
94/946370: Normals 14.5 != 14.3566666666667 (diff -0.143333333333329) (mon 4)
94/946370: Normals 10.7 != 10.5466666666667 (diff -0.153333333333331) (mon 6)
94/946370: Normals 11.8 != 11.6666666666667 (diff -0.133333333333333) (mon 7)
94/946370: Normals 15.1 != 14.9233333333333 (diff -0.176666666666662) (mon 8)
94/946370: Normals 18.4 != 18.3233333333333 (diff -0.076666666666668) (mon 9)
94/946370: Normals 21.6 != 21.5166666666667 (diff -0.0833333333333357) (mon 10)
94/946380: Normals 20.9 != 21.0636363636364 (diff 0.163636363636368) (mon 0)
94/946380: Normals 20.1 != 20.2954545454545 (diff 0.195454545454545) (mon 2)
94/946380: Normals 15.5 != 15.5863636363636 (diff 0.0863636363636378) (mon 4)
94/946380: Normals 13.4 != 13.4909090909091 (diff 0.0909090909090917) (mon 5)
94/946380: Normals 12.6 != 12.7090909090909 (diff 0.109090909090911) (mon 6)
94/946380: Normals 13.1 != 13.2181818181818 (diff 0.118181818181821) (mon 7)
94/946380: Normals 15.9 != 15.9818181818182 (diff 0.0818181818181802) (mon 9)
94/946380: Normals 19.6 != 19.8318181818182 (diff 0.231818181818184) (mon 11)
94/946530: Normals 20.0 != 19.9166666666667 (diff -0.0833333333333321) (mon 2)
94/946530: Normals 17.6 != 17.46 (diff -0.140000000000001) (mon 3)
94/946530: Normals 14.6 != 14.66 (diff 0.0600000000000041) (mon 4)
94/946530: Normals 12.3 != 12.22 (diff -0.0800000000000018) (mon 5)
94/946530: Normals 11.6 != 11.48 (diff -0.119999999999997) (mon 6)
94/946530: Normals 12.3 != 12.1666666666667 (diff -0.133333333333336) (mon 7)
94/946530: Normals 14.6 != 14.47 (diff -0.130000000000001) (mon 8)
94/946530: Normals 16.9 != 16.74 (diff -0.16) (mon 9)
94/946530: Normals 20.8 != 20.7366666666667 (diff -0.0633333333333361) (mon 11)
94/946550: Normals 27.1 != 26.5407407407407 (diff -0.559259259259257) (mon 0)
94/946550: Normals 27.1 != 26.1928571428571 (diff -0.907142857142862) (mon 1)
94/946550: Normals 24.3 != 23.725 (diff -0.575000000000006) (mon 2)
94/946550: Normals 19.7 != 19.2068965517241 (diff -0.493103448275857) (mon 3)
94/946550: Normals 15.4 != 15.0448275862069 (diff -0.355172413793106) (mon 4)
94/946550: Normals 12.3 != 12.0793103448276 (diff -0.220689655172412) (mon 5)
94/946550: Normals 11.7 != 11.351724137931 (diff -0.348275862068961) (mon 6)
94/946550: Normals 13.1 != 12.8137931034483 (diff -0.286206896551723) (mon 7)
94/946550: Normals 16.4 != 15.9689655172414 (diff -0.431034482758619) (mon 8)
94/946550: Normals 20.0 != 19.5827586206897 (diff -0.41724137931034) (mon 9)
94/946550: Normals 23.2 != 22.9275862068966 (diff -0.272413793103443) (mon 10)
94/946550: Normals 25.4 != 25.2551724137931 (diff -0.14482758620689) (mon 11)
94/946590: Normals 26.4 != 26.4966666666667 (diff 0.0966666666666711) (mon 1)
94/946590: Normals 19.3 != 19.1966666666667 (diff -0.103333333333335) (mon 3)
94/946590: Normals 14.9 != 14.7566666666667 (diff -0.143333333333336) (mon 4)
94/946590: Normals 12.0 != 11.8033333333333 (diff -0.196666666666667) (mon 5)
94/946590: Normals 11.3 != 11.38 (diff 0.0800000000000001) (mon 6)
94/946590: Normals 12.6 != 12.4966666666667 (diff -0.10333333333333) (mon 7)
94/946590: Normals 15.7 != 15.8 (diff 0.100000000000007) (mon 8)
94/946720: Normals 21.8 != 22.7266666666667 (diff 0.926666666666673) (mon 0)
94/946720: Normals 21.9 != 22.84 (diff 0.939999999999998) (mon 1)
94/946720: Normals 20.0 != 20.6933333333333 (diff 0.693333333333332) (mon 2)
94/946720: Normals 17.0 != 17.5266666666667 (diff 0.526666666666664) (mon 3)
94/946720: Normals 14.0 != 14.3466666666667 (diff 0.346666666666668) (mon 4)
94/946720: Normals 11.6 != 11.9566666666667 (diff 0.356666666666667) (mon 5)
94/946720: Normals 10.9 != 11.17 (diff 0.27) (mon 6)
94/946720: Normals 11.7 != 11.96 (diff 0.260000000000002) (mon 7)
94/946720: Normals 13.4 != 13.9233333333333 (diff 0.523333333333337) (mon 8)
94/946720: Normals 15.7 != 16.41 (diff 0.709999999999997) (mon 9)
94/946720: Normals 18.2 != 19.0033333333333 (diff 0.803333333333335) (mon 10)
94/946720: Normals 20.1 != 20.96 (diff 0.859999999999996) (mon 11)
94/946810: Normals 20.9 != 21.1233333333333 (diff 0.223333333333329) (mon 1)
94/946810: Normals 18.4 != 18.7433333333333 (diff 0.343333333333337) (mon 2)
94/946810: Normals 14.9 != 15.3103448275862 (diff 0.410344827586206) (mon 3)
94/946810: Normals 11.7 != 11.7933333333333 (diff 0.0933333333333337) (mon 4)
94/946810: Normals 11.3 != 11.4166666666667 (diff 0.116666666666665) (mon 8)
94/946810: Normals 14.1 != 14.2266666666667 (diff 0.126666666666665) (mon 9)
94/946810: Normals 17.1 != 17.01 (diff -0.0899999999999999) (mon 10)
94/946810: Normals 19.1 != 19.1733333333333 (diff 0.0733333333333377) (mon 11)
94/946930: Normals 24.1 != 23.99 (diff -0.109999999999999) (mon 1)
94/946930: Normals 16.9 != 16.7566666666667 (diff -0.143333333333331) (mon 3)
94/946930: Normals 13.1 != 12.9133333333333 (diff -0.186666666666667) (mon 4)
94/946930: Normals 11.1 != 10.9433333333333 (diff -0.156666666666666) (mon 7)
94/946930: Normals 13.7 != 13.4433333333333 (diff -0.256666666666664) (mon 8)
94/946930: Normals 16.8 != 16.6366666666667 (diff -0.16333333333333) (mon 9)
94/946930: Normals 20.0 != 19.8333333333333 (diff -0.166666666666668) (mon 10)
94/946930: Normals 22.6 != 22.24 (diff -0.359999999999996) (mon 11)
94/947090: Normals 24.9 != 24.576 (diff -0.323999999999995) (mon 1)
94/947090: Normals 21.7 != 21.5782608695652 (diff -0.121739130434783) (mon 2)
94/947090: Normals 17.0 != 17.095652173913 (diff 0.0956521739130416) (mon 3)
94/947090: Normals 12.8 != 12.6153846153846 (diff -0.184615384615386) (mon 4)
94/947090: Normals 9.5 != 9.592 (diff 0.0920000000000023) (mon 5)
94/947090: Normals 8.6 != 8.48461538461538 (diff -0.115384615384615) (mon 6)
94/947090: Normals 19.6 != 19.8423076923077 (diff 0.242307692307694) (mon 10)
94/947090: Normals 22.9 != 23.0363636363636 (diff 0.136363636363637) (mon 11)
94/947110: Normals 26.6 != 26.448275862069 (diff -0.151724137931037) (mon 1)
94/947110: Normals 23.5 != 23.3413793103448 (diff -0.158620689655166) (mon 2)
94/947110: Normals 18.9 != 18.3862068965517 (diff -0.513793103448275) (mon 3)
94/947110: Normals 14.3 != 13.9758620689655 (diff -0.324137931034484) (mon 4)
94/947110: Normals 11.0 != 11.0620689655172 (diff 0.0620689655172431) (mon 5)
94/947110: Normals 10.2 != 9.90689655172414 (diff -0.293103448275861) (mon 6)
94/947110: Normals 11.8 != 11.5827586206897 (diff -0.217241379310348) (mon 7)
94/947110: Normals 15.1 != 14.8413793103448 (diff -0.258620689655169) (mon 8)
94/947110: Normals 19.0 != 18.8413793103448 (diff -0.158620689655169) (mon 9)
94/947110: Normals 22.5 != 21.8241379310345 (diff -0.675862068965515) (mon 10)
94/947110: Normals 25.5 != 25.248275862069 (diff -0.251724137931038) (mon 11)
94/947300: Normals 20.0 != 20.37 (diff 0.369999999999997) (mon 0)
94/947300: Normals 19.6 != 20.0066666666667 (diff 0.406666666666666) (mon 1)
94/947300: Normals 17.2 != 17.55 (diff 0.350000000000005) (mon 2)
94/947300: Normals 13.0 != 13.43 (diff 0.430000000000001) (mon 3)
94/947300: Normals 9.2 != 9.44333333333333 (diff 0.243333333333334) (mon 4)
94/947300: Normals 6.4 != 6.74666666666667 (diff 0.346666666666667) (mon 5)
94/947300: Normals 5.2 != 5.52333333333334 (diff 0.323333333333335) (mon 6)
94/947300: Normals 6.8 != 7.00333333333333 (diff 0.203333333333334) (mon 7)
94/947300: Normals 9.2 != 9.56 (diff 0.360000000000003) (mon 8)
94/947300: Normals 12.5 != 12.75 (diff 0.249999999999998) (mon 9)
94/947300: Normals 15.3 != 15.65 (diff 0.350000000000001) (mon 10)
94/947300: Normals 18.3 != 18.7166666666667 (diff 0.416666666666661) (mon 11)
94/947500: Normals 20.1 != 20.8533333333333 (diff 0.753333333333337) (mon 0)
94/947500: Normals 20.2 != 20.9966666666667 (diff 0.796666666666667) (mon 1)
94/947500: Normals 18.9 != 19.7833333333333 (diff 0.883333333333336) (mon 2)
94/947500: Normals 16.5 != 17.2233333333333 (diff 0.723333333333336) (mon 3)
94/947500: Normals 13.8 != 14.19 (diff 0.390000000000001) (mon 4)
94/947500: Normals 11.6 != 11.9166666666667 (diff 0.31666666666667) (mon 5)
94/947500: Normals 10.6 != 10.9166666666667 (diff 0.316666666666666) (mon 6)
94/947500: Normals 11.5 != 11.88 (diff 0.379999999999999) (mon 7)
94/947500: Normals 13.4 != 14.0033333333333 (diff 0.603333333333333) (mon 8)
94/947500: Normals 15.5 != 16.17 (diff 0.670000000000002) (mon 9)
94/947500: Normals 17.2 != 17.8466666666667 (diff 0.646666666666672) (mon 10)
94/947500: Normals 19.0 != 19.8185185185185 (diff 0.81851851851852) (mon 11)
94/947670: Normals 21.4 != 21.5933333333333 (diff 0.193333333333332) (mon 2)
94/947670: Normals 18.8 != 19.2066666666667 (diff 0.406666666666663) (mon 3)
94/947670: Normals 15.7 != 16.1566666666667 (diff 0.456666666666671) (mon 4)
94/947670: Normals 13.1 != 13.6233333333333 (diff 0.523333333333333) (mon 5)
94/947670: Normals 12.2 != 12.7533333333333 (diff 0.553333333333335) (mon 6)
94/947670: Normals 13.3 != 13.8133333333333 (diff 0.51333333333333) (mon 7)
94/947670: Normals 15.5 != 15.9133333333333 (diff 0.413333333333332) (mon 8)
94/947670: Normals 18.0 != 18.1366666666667 (diff 0.13666666666667) (mon 9)
94/947670: Normals 19.7 != 19.8266666666667 (diff 0.126666666666662) (mon 10)
94/947670: Normals 21.7 != 21.7966666666667 (diff 0.096666666666664) (mon 11)
94/947760: Normals 22.5 != 22.8633333333333 (diff 0.363333333333333) (mon 0)
94/947760: Normals 22.3 != 22.4966666666667 (diff 0.196666666666665) (mon 1)
94/947760: Normals 20.7 != 21.23 (diff 0.529999999999998) (mon 2)
94/947760: Normals 18.0 != 18.45 (diff 0.449999999999999) (mon 3)
94/947760: Normals 14.8 != 15.2533333333333 (diff 0.45333333333333) (mon 4)
94/947760: Normals 12.3 != 12.64 (diff 0.340000000000002) (mon 5)
94/947760: Normals 11.2 != 11.4866666666667 (diff 0.286666666666667) (mon 6)
94/947760: Normals 12.2 != 12.4066666666667 (diff 0.206666666666669) (mon 7)
94/947760: Normals 14.7 != 15.0566666666667 (diff 0.356666666666671) (mon 8)
94/947760: Normals 17.4 != 17.59 (diff 0.190000000000001) (mon 9)
94/947760: Normals 19.5 != 19.8633333333333 (diff 0.363333333333333) (mon 10)
94/947760: Normals 21.7 != 22.0533333333333 (diff 0.353333333333335) (mon 11)
94/947910: Normals 23.0 != 23.0966666666667 (diff 0.0966666666666676) (mon 0)
94/947910: Normals 23.0 != 22.8133333333333 (diff -0.186666666666667) (mon 1)
94/947910: Normals 19.6 != 19.4866666666667 (diff -0.113333333333333) (mon 3)
94/947910: Normals 16.5 != 16.41 (diff -0.0899999999999999) (mon 4)
94/947910: Normals 14.1 != 14.01 (diff -0.0900000000000016) (mon 5)
94/947910: Normals 12.9 != 12.7633333333333 (diff -0.136666666666667) (mon 6)
94/947910: Normals 16.3 != 16.3833333333333 (diff 0.0833333333333321) (mon 8)
94/947910: Normals 20.3 != 20.4966666666667 (diff 0.196666666666669) (mon 10)
94/948020: Normals 19.4 != 19.3166666666667 (diff -0.0833333333333321) (mon 0)
94/948020: Normals 19.8 != 19.5366666666667 (diff -0.263333333333332) (mon 1)
94/948020: Normals 18.9 != 18.61 (diff -0.289999999999992) (mon 2)
94/948020: Normals 16.7 != 16.5 (diff -0.199999999999999) (mon 3)
94/948020: Normals 14.5 != 14.34 (diff -0.159999999999998) (mon 4)
94/948020: Normals 12.5 != 12.35 (diff -0.149999999999997) (mon 5)
94/948020: Normals 11.7 != 11.2266666666667 (diff -0.473333333333333) (mon 6)
94/948020: Normals 11.9 != 11.6633333333333 (diff -0.236666666666668) (mon 7)
94/948020: Normals 12.8 != 12.5233333333333 (diff -0.276666666666669) (mon 8)
94/948020: Normals 15.9 != 15.5666666666667 (diff -0.333333333333336) (mon 10)
94/948020: Normals 17.9 != 18.16 (diff 0.260000000000002) (mon 11)
94/948120: Normals 18.3 != 18.368 (diff 0.0680000000000014) (mon 0)
94/948120: Normals 18.3 != 18.4125 (diff 0.112499999999997) (mon 1)
94/948120: Normals 15.7 != 15.6318181818182 (diff -0.0681818181818183) (mon 3)
94/948120: Normals 11.8 != 12.1583333333333 (diff 0.358333333333333) (mon 5)
94/948120: Normals 11.2 != 11.012 (diff -0.187999999999999) (mon 6)
94/948120: Normals 11.7 != 11.544 (diff -0.155999999999999) (mon 7)
94/948120: Normals 12.7 != 12.6192307692308 (diff -0.0807692307692278) (mon 8)
94/948120: Normals 14.2 != 14.0892857142857 (diff -0.110714285714286) (mon 9)
94/948120: Normals 15.7 != 15.4518518518519 (diff -0.248148148148145) (mon 10)
94/948120: Normals 17.1 != 16.9666666666667 (diff -0.133333333333336) (mon 11)
94/948210: Normals 18.5 != 18.5733333333333 (diff 0.0733333333333341) (mon 1)
94/948210: Normals 14.5 != 14.6966666666667 (diff 0.196666666666665) (mon 3)
94/948210: Normals 9.9 != 10.0566666666667 (diff 0.156666666666666) (mon 7)
94/948210: Normals 11.1 != 11.04 (diff -0.0600000000000023) (mon 8)
94/948210: Normals 12.5 != 12.4333333333333 (diff -0.0666666666666664) (mon 9)
94/948210: Normals 16.5 != 16.6033333333333 (diff 0.103333333333335) (mon 11)
94/948270: Normals 18.7 != 18.9344827586207 (diff 0.23448275862069) (mon 2)
94/948270: Normals 14.9 != 15.3633333333333 (diff 0.463333333333331) (mon 3)
94/948270: Normals 9.1 != 9.33666666666667 (diff 0.236666666666668) (mon 5)
94/948270: Normals 8.6 != 8.51333333333333 (diff -0.086666666666666) (mon 6)
94/948270: Normals 11.4 != 11.53 (diff 0.129999999999999) (mon 8)
94/948270: Normals 13.9 != 14.17 (diff 0.27) (mon 9)
94/948270: Normals 19.3 != 19.39 (diff 0.0899999999999963) (mon 11)
94/948420: Normals 17.1 != 17.0172413793103 (diff -0.0827586206896598) (mon 0)
94/948420: Normals 17.6 != 17.72 (diff 0.120000000000001) (mon 1)
94/948420: Normals 16.6 != 16.7933333333333 (diff 0.193333333333335) (mon 2)
94/948420: Normals 14.7 != 14.77 (diff 0.0700000000000021) (mon 3)
94/948420: Normals 12.7 != 12.76 (diff 0.0600000000000041) (mon 4)
94/948420: Normals 10.9 != 10.9833333333333 (diff 0.0833333333333357) (mon 5)
94/948420: Normals 10.7 != 10.8933333333333 (diff 0.193333333333333) (mon 7)
94/948420: Normals 11.8 != 11.59 (diff -0.209999999999997) (mon 8)
94/948420: Normals 14.4 != 14.01 (diff -0.390000000000002) (mon 10)
94/948420: Normals 15.6 != 15.6689655172414 (diff 0.0689655172413826) (mon 11)
94/948650: Normals 19.3 != 19.6766666666667 (diff 0.376666666666665) (mon 0)
94/948650: Normals 19.6 != 19.9933333333333 (diff 0.393333333333334) (mon 1)
94/948650: Normals 18.0 != 18.1833333333333 (diff 0.183333333333334) (mon 2)
94/948650: Normals 15.0 != 15.2666666666667 (diff 0.266666666666669) (mon 3)
94/948650: Normals 12.1 != 12.2333333333333 (diff 0.133333333333336) (mon 4)
94/948650: Normals 9.6 != 9.53666666666667 (diff -0.0633333333333326) (mon 5)
94/948650: Normals 8.9 != 9.04 (diff 0.140000000000001) (mon 6)
94/948650: Normals 9.9 != 9.98666666666667 (diff 0.0866666666666678) (mon 7)
94/948650: Normals 11.4 != 11.7066666666667 (diff 0.306666666666668) (mon 8)
94/948650: Normals 13.5 != 13.7166666666667 (diff 0.216666666666669) (mon 9)
94/948650: Normals 15.5 != 15.7266666666667 (diff 0.226666666666667) (mon 10)
94/948650: Normals 17.6 != 17.9366666666667 (diff 0.336666666666666) (mon 11)
94/948930: Normals 17.9 != 17.4689655172414 (diff -0.431034482758623) (mon 0)
94/948930: Normals 18.4 != 17.89 (diff -0.509999999999998) (mon 1)
94/948930: Normals 17.3 != 17.0896551724138 (diff -0.210344827586209) (mon 2)
94/948930: Normals 15.3 != 15.0689655172414 (diff -0.23103448275862) (mon 3)
94/948930: Normals 11.4 != 11.1896551724138 (diff -0.210344827586207) (mon 5)
94/948930: Normals 10.6 != 10.3068965517241 (diff -0.293103448275859) (mon 6)
94/948930: Normals 10.9 != 10.5793103448276 (diff -0.320689655172416) (mon 7)
94/948930: Normals 11.9 != 11.6607142857143 (diff -0.239285714285712) (mon 8)
94/948930: Normals 13.4 != 13.051724137931 (diff -0.348275862068967) (mon 9)
94/948930: Normals 14.7 != 14.35 (diff -0.349999999999996) (mon 10)
94/948930: Normals 16.2 != 15.7206896551724 (diff -0.479310344827589) (mon 11)
94/949070: Normals 19.1 != 18.9266666666667 (diff -0.173333333333336) (mon 0)
94/949070: Normals 17.7 != 17.91 (diff 0.210000000000001) (mon 2)
94/949070: Normals 14.6 != 14.3733333333333 (diff -0.226666666666665) (mon 3)
94/949070: Normals 9.0 != 9.18333333333334 (diff 0.183333333333335) (mon 5)
94/949070: Normals 8.4 != 8.62 (diff 0.219999999999999) (mon 6)
94/949070: Normals 9.6 != 9.82666666666667 (diff 0.226666666666667) (mon 7)
94/949070: Normals 11.3 != 11.6833333333333 (diff 0.383333333333335) (mon 8)
94/949070: Normals 13.5 != 13.7466666666667 (diff 0.24666666666667) (mon 9)
94/949070: Normals 15.5 != 15.6233333333333 (diff 0.123333333333335) (mon 10)
94/949070: Normals 17.4 != 17.27 (diff -0.129999999999999) (mon 11)
94/949100: Normals 23.7 != 23.4166666666667 (diff -0.283333333333339) (mon 0)
94/949100: Normals 23.9 != 23.6166666666667 (diff -0.283333333333328) (mon 1)
94/949100: Normals 20.8 != 20.5533333333333 (diff -0.246666666666663) (mon 2)
94/949100: Normals 16.1 != 15.9233333333333 (diff -0.176666666666668) (mon 3)
94/949100: Normals 11.7 != 11.5433333333333 (diff -0.156666666666665) (mon 4)
94/949100: Normals 8.5 != 8.39333333333333 (diff -0.106666666666666) (mon 5)
94/949100: Normals 7.5 != 7.34333333333333 (diff -0.156666666666665) (mon 6)
94/949100: Normals 18.1 != 17.9966666666667 (diff -0.103333333333332) (mon 10)
94/949100: Normals 21.6 != 21.38 (diff -0.220000000000002) (mon 11)
94/949170: Normals 19.2 != 19.29 (diff 0.0899999999999999) (mon 0)
94/949170: Normals 15.6 != 15.6678571428571 (diff 0.0678571428571431) (mon 3)
94/949170: Normals 12.6 != 12.8033333333333 (diff 0.203333333333335) (mon 4)
94/949170: Normals 10.3 != 10.5344827586207 (diff 0.234482758620686) (mon 5)
94/949170: Normals 9.6 != 9.85714285714286 (diff 0.257142857142858) (mon 6)
94/949170: Normals 10.7 != 10.7655172413793 (diff 0.0655172413793093) (mon 7)
94/949170: Normals 12.3 != 12.4827586206897 (diff 0.182758620689656) (mon 8)
94/949170: Normals 16.1 != 15.8586206896552 (diff -0.241379310344829) (mon 10)
94/949260: Normals 13.5 != 13.2966666666667 (diff -0.20333333333333) (mon 3)
94/949260: Normals 9.4 != 9.25 (diff -0.15) (mon 4)
94/949260: Normals 6.5 != 6.38333333333333 (diff -0.116666666666666) (mon 5)
94/949260: Normals 5.5 != 5.35 (diff -0.150000000000001) (mon 6)
94/949370: Normals 19.7 != 19.8827586206897 (diff 0.182758620689661) (mon 0)
94/949370: Normals 20.0 != 20.21 (diff 0.209999999999994) (mon 1)
94/949370: Normals 19.1 != 19.2966666666667 (diff 0.196666666666662) (mon 2)
94/949370: Normals 14.2 != 14.3033333333333 (diff 0.103333333333335) (mon 4)
94/949370: Normals 11.8 != 12.0166666666667 (diff 0.216666666666667) (mon 5)
94/949370: Normals 11.0 != 11.1 (diff 0.100000000000001) (mon 6)
94/949370: Normals 13.4 != 13.3333333333333 (diff -0.0666666666666682) (mon 8)
94/949370: Normals 15.3 != 15.41 (diff 0.109999999999998) (mon 9)
94/949370: Normals 18.6 != 18.7620689655172 (diff 0.162068965517239) (mon 11)
94/949670: Normals 15.3 != 14.9 (diff -0.4) (mon 0)
94/949670: Normals 15.6 != 15.3777777777778 (diff -0.222222222222221) (mon 1)
94/949670: Normals 14.7 != 14.4965517241379 (diff -0.203448275862067) (mon 2)
94/949670: Normals 13.1 != 12.825 (diff -0.274999999999995) (mon 3)
94/949670: Normals 11.0 != 10.8571428571429 (diff -0.142857142857142) (mon 4)
94/949670: Normals 9.4 != 9.18666666666667 (diff -0.213333333333333) (mon 5)
94/949670: Normals 8.7 != 8.59310344827586 (diff -0.106896551724137) (mon 6)
94/949670: Normals 9.2 != 8.68666666666667 (diff -0.513333333333334) (mon 7)
94/949670: Normals 10.3 != 10.1133333333333 (diff -0.186666666666669) (mon 8)
94/949670: Normals 11.5 != 11.4 (diff -0.100000000000001) (mon 9)
94/949670: Normals 12.6 != 12.3266666666667 (diff -0.273333333333333) (mon 10)
94/949830: Normals 17.0 != 16.6566666666667 (diff -0.343333333333337) (mon 0)
94/949830: Normals 17.5 != 17.2266666666667 (diff -0.273333333333333) (mon 1)
94/949830: Normals 16.8 != 16.6620689655172 (diff -0.137931034482762) (mon 2)
94/949830: Normals 14.8 != 14.4466666666667 (diff -0.353333333333337) (mon 3)
94/949830: Normals 12.7 != 12.4233333333333 (diff -0.276666666666662) (mon 4)
94/949830: Normals 10.7 != 10.4633333333333 (diff -0.236666666666663) (mon 5)
94/949830: Normals 9.9 != 9.50344827586207 (diff -0.396551724137931) (mon 6)
94/949830: Normals 10.2 != 9.84 (diff -0.359999999999998) (mon 7)
94/949830: Normals 11.4 != 11.2166666666667 (diff -0.183333333333332) (mon 8)
94/949830: Normals 12.7 != 12.5068965517241 (diff -0.19310344827586) (mon 9)
94/949830: Normals 14.2 != 13.8034482758621 (diff -0.396551724137932) (mon 10)
94/949830: Normals 15.6 != 15.2793103448276 (diff -0.32068965517241) (mon 11)

The first value is the normals value from the Met Office, the second value is the calculated value, then I show the difference and then the month (0 = Jan).

Anyone help me understand that part?

Labels: ,