NOAA Observation Station Analysis

Aggregating Data



Project Synopsis

According to a report published on January 18, 2017 by the National Aeronautics and Space Administration (NASA) and the National Oceanic and Atmospheric Administration (NOAA):

…(the) Earth’s 2016 surface temperatures were the warmest since modern record keeping began in 1880.

Globally-averaged temperatures in 2016 were 1.78 degrees Fahrenheit (0.99 degrees Celsius) warmer than the mid-20th century mean. This makes 2016 the third year in a row to set a new record for global average surface temperatures.

Source: https://www.nasa.gov/press-release/nasa-noaa-data-show-2016-warmest-year-on-record-globally


The 2016 Weather Data Exploratory Analysis project was started to review the raw data from NOAA and identify areas of uncertainty and their potential impact on reaching a greater than 95% scientific certainty.

This is Part 4 of the 2016 Weather Data Exploratory Analysis.


This project is designed to analyze the NOAA and NASA method for aggregating temperature data via the Goddard Institute for Space Studies Surface Temperature Analysis method defined by James Hansen in the late 1970’s.

The scheme was based on the finding that the correlation of temperature change was reasonably strong for stations separated by up to 1200 km, especially at middle and high latitudes. This fact proved sufficient to obtain useful estimates for global mean temperature changes.

The analysis method was fully documented in Hansen and Lebedeff (1987), including quantitative estimates of the error in annual and 5-year mean temperature change. This was done by sampling at station locations a spatially complete data set of a long run of a global climate model, which was shown to have realistic spatial and temporal variability. This however only addresses the error due to incomplete spatial coverage of measurements.

Source: https://data.giss.nasa.gov/gistemp/

The paper by James Hensen and Sergei Lebedeff was published November 20, 1987 in the Journal of Geophysical Research with the title of Global Trends of Measured Surface Air Temperature.

Source: https://pubs.giss.nasa.gov/docs/1987/1987_Hansen_ha00700d.pdf

The goal of the project is to recreate the Hansen-Lebedeff spatial map found in the paper and apply the data from the GHCN global temperature station data to assess the capability of the model to accurately reflect global temperatures.

Libraries Required

library(dplyr)          # Data manipulation
library(ggplot2)        # Graphics language for complex plots
library(knitr)          # Dynamic report generation
library(leaflet)        # Interactive mapping

Stations Data

The Stations Data to be used is the worldwide master list created in Part 1 of 2016 Weather Data Exploratory Analysis:


Read Station Files

A brief review of the source data will follow the loading of the master station file.

Read Master Station Data

master_stations_ww <- readRDS("~/Temp Stations/master_stations_ww.rds")
kable(head(master_stations_ww, 5))
ID Latitude Longitude Elevation Country State Location FirstYear LastYear
ACW00011604 17.1167 -61.7833 33.14 ANTIGUA AND BARBUDA NA ST JOHNS COOLIDGE FLD 1949 1949
ACW00011647 17.1333 -61.7833 62.99 ANTIGUA AND BARBUDA NA ST JOHNS 1961 1961
AE000041196 25.3330 55.5170 111.55 UNITED ARAB EMIRATES NA SHARJAH INTER. AIRP 1944 2017
AEM00041194 25.2550 55.3640 34.12 UNITED ARAB EMIRATES NA DUBAI INTL 1983 2017
AEM00041217 24.4330 54.6510 87.93 UNITED ARAB EMIRATES NA ABU DHABI INTL 1983 2017

Data Processing

Hansen and Lebedeff created the model for analyzing temperature data in order to accomodate a global model for temperature study with insufficient observations.

The principal limitation of this data set for global or hemispheric analysis is the incomplete spatial coverage…

Source: https://pubs.giss.nasa.gov/docs/1987/1987_Hansen_ha00700d.pdf

A spatial coverage method was generated that divided the Earth’s global surface into 80 equal area “boxes” with each box side being approximately 2,500 kilometers. For the purposes of this study, the “boxes” will be referred to as “sectors”. At the time of publication, 1987, Hansen states that there are 5 sectors that have 0 observation stations present.


In order to create the spatial map, the latitude and longitude of the observation station will be used to create 8 groupings. In the Hansen-Lebedeff map the Earth is divided into 8 latitudinal zones. Each of these zones is then sub-divided into 4 to 16 sectors depending on the latitude range. The reason for this is the eliptical shape of the Earth where the distance between longitudinal points is greater towards the equator and decreases as you move towards the poles. The result is 80 sectors with 2,500 square kilometers of surface area respectively.

