You are using Rweb1.04 on the server at www.nku.edu
Rweb:> Rweb:> ## Rweb:> ############## RClimate Script: Mauna Loa Monthly CO2 ################################### Rweb:> ## ## Rweb:> ## Download and process Monthly CO2 Data File ## Rweb:> ## Developed by D Kelly O'Day to demonstrate use of source() function for climate data ## Rweb:> ## http:chartsgraphs.wordpress.com 1/16/10 ## Rweb:> ## Revised 12/15/14; removed personal info for posting ## Rweb:> ## Contributions from Andy Long: ## Rweb:> ## Revised 3/2015; Added models (quadratic and exponential) ## Rweb:> ############################################################################################ Rweb:> ## Rweb:> library(plyr); Rweb:> library(reshape); Rweb:> ## Rweb:> par(las=1); Rweb:> par(ps=10) Rweb:> Rweb:> ## STEP 1: SETUP Rweb:> ## Rweb:> url <- "ftp://aftp.cmdl.noaa.gov/products/trends/co2/co2_mm_mlo.txt" Rweb:> link <-file("/var/www/html/data/Rweb/RClimate/data/co2_mm_mlo.txt") Rweb:> Rweb:> ## STEP 2: READ DATA Rweb:> CO2_data <- read.table(link,sep="",row.names=NULL,header=F, + colClasses = rep("numeric", 7), skip=74, + comment.char = "#", na.strings = -99.99) Rweb:> names(CO2_data) <- c("Yr", "Mo", "Mo_Yr", "CO2", "Trnd", "X", "dys") Rweb:> Rweb:> ## STEP 3: Determine Month, Year for last reading Rweb:> nrows <- nrow(CO2_data) # Find number of data rows Rweb:> mo <- CO2_data[nrows,2] # Find last month of data Rweb:> yr <- CO2_data[nrows,1] # Find last year od data Rweb:> lco2 <- CO2_data[nrows,4] # Find last CO2 reading Rweb:> Rweb:> ## STEP 4: CREATE PLOT Rweb:> ## Set Chart Parameters Rweb:> par(las=1);par(ps = c(15));par(pin = c(6,3)) Rweb:> par(oma=c(3.5,1,4,1)); par(mar=c(2,4,0,0)) Rweb:> ## Make Basic Plot Rweb:> plot_func <- function() { + plot(CO2 ~ Mo_Yr, CO2_data, + ylim = c(300,440), + xlim = c(1958, yr+2), + type="l", xaxs = "i", yaxs="i", + col = "black", cex.main=1.5, cex.axis = 1, cex.lab = 1, + xlab = "", + ylab = expression(paste(CO[2] - ppmv))) + ## Add last point & Yr - month note + points(CO2_data[nrows,3], lco2, type = "p",pch=16, col = "red") + points(1959, 395, type = "p",pch=16, col = "red") + abline(h=400, col="grey") + text(1960, 303, paste("Source NOAA: ", url), adj=0, cex = .8) + ## Plot Annotation + mo_names <- c("Jan,", "Feb,", "Mar,", "Apr,", "May,", "June,", "July,", "Aug,", "Sept,", "Oct,", "Nov,", "Dec,") + thru <- paste(mo_names[mo],yr, "- ", lco2, " ppmv") # Note on last data point + text(1960,395, thru, cex=0.8, adj=0) + points(c(1958,1960), c(390,390), type = "l", col = "red") + Title <- expression(paste("C", O[2], " (ppmv)Trends Since 1958, Mauna Loa, Hawaii")) + mtext(Title, 3,2, outer = TRUE) + mtext(paste("Data Updated Through", mo_names[mo], yr), 3,1, outer = TRUE, cex = 0.85) + mtext("Andy Long and D Kelly O'Day", 1,1, adj = 0, cex = 0.8, outer=TRUE) + mtext(format(Sys.time(), "%m/%d/%Y"), 1, 1, adj = 1, cex = 0.8, outer=TRUE) + } Rweb:> plot_func() Rweb:> Rweb:> ###################################################################### Rweb:> ## Rweb:> ## Add a quadratic trend model (use the year 2000 as the baseline): Rweb:> ## Rweb:> ###################################################################### Rweb:> date <- CO2_data[,3]-2000 Rweb:> date2 <- date^2 Rweb:> avgCO2 <- CO2_data[,4] Rweb:> Keeling <- data.frame(avgCO2,date,date2) Rweb:> ## http://stackoverflow.com/questions/4862178/remove-rows-with-nas-in-data-frame Rweb:> ## drop out the data that's missing -- won't be useful in modeling, anyway.... Rweb:> Keeling <- na.omit(Keeling) Rweb:> q_m <- lm(avgCO2 ~ date + date2, data=Keeling) Rweb:> summary(q_m) Call: lm(formula = avgCO2 ~ date + date2, data = Keeling) Residuals: Min 1Q Median 3Q Max -4.9060 -1.8254 0.1105 1.7940 4.7724 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 3.695e+02 1.146e-01 3225.38 <2e-16 *** date 1.861e+00 6.830e-03 272.51 <2e-16 *** date2 1.300e-02 2.837e-04 45.84 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 2.24 on 744 degrees of freedom Multiple R-squared: 0.9943, Adjusted R-squared: 0.9943 F-statistic: 6.478e+04 on 2 and 744 DF, p-value: < 2.2e-16 Rweb:> coefs <- coefficients(q_m) Rweb:> a <- coefs[3] Rweb:> b <- coefs[2] Rweb:> c <- coefs[1] Rweb:> points(Keeling$date+2000,predict(q_m),type="l",col="red") Rweb:> Rweb:> ## describe model: Rweb:> thru <- paste(" Quadratic trend model: ",round(a,4),"(t-2000)^2 +",round(b,4),"(t-2000) + ",round(c,4)) Rweb:> text(1960,390, thru, cex=0.8, adj=0) Rweb:> Rweb:> ## find out when the quadratic will hit 450: i.e., find roots of q(x)=450, or ax^2+bx+c-450=0: Rweb:> c <- coefs[1] - 450 Rweb:> root <- (-b+sqrt(b^2-4*a*c))/(2*a) + 2000 Rweb:> thru <- paste(" Predicted year of average 450 PPM: ",round(root), "(lock in 2 degrees C)") Rweb:> text(1960,385, thru, cex=0.8, adj=0) Rweb:> Rweb:> ## Rweb:> ## "For the past 10,000 years, the amount of CO2 in the atmosphere stayed Rweb:> ## almost constant at about 280 ppm. Then, in about 1750 the picture changed." Rweb:> ## Eggleton, R. A. Eggleton, Tony (2013). A Short Introduction to Climate Rweb:> ## Change. Cambridge University Press. p. 52: Rweb:> ## Rweb:> ## https://books.google.co.uk/books?id=jeSwRly2M_cC&pg=PA52&lpg=PA52&dq=280 Rweb:> ## found in Rweb:> ## https://en.wikipedia.org/wiki/Carbon_dioxide_in_Earth%27s_atmosphere Rweb:> ## Rweb:> ## find out when the quadratic will hit 560: i.e., find roots of q(x)=560, or ax^2+bx+c-560=0: Rweb:> c <- coefs[1] - 560 Rweb:> root <- (-b+sqrt(b^2-4*a*c))/(2*a) + 2000 Rweb:> thru <- paste(" Predicted year of average 560 PPM: ",round(root), "(doubled CO2)") Rweb:> text(1960,380, thru, cex=0.8, adj=0) Rweb:> Rweb:> ###################################################################### Rweb:> ## Rweb:> ## Let's try an exponential trend model: Rweb:> ## Rweb:> ###################################################################### Rweb:> ## Rweb:> plot_func() Rweb:> ## Rweb:> historical <- 280 ## (modelling exponential departure from the long-term historical trend of roughly 280 ppm) Rweb:> ln_avgCO2 <- log(avgCO2 - historical) Rweb:> Keeling <- data.frame(ln_avgCO2,avgCO2,date) Rweb:> ## http://stackoverflow.com/questions/4862178/remove-rows-with-nas-in-data-frame Rweb:> ## drop out the data that's missing -- won't be useful in modeling, anyway.... Rweb:> Keeling <- na.omit(Keeling) Rweb:> q_m <- lm(ln_avgCO2 ~ date, data=Keeling) Rweb:> summary(q_m) Call: lm(formula = ln_avgCO2 ~ date, data = Keeling) Residuals: Min 1Q Median 3Q Max -0.11390 -0.02590 -0.00006 0.02854 0.08392 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 4.478e+00 1.581e-03 2832 <2e-16 *** date 2.181e-02 7.874e-05 277 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.03868 on 745 degrees of freedom Multiple R-squared: 0.9904, Adjusted R-squared: 0.9904 F-statistic: 7.67e+04 on 1 and 745 DF, p-value: < 2.2e-16 Rweb:> coefs <- coefficients(q_m) Rweb:> points(Keeling$date+2000,exp(predict(q_m)) + historical,type="l",col="red") Rweb:> ## describe model: Rweb:> thru <- paste(" Exponential trend model: exp(",round(coefs[2],4),"(t-2000)+",round(coefs[1],4),") +",historical) Rweb:> text(1960,390, thru, cex=0.8, adj=0) Rweb:> Rweb:> a <- coefs[2] Rweb:> b <- coefs[1] Rweb:> root <- (log(450 - historical) - b)/a + 2000 Rweb:> thru <- paste(" Predicted year of average 450 PPM: ",round(root), "(lock in 2 degrees C)") Rweb:> text(1960,385, thru, cex=0.8, adj=0) Rweb:> Rweb:> root <- (log(560 - historical) - b)/a + 2000 Rweb:> thru <- paste(" Predicted year of average 560 PPM: ",round(root), "(doubled CO2)") Rweb:> text(1960,380, thru, cex=0.8, adj=0) Rweb:> Rweb:> Rweb:>