There are two functions created to process the geo-coordinates from the master station data and to create the interactive map with station totals.

The sect_func function creates the 8 latitudinal groups and then generates sector totals which will be used in the map.

Sector Function

sect_func <- function(temp_sta) {
        
        group_1  <- temp_sta %>% filter(Latitude <=  90.0, Latitude >   67.5)
        group_2  <- temp_sta %>% filter(Latitude <=  67.5, Latitude >   45.0)
        group_3  <- temp_sta %>% filter(Latitude <=  45.0, Latitude >   22.5)
        group_4  <- temp_sta %>% filter(Latitude <=  22.5, Latitude >    0.0)
        group_5  <- temp_sta %>% filter(Latitude <=   0.0, Latitude >  -22.5)
        group_6  <- temp_sta %>% filter(Latitude <= -22.5, Latitude >  -45.0)
        group_7  <- temp_sta %>% filter(Latitude <= -45.0, Latitude >  -67.5)
        group_8  <- temp_sta %>% filter(Latitude <= -67.5, Latitude >= -90.0)
        
        sec_1    <- nrow(group_1 %>% filter(Longitude >= -180, Longitude <   -90))
        sec_2    <- nrow(group_1 %>% filter(Longitude >=  -90, Longitude <     0))
        sec_3    <- nrow(group_1 %>% filter(Longitude >=    0, Longitude <    90))
        sec_4    <- nrow(group_1 %>% filter(Longitude >=   90, Longitude <=  180))
        
        sec_5    <- nrow(group_2 %>% filter(Longitude >= -180, Longitude <  -135))
        sec_6    <- nrow(group_2 %>% filter(Longitude >= -135, Longitude <   -90))
        sec_7    <- nrow(group_2 %>% filter(Longitude >=  -90, Longitude <   -45))
        sec_8    <- nrow(group_2 %>% filter(Longitude >=  -45, Longitude <     0))
        sec_9    <- nrow(group_2 %>% filter(Longitude >=    0, Longitude <    45))
        sec_10   <- nrow(group_2 %>% filter(Longitude >=   45, Longitude <    90))
        sec_11   <- nrow(group_2 %>% filter(Longitude >=   90, Longitude <   135))
        sec_12   <- nrow(group_2 %>% filter(Longitude >=  135, Longitude <=  180))
      
        sec_13   <- nrow(group_3 %>% filter(Longitude >= -180, Longitude <  -150))
        sec_14   <- nrow(group_3 %>% filter(Longitude >= -150, Longitude <  -120))
        sec_15   <- nrow(group_3 %>% filter(Longitude >= -120, Longitude <   -90))
        sec_16   <- nrow(group_3 %>% filter(Longitude >=  -90, Longitude <   -60))
        sec_17   <- nrow(group_3 %>% filter(Longitude >=  -60, Longitude <   -30))
        sec_18   <- nrow(group_3 %>% filter(Longitude >=  -30, Longitude <     0))
        sec_19   <- nrow(group_3 %>% filter(Longitude >=    0, Longitude <    30))
        sec_20   <- nrow(group_3 %>% filter(Longitude >=   30, Longitude <    60))
        sec_21   <- nrow(group_3 %>% filter(Longitude >=   60, Longitude <    90))
        sec_22   <- nrow(group_3 %>% filter(Longitude >=   90, Longitude <   120))
        sec_23   <- nrow(group_3 %>% filter(Longitude >=  120, Longitude <   150))
        sec_24   <- nrow(group_3 %>% filter(Longitude >=  150, Longitude <=  180))

        sec_25   <- nrow(group_4 %>% filter(Longitude >= -180.0, Longitude < -157.5))
        sec_26   <- nrow(group_4 %>% filter(Longitude >= -157.5, Longitude < -135.0))
        sec_27   <- nrow(group_4 %>% filter(Longitude >= -135.0, Longitude < -112.5))
        sec_28   <- nrow(group_4 %>% filter(Longitude >= -112.5, Longitude <  -90.0))
        sec_29   <- nrow(group_4 %>% filter(Longitude >=  -90.0, Longitude <  -67.5))
        sec_30   <- nrow(group_4 %>% filter(Longitude >=  -67.5, Longitude <  -45.0))
        sec_31   <- nrow(group_4 %>% filter(Longitude >=  -45.0, Longitude <  -22.5))
        sec_32   <- nrow(group_4 %>% filter(Longitude >=  -22.5, Longitude <    0.0))
        sec_33   <- nrow(group_4 %>% filter(Longitude >=    0.0, Longitude <   22.5))
        sec_34   <- nrow(group_4 %>% filter(Longitude >=   22.5, Longitude <   45.0))
        sec_35   <- nrow(group_4 %>% filter(Longitude >=   45.0, Longitude <   67.5))
        sec_36   <- nrow(group_4 %>% filter(Longitude >=   67.5, Longitude <   90.0))
        sec_37   <- nrow(group_4 %>% filter(Longitude >=   90.0, Longitude <  112.5))
        sec_38   <- nrow(group_4 %>% filter(Longitude >=  112.5, Longitude <  135.0))
        sec_39   <- nrow(group_4 %>% filter(Longitude >=  135.0, Longitude <  157.5))
        sec_40   <- nrow(group_4 %>% filter(Longitude >=  157.5, Longitude <= 180.0))

        sec_41   <- nrow(group_5 %>% filter(Longitude >= -180.0, Longitude < -157.5))
        sec_42   <- nrow(group_5 %>% filter(Longitude >= -157.5, Longitude < -135.0))
        sec_43   <- nrow(group_5 %>% filter(Longitude >= -135.0, Longitude < -112.5))
        sec_44   <- nrow(group_5 %>% filter(Longitude >= -112.5, Longitude <  -90.0))
        sec_45   <- nrow(group_5 %>% filter(Longitude >=  -90.0, Longitude <  -67.5))
        sec_46   <- nrow(group_5 %>% filter(Longitude >=  -67.5, Longitude <  -45.0))
        sec_47   <- nrow(group_5 %>% filter(Longitude >=  -45.0, Longitude <  -22.5))
        sec_48   <- nrow(group_5 %>% filter(Longitude >=  -22.5, Longitude <    0.0))
        sec_49   <- nrow(group_5 %>% filter(Longitude >=    0.0, Longitude <   22.5))
        sec_50   <- nrow(group_5 %>% filter(Longitude >=   22.5, Longitude <   45.0))
        sec_51   <- nrow(group_5 %>% filter(Longitude >=   45.0, Longitude <   67.5))
        sec_52   <- nrow(group_5 %>% filter(Longitude >=   67.5, Longitude <   90.0))
        sec_53   <- nrow(group_5 %>% filter(Longitude >=   90.0, Longitude <  112.5))
        sec_54   <- nrow(group_5 %>% filter(Longitude >=  112.5, Longitude <  135.0))
        sec_55   <- nrow(group_5 %>% filter(Longitude >=  135.0, Longitude <  157.5))
        sec_56   <- nrow(group_5 %>% filter(Longitude >=  157.5, Longitude <= 180.0))
                    
        sec_57   <- nrow(group_6 %>% filter(Longitude >= -180, Longitude <  -150))
        sec_58   <- nrow(group_6 %>% filter(Longitude >= -150, Longitude <  -120))
        sec_59   <- nrow(group_6 %>% filter(Longitude >= -120, Longitude <   -90))
        sec_60   <- nrow(group_6 %>% filter(Longitude >=  -90, Longitude <   -60))
        sec_61   <- nrow(group_6 %>% filter(Longitude >=  -60, Longitude <   -30))
        sec_62   <- nrow(group_6 %>% filter(Longitude >=  -30, Longitude <     0))
        sec_63   <- nrow(group_6 %>% filter(Longitude >=    0, Longitude <    30))
        sec_64   <- nrow(group_6 %>% filter(Longitude >=   30, Longitude <    60))
        sec_65   <- nrow(group_6 %>% filter(Longitude >=   60, Longitude <    90))
        sec_66   <- nrow(group_6 %>% filter(Longitude >=   90, Longitude <   120))
        sec_67   <- nrow(group_6 %>% filter(Longitude >=  120, Longitude <   150))
        sec_68   <- nrow(group_6 %>% filter(Longitude >=  150, Longitude <=  180))
                    
        sec_69   <- nrow(group_7 %>% filter(Longitude >= -180, Longitude <  -135))
        sec_70   <- nrow(group_7 %>% filter(Longitude >= -135, Longitude <   -90))
        sec_71   <- nrow(group_7 %>% filter(Longitude >=  -90, Longitude <   -45))
        sec_72   <- nrow(group_7 %>% filter(Longitude >=  -45, Longitude <     0))
        sec_73   <- nrow(group_7 %>% filter(Longitude >=    0, Longitude <    45))
        sec_74   <- nrow(group_7 %>% filter(Longitude >=   45, Longitude <    90))
        sec_75   <- nrow(group_7 %>% filter(Longitude >=   90, Longitude <   135))
        sec_76   <- nrow(group_7 %>% filter(Longitude >=  135, Longitude <=  180))

        sec_77   <- nrow(group_8 %>% filter(Longitude >= -180, Longitude <   -90))
        sec_78   <- nrow(group_8 %>% filter(Longitude >=  -90, Longitude <     0))
        sec_79   <- nrow(group_8 %>% filter(Longitude >=    0, Longitude <    90))
        sec_80   <- nrow(group_8 %>% filter(Longitude >=   90, Longitude <=  180))
                    
        sec_cts <- c(sec_1, sec_2, sec_3, sec_4, sec_5, sec_6, sec_7, sec_8, sec_9, sec_10,
                     sec_11, sec_12, sec_13, sec_14, sec_15, sec_16, sec_17, sec_18, sec_19, sec_20,
                     sec_21, sec_22, sec_23, sec_24, sec_25, sec_26, sec_27, sec_28, sec_29, sec_30,
                     sec_31, sec_32, sec_33, sec_34, sec_35, sec_36, sec_37, sec_38, sec_39, sec_40,
                     sec_41, sec_42, sec_43, sec_44, sec_45, sec_46, sec_47, sec_48, sec_49, sec_50,
                     sec_51, sec_52, sec_53, sec_54, sec_55, sec_56, sec_57, sec_58, sec_59, sec_60,
                     sec_61, sec_62, sec_63, sec_64, sec_65, sec_66, sec_67, sec_68, sec_69, sec_70,
                     sec_71, sec_72, sec_73, sec_74, sec_75, sec_76, sec_77, sec_78, sec_79, sec_80) 
        
        return(sec_cts)
}

The sec_map function calls sect_func to retrieve the generated sector totals and then creates the map. The source data for the map is the master observation data. All observation stations are mapped based on the specified year. The map will then contain the circleMarkers displaying the locations of the observation stations, Rectangles representing the boundaries of the sectors, and LabelOnlyMarkers with the sector identification and the number of stations present.

Leaflet Mapping Function

sec_map <- function(temp_sta) {
        
        sect_counts <- sect_func(temp_sta)
        
        SecMap <- leaflet() %>%
                  addTiles() %>% 
                  addProviderTiles("Stamen.TerrainBackground") %>%
                  setView(lng = 0, lat = 0, zoom = 2) %>% 
                  addCircleMarkers(data = temp_sta,
                                   lng = ~ Longitude,
                                   lat = ~ Latitude,
                                   radius = 1.5,
                                   color = "salmon",
                                   stroke = FALSE,
                                   fillOpacity = .7) %>%

### Sectors 1-4
                
                  addRectangles(lng1 = -180, lat1 = 90, lng2 = -90, lat2 = 67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -90, lat1 = 90, lng2 =   0, lat2 = 67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =    0, lat1 = 90, lng2 =  90, lat2 = 67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   90, lat1 = 90, lng2 = 180, lat2 = 67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                                
                  addLabelOnlyMarkers(lng = -180, lat = 77, label = paste("S.1 - ", sect_counts[1]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -90, lat = 77, label = paste("S.2 - ", sect_counts[2]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =    0, lat = 77, label = paste("S.3 - ", sect_counts[3]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   90, lat = 77, label = paste("S.4 - ", sect_counts[4]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                
### Sectors 5-12           
                
                  addRectangles(lng1 = -180, lat1 = 67.5, lng2 = -135, lat2 = 45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -135, lat1 = 67.5, lng2 =  -90, lat2 = 45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -90, lat1 = 67.5, lng2 =  -45, lat2 = 45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -45, lat1 = 67.5, lng2 =    0, lat2 = 45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =    0, lat1 = 67.5, lng2 =   45, lat2 = 45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   45, lat1 = 67.5, lng2 =   90, lat2 = 45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   90, lat1 = 67.5, lng2 =  135, lat2 = 45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  135, lat1 = 67.5, lng2 =  180, lat2 = 45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                           
                  addLabelOnlyMarkers(lng = -180, lat = 65.5, label = paste("S.5 - ",  sect_counts[5]),  
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -135, lat = 65.5, label = paste("S.6 - ",  sect_counts[6]),  
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -90, lat = 65.5, label = paste("S.7 - ",  sect_counts[7]),  
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -45, lat = 65.5, label = paste("S.8 - ",  sect_counts[8]),  
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =    0, lat = 65.5, label = paste("S.9 - ",  sect_counts[9]),  
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%          
                  addLabelOnlyMarkers(lng =   45, lat = 65.5, label = paste("S.10 - ", sect_counts[10]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   90, lat = 65.5, label = paste("S.11 - ", sect_counts[11]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  135, lat = 65.5, label = paste("S.12 - ", sect_counts[12]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%   
                   
### Sectors 13-24
                
                  addRectangles(lng1 = -180, lat1 = 45, lng2 = -150, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -150, lat1 = 45, lng2 = -120, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -120, lat1 = 45, lng2 =  -90, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -90, lat1 = 45, lng2 =  -60, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -60, lat1 = 45, lng2 =  -30, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -30, lat1 = 45, lng2 =    0, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =    0, lat1 = 45, lng2 =   30, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   30, lat1 = 45, lng2 =   60, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   60, lat1 = 45, lng2 =   90, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   90, lat1 = 45, lng2 =  120, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  120, lat1 = 45, lng2 =  150, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  150, lat1 = 45, lng2 =  180, lat2 = 22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                                
                  addLabelOnlyMarkers(lng = -180, lat = 42, label = paste("S.13 - ", sect_counts[13]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                  addLabelOnlyMarkers(lng = -150, lat = 42, label = paste("S.14 - ", sect_counts[14]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -120, lat = 42, label = paste("S.15 - ", sect_counts[15]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                  addLabelOnlyMarkers(lng =  -90, lat = 42, label = paste("S.16 - ", sect_counts[16]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -60, lat = 42, label = paste("S.17 - ", sect_counts[17]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -30, lat = 42, label = paste("S.18 - ", sect_counts[18]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =    0, lat = 42, label = paste("S.19 - ", sect_counts[19]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   30, lat = 42, label = paste("S.20 - ", sect_counts[20]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   60, lat = 42, label = paste("S.21 - ", sect_counts[21]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%          
                  addLabelOnlyMarkers(lng =   90, lat = 42, label = paste("S.22 - ", sect_counts[22]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  120, lat = 42, label = paste("S.23 - ", sect_counts[23]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  150, lat = 42, label = paste("S.24 - ", sect_counts[24]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                        
### Sectors 25-40
                
                  addRectangles(lng1 = -180.0, lat1 = 22.5, lng2 = -157.5, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -157.5, lat1 = 22.5, lng2 = -135.0, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -135.0, lat1 = 22.5, lng2 = -112.5, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -112.5, lat1 = 22.5, lng2 =  -90.0, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -90.0, lat1 = 22.5, lng2 =  -67.5, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -67.5, lat1 = 22.5, lng2 =  -45.0, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -45.0, lat1 = 22.5, lng2 =  -22.5, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -22.5, lat1 = 22.5, lng2 =    0.0, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =    0.0, lat1 = 22.5, lng2 =   22.5, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   22.5, lat1 = 22.5, lng2 =   45.0, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   45.0, lat1 = 22.5, lng2 =   67.5, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   67.5, lat1 = 22.5, lng2 =   90.0, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   90.0, lat1 = 22.5, lng2 =  112.5, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  112.5, lat1 = 22.5, lng2 =  135.0, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  135.0, lat1 = 22.5, lng2 =  157.5, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  157.5, lat1 = 22.5, lng2 =  180.0, lat2 = 0, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                           
                  addLabelOnlyMarkers(lng = -180.0, lat = 18.5, label = paste("S.25 - ", sect_counts[25]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -157.5, lat = 18.5, label = paste("S.26 - ", sect_counts[26]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -135.0, lat = 18.5, label = paste("S.27 - ", sect_counts[27]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -112.5, lat = 18.5, label = paste("S.28 - ", sect_counts[28]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                  addLabelOnlyMarkers(lng =  -90.0, lat = 18.5, label = paste("S.29 - ", sect_counts[29]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -67.5, lat = 18.5, label = paste("S.30 - ", sect_counts[30]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -45.0, lat = 18.5, label = paste("S.31 - ", sect_counts[31]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -22.5, lat = 18.5, label = paste("S.32 - ", sect_counts[32]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%    
                  addLabelOnlyMarkers(lng =    0.0, lat = 18.5, label = paste("S.33 - ", sect_counts[33]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   22.5, lat = 18.5, label = paste("S.34 - ", sect_counts[34]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   45.0, lat = 18.5, label = paste("S.35 - ", sect_counts[35]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   67.5, lat = 18.5, label = paste("S.36 - ", sect_counts[36]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   90.0, lat = 18.5, label = paste("S.37 - ", sect_counts[37]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%          
                  addLabelOnlyMarkers(lng =  112.5, lat = 18.5, label = paste("S.38 - ", sect_counts[38]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  135.0, lat = 18.5, label = paste("S.39 - ", sect_counts[39]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  157.5, lat = 18.5, label = paste("S.40 - ", sect_counts[40]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%   
                
### Sectors 41-56
                
                  addRectangles(lng1 = -180.0, lat1 = 0, lng2 = -157.5, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -157.5, lat1 = 0, lng2 = -135.0, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -135.0, lat1 = 0, lng2 = -112.5, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -112.5, lat1 = 0, lng2 =  -90.0, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -90.0, lat1 = 0, lng2 =  -67.5, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -67.5, lat1 = 0, lng2 =  -45.0, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -45.0, lat1 = 0, lng2 =  -22.5, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -22.5, lat1 = 0, lng2 =    0.0, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =    0.0, lat1 = 0, lng2 =   22.5, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   22.5, lat1 = 0, lng2 =   45.0, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   45.0, lat1 = 0, lng2 =   67.5, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   67.5, lat1 = 0, lng2 =   90.0, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   90.0, lat1 = 0, lng2 =  112.5, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  112.5, lat1 = 0, lng2 =  135.0, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  135.0, lat1 = 0, lng2 =  157.5, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  157.5, lat1 = 0, lng2 =  180.0, lat2 = -22.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                                
                  addLabelOnlyMarkers(lng = -180.0, lat = -4, label = paste("S.41 - ", sect_counts[41]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                  addLabelOnlyMarkers(lng = -157.5, lat = -4, label = paste("S.42 - ", sect_counts[42]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -135.0, lat = -4, label = paste("S.43 - ", sect_counts[43]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -112.5, lat = -4, label = paste("S.44 - ", sect_counts[44]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -90.0, lat = -4, label = paste("S.45 - ", sect_counts[45]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -67.5, lat = -4, label = paste("S.46 - ", sect_counts[46]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -45.0, lat = -4, label = paste("S.47 - ", sect_counts[47]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -22.5, lat = -4, label = paste("S.48 - ", sect_counts[48]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =    0.0, lat = -4, label = paste("S.49 - ", sect_counts[49]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   22.5, lat = -4, label = paste("S.50 - ", sect_counts[50]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   45.0, lat = -4, label = paste("S.51 - ", sect_counts[51]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   67.5, lat = -4, label = paste("S.52 - ", sect_counts[52]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%          
                  addLabelOnlyMarkers(lng =   90.0, lat = -4, label = paste("S.53 - ", sect_counts[53]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  112.5, lat = -4, label = paste("S.54 - ", sect_counts[54]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  135.0, lat = -4, label = paste("S.55 - ", sect_counts[55]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  157.5, lat = -4, label = paste("S.56 - ", sect_counts[56]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                
### Sectors 57-68
                
                  addRectangles(lng1 = -180, lat1 = -22.5, lng2 = -150, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -150, lat1 = -22.5, lng2 = -120, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -120, lat1 = -22.5, lng2 =  -90, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -90, lat1 = -22.5, lng2 =  -60, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -60, lat1 = -22.5, lng2 =  -30, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -30, lat1 = -22.5, lng2 =    0, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =    0, lat1 = -22.5, lng2 =   30, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   30, lat1 = -22.5, lng2 =   60, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   60, lat1 = -22.5, lng2 =   90, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   90, lat1 = -22.5, lng2 =  120, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  120, lat1 = -22.5, lng2 =  150, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  150, lat1 = -22.5, lng2 =  180, lat2 = -45, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                           
                  addLabelOnlyMarkers(lng = -180, lat = -26.5, label = paste("S.57 - ", sect_counts[57]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -150, lat = -26.5, label = paste("S.58 - ", sect_counts[58]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng = -120, lat = -26.5, label = paste("S.59 - ", sect_counts[59]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -90, lat = -26.5, label = paste("S.60 - ", sect_counts[60]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -60, lat = -26.5, label = paste("S.61 - ", sect_counts[61]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                  addLabelOnlyMarkers(lng =  -30, lat = -26.5, label = paste("S.62 - ", sect_counts[62]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =    0, lat = -26.5, label = paste("S.63 - ", sect_counts[63]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   30, lat = -26.5, label = paste("S.64 - ", sect_counts[64]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   60, lat = -26.5, label = paste("S.65 - ", sect_counts[65]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   90, lat = -26.5, label = paste("S.66 - ", sect_counts[66]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%    
                  addLabelOnlyMarkers(lng =  120, lat = -26.5, label = paste("S.67 - ", sect_counts[67]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                  addLabelOnlyMarkers(lng =  150, lat = -26.5, label = paste("S.68 - ", sect_counts[68]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                        
### Sectors 69-76
                
                  addRectangles(lng1 = -180, lat1 = -45, lng2 = -135, lat2 = -67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 = -135, lat1 = -45, lng2 =  -90, lat2 = -67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -90, lat1 = -45, lng2 =  -45, lat2 = -67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -45, lat1 = -45, lng2 =    0, lat2 = -67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =    0, lat1 = -45, lng2 =   45, lat2 = -67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   45, lat1 = -45, lng2 =   90, lat2 = -67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   90, lat1 = -45, lng2 =  135, lat2 = -67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  135, lat1 = -45, lng2 =  180, lat2 = -67.5, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                                
                  addLabelOnlyMarkers(lng = -180, lat = -48, label = paste("S.69 - ", sect_counts[69]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                  addLabelOnlyMarkers(lng = -135, lat = -48, label = paste("S.70 - ", sect_counts[70]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -90, lat = -48, label = paste("S.71 - ", sect_counts[71]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -45, lat = -48, label = paste("S.72 - ", sect_counts[72]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =    0, lat = -48, label = paste("S.73 - ", sect_counts[73]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   45, lat = -48, label = paste("S.74 - ", sect_counts[74]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%
                  addLabelOnlyMarkers(lng =   90, lat = -48, label = paste("S.75 - ", sect_counts[75]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%    
                  addLabelOnlyMarkers(lng =  135, lat = -48, label = paste("S.76 - ", sect_counts[76]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>% 
                        
## Sectors 77-80
                
                  addRectangles(lng1 = -180, lat1 = -67.5, lng2 = -90, lat2 = -90, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =  -90, lat1 = -67.5, lng2 =   0, lat2 = -90, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =    0, lat1 = -67.5, lng2 =  90, lat2 = -90, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                  addRectangles(lng1 =   90, lat1 = -67.5, lng2 = 180, lat2 = -90, 
                                color="black", weight=.5, fillColor = "transparent") %>%
                                
                  addLabelOnlyMarkers(lng = -180, lat = -69.5, label = paste("S.77 - ", sect_counts[77]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =  -90, lat = -69.5, label = paste("S.78 - ", sect_counts[78]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =    0, lat = -69.5, label = paste("S.79 - ", sect_counts[79]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE)) %>%     
                  addLabelOnlyMarkers(lng =   90, lat = -69.5, label = paste("S.80 - ", sect_counts[80]), 
                                      labelOptions = labelOptions(noHide = T, textOnly = TRUE))

        return(SecMap)
}

Data Visualization

The sec_map function is called with the filtered master station data based on a specific year. The filter selects stations that have a beginning year and ending year range that will include the specific year. There is an on-line interactive map which duplicates the Hansen-Lebedeff spatial coverage map found here which also contains a breakout of station counts for any selected year from 1880 to 2017.

https://tterry231.shinyapps.io/NOAA-GHCN-Hansen-Lebedeff/


Hansen-Lebedeff Spatial Coverage Map - 1987

1987 reflects the year in the Hansen-Lebedeff paper and the number of sectors with 0 observation stations matches at 5. However, there are 19 sectors with 1-5 stations and only 35 out of 80 sectors with more than 50 stations. This clearly illustrates the problem that climate scientists have when trying to perform “global” analysis. Most of the sectors are underreported and do not offer a meaningful set of observations with which to work from.

One would expect that as time goes on there would be a higher level of saturation, or coverage, to reduce the issue. However, as can be seen in the next map, the problem is far from being resolved.


Hansen-Lebedeff Spatial Coverage Map - 2016

In 2016, the year in which the NASA and NOAA report specifies, the number of sectors with 0 observation stations doubled from 1987 levels. There are 10 sectors with 0 stations, 12 sectors with 1-5 stations, and only 29 sectors with greater than 50 stations. Large portions of the Earth are not being evaluated at all or are greatly underreported.

Since the baseline period is comprised of the mid-century years 1951-1980, we can look at the beginning and ending years to see what the coverage looked like then.


Hansen-Lebedeff Spatial Coverage Map - 1951

There are 26 sectors out of 80 that have 0 observation stations in 1950. Only 18 sectors have more than 50 stations in them. 16 out of the 18 sectors that have greater than 50 stations lies between 67.5 and 22.5 degrees north latitude. The other two sectors comprise the Hawaiian Islands and South Central Australia.


Hansen-Lebedeff Spatial Coverage Map - 1980

By 1980, there is some improvement in coverage with only 5 sectors absent an observation station. However, 20 sectors only contain between 1-5 stations and less than half of the sectors contain more than 50 stations.


Hansen-Lebedeff Spatial Coverage Map - 2017

As of May 1, 2017, the global coverage has lessened significantly. There are currently 11 sectors with 0 stations and only 23 with more than 50 stations.

Recently, there have been many articles claiming that February of 2017 was the warmest February in recorded history. Recorded history refers to records beginning in the year 1880.

Hansen-Lebedeff Spatial Coverage Map - 1880

In the year 1880, the beginning of recorded weather history, there were 66 out of 80 sectors with 0 observation stations. There were only 2 sectors with more than 25 stations.

Please review the interactive map at the link previously provided to review the historical data and other years.


Key Findings

As was observed in the previous projects, the actual coverage of the planet with regards to temperature observations is very sparse in the majority of sectors as defined by Hansen and Lebedeff. When you consider that each of the sectors is further divided into sub-sections, the scarcity of adequate measurements becomes even more drastic. Generating a sample mean for a sector or sub-sector becomes increasingly reliant on fewer and fewer observations.

Most notably, the changes from year to year, decade to decade, create a continuity concern regarding any comparisons between current date and previous baseline periods. This now requires that the climate model generated actually does result in high correlation rates across stations within 1,000 kilometer distance as asserted in the paper.

However, simply from looking at the maps and the amount of empty, or near-empty, sectors, it is clear that aggregated means across geographic areas will be inadequate to substantiate a scientific rendering with any meaningful degree of error. Furthermore, other studies focusing on the results of localized aggregation of temperature data have pointed out that the models do not accurately reflect the actual state of climate.

An excellent example of this type of study is from Colorado State University published in the International Journal of Climatology in 2002. The title is Problems in Evaluating Regional and Local Trends in Temperature: An Example From Eastern Colorado, USA.

Source: http://culter.colorado.edu/~kittel/pdf_Pielke02_IJClim.pdf

To understand climate on larger scales, climatologists average data from individual stations with data from other stations in the area. When combining observations, the values for each station are mathematically weighted to account for the fraction of the averaging area they represent. This keeps areas with many weather stations from being overrepresented compared to areas with fewer stations.

…“averaged” or “regionally smoothed” climate scenarios are unlikely to describe specific sites well. The magnitude of spatial variation in this relatively homogeneous region far exceeds the ‘main effect’ of any average projected climate change.

We conclude that sub-regional spatial and seasonal variation cannot be ignored when evaluating the direction and magnitude of climate change. It is unlikely that one or a few weather stations are representative of regional climate trends, and equally unlikely that regionally projected climate change from coarse-scale general circulation models will accurately portray trends at sub-regional scales.


Next Steps

The next set of projects will now explore actual temperature observations. The data will come from the Global Historical Climate Network.

The first projects will explore the proper way to read, clean, and interpret the data within the yearly GHCN files.

Subsequent projects will then perform analysis on the data to test:

This list is not comprehensive of all of the projects that will be performed.




sessionInfo()
## R version 3.4.0 (2017-04-21)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 14393)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=English_United States.1252 
## [2] LC_CTYPE=English_United States.1252   
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] leaflet_1.1.0 knitr_1.15.1  ggplot2_2.2.1 dplyr_0.5.0  
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.10     magrittr_1.5     munsell_0.4.3    xtable_1.8-2    
##  [5] colorspace_1.3-2 R6_2.2.0         highr_0.6        stringr_1.2.0   
##  [9] plyr_1.8.4       tools_3.4.0      grid_3.4.0       gtable_0.2.0    
## [13] DBI_0.6-1        htmltools_0.3.6  crosstalk_1.0.0  yaml_2.1.14     
## [17] lazyeval_0.2.0   assertthat_0.2.0 rprojroot_1.2    digest_0.6.12   
## [21] tibble_1.3.0     shiny_1.0.3      htmlwidgets_0.8  mime_0.5        
## [25] evaluate_0.10    rmarkdown_1.5    stringi_1.1.5    compiler_3.4.0  
## [29] scales_0.4.1     backports_1.0.5  jsonlite_1.4     markdown_0.8    
## [33] httpuv_1.3.3