标签:
温度篇
前面已经讲了苏州的天气特点,还是用相同的数据,做接下来的苏州气温特点的分析预测,是的预测在这里!
首先看下2011年到2015年苏州整体的温度表现是什么样的。
plot(suzhou$highestTemp,type="l",col="red",main="苏州2011-2015年气温图",xlab="时间轴",ylab="温度℃") lines(suzhou$lowestTemp,type="l",col="blue") legend("topright",c("最高气温","最低气温"),col=c("red","blue"),lty=1)
红色是最高气温,蓝色是最低气温,年度季节性的特征很明显。每年都是先升再降,7、8月份是温度最高的时间,1、2月是温度最低时间。
因为时间太长,横轴没有具体的对应点。
同样,按月取平均值,再来看整体的表现。
avgTemper <-numeric(0)#月平均气温 diffTemper <-numeric(0)#月最高温差 length(avgTemper)<- 48 length(diffTemper)<- 48 for(i in2011:2014){ for(j in 1:12){ print((i-2011)*12+j) avgTemper[(i-2011)*12+j]<-mean(c(suzhou$highestTemp[grep(paste(i,"-",j,"-",sep=""),suzhou$date)],suzhou$lowestTemp[grep(paste(i,"-",j,"-",sep=""),suzhou$date)]),na.rm=TRUE) diffTemper[(i-2011)*12+j]<- max(suzhou$highestTemp[grep(paste(i,"-",j,"-",sep=""),suzhou$date)]-suzhou$lowestTemp[grep(paste(i,"-",j,"-",sep=""),suzhou$date)],na.rm=TRUE) } } avgTemperTS<- ts(avgTemper,frequency=12,start=c(2011,1)) plot.ts(avgTemperTS,main="苏州2011-2014年月平均气温图",xlab="时间",ylab="月平均温度℃")
四年月平均气温有一个很明显的周期性规律,明显能看出来2013年7、8月份气温高于其他三年。
换一种方式,将每年的数据放在同一个时间轴上,可以更明显看出来每年的温度走势都非常接近,并且对比图中,2013年夏季比其他几年都热,查了一下,最高气温能达到41摄氏度,是2013-8-8,当天最高气温41度,最低气温也有31度。
plot.ts(avgTemperTS[25:36],col="red",main="苏州2011-2014年月平均气温图",xlab="月份",ylab="月平均温度℃") lines(avgTemperTS[1:12],col="black") lines(avgTemperTS[13:24],col="blue") lines(avgTemperTS[37:48],col="green") legend("topright",c("2011","2012","2013","2014"),col=c("black","blue","red","green"),lty=1)
which.max(suzhou[,2]) suzhou[940,]
那么苏州的温差又有什么特点呢,什么时候是一年中温差最大的时候?同样看四年的整体表现和对比图。
diffTemperTS <-ts(diffTemper,frequency=12,start=c(2011,1)) plot.ts(diffTemperTS,main="苏州2011-2014年月最大温差图",xlab="时间",ylab="月最大温差℃") plot.ts(diffTemperTS[25:36],col="red",ylim=c(8,23),main="苏州2011-2014年月最大温差图",xlab="月份",ylab="月最大温差℃") lines(diffTemperTS[1:12],col="black") lines(diffTemperTS[13:24],col="blue") lines(diffTemperTS[37:48],col="green") legend("topright",c("2011","2012","2013","2014"),col=c("black","blue","red","green"),lty=1)
上面两个图中,都有一个好大的波峰,没错又是任性的2013年。整体上来看温差比较大的时间是3、4月,正是现在,换季的时节天气很是自在随性。那么那个孤高的波峰是哪一天呢?我们可以看看。
which.max(suzhou$highestTemp[grep(paste(2013,"-",3,"-",sep=""),suzhou$date)]-suzhou$lowestTemp[grep(paste(2013,"-",3,"-",sep=""),suzhou$date)]) suzhou[grep("2013-3-9",suzhou$date),]
最后,我想用时间序列来做温度走势的预测。因为R中周期性的时间序列数据需要每期数据项相同,但是这里2011年-2014年每年的数据项都不同(天气篇中开篇讲到了分别是354、366、365、365),所以我把这个时间序列的周期定为360,按顺序取数据的话,2011年因为1月份少了10天,所以2011、2012年会有一些时间和对应的温度错位。考虑到温度是连续型变量,小范围的变动应该不会对整体的时间序列的预测产生很大的影响。
最高温度和最低温度分别定为一个时间序列,并将其在同一个图上显示出来。
highestTS <-ts(suzhou$highestTemp[1:(360*4)],frequency=360,start=c(2011,1,1)) plot.ts(highestTS,col="red") lowestTS <-ts(suzhou$lowestTemp[1:(360*4)],frequency=360,start=c(2011,1,1)) lines(lowestTS,col="blue")
这是周期性特别明显的数据,所以考虑使用HoltWinters指数平滑方法来做时间序列的分析预测,用这个方法分别对最高温时间序列数据和最低温时间序列数据分别做平滑得到平滑模型然后来做气温的预测。
highestForecasts<- HoltWinters(highestTS) highestForecasts lowestForecasts<- HoltWinters(lowestTS) lowestForecasts
上面模型的平滑参数alpha、beta、gamma,分别是平滑指数、趋势指数、季节指数,参考http://blog.csdn.net/cl1143015961/article/details/42267613,值alpha越大说明对远期也就是以前年份的数据参考权重越大,另外gamma越大说明这个时间序列的季节性特点会越明显。
接下来对这两个时间序列做预测。要用到forecast包,定义预测150天的气温。
library("forecast") highestForecast2<- forecast.HoltWinters(highestForecasts,h=150) lowestForecast2<- forecast.HoltWinters(lowestForecasts,h=150) plot(highestForecast2$mean,ylim=c(-4,32),col="red",main="苏州2015年最高最低气温预测时序图",xlab="时间",ylab="温度℃") lines(lowestForecast2$mean,col="blue") legend("topright",c("最高气温","最低气温"),col=c("red","blue"),lty=1)
Box.test(highestForecast2$residuals,lag=20,type="Ljung-Box") Box.test(lowestForecast2$residuals,lag=20,type="Ljung-Box")
参考文章里面讲到了几种检验方式,这里我们用Ljung-Box检验方式,可以看到两个时间序列的检验结果p值都非常小,所以模型的预测是有效的。
突然想起来,2015年不是已经过了三个月了嘛,我们也有前面三个月的数据,那么接下来就把预测结果和实际结果放在一个图中对比看预测效果。本来想把四条线放在一起查看,但是比较混乱所以还是分开看。
highestFactTS <- ts(suzhou$highestTemp[1451:1542],frequency=360,start=c(2015,1)) lowestFactTS <- ts(suzhou$lowestTemp[1451:1542],frequency=360,start=c(2015,1)) plot(highestForecast2$mean,col="red",main="苏州2015年最高气温预测观察值时序图",xlab="时间",ylab="温度℃") lines(highestFactTS,col="orange") legend("topleft",c("实际值","预测值"),col=c("orange","red"),lty=1)
plot(lowestForecast2$mean,col="blue",main="苏州2015年最低气温预测观察值时序图",xlab="时间",ylab="温度℃") lines(lowestFactTS,col="green") legend("topleft",c("实际值","预测值"),col=c("green","blue"),lty=1)
没有重合,怎么可以不重合!开玩笑,重合是不太可能的,从上面两个最高气温和最低气温的预测值与观察值的图都能看出来预测值比实际值都有些偏低。但是预测结果与实际结果相比相差不大,并且整个变化趋势还是接近的。给出这个模型预测的接下来苏州地区50天的温度预测,当然,这个结果只能做一个参考,你是愿意看天气预报呢,还是看它呢?
predictTemp <-list(date="",highestTemp="",lowestTemp="") predictTemp$date <-c(paste(rep(2015,50),c(rep(4,20),rep(5,30)),c(11:30,1:20),sep="-")) predictTemp$highestTemp <-round(highestForecast2$mean[101:150]) predictTemp$lowestTemp <-round(lowestForecast2$mean[101:150]) predictTemp <-as.data.frame(predictTemp)
有没有好奇天气预报到底是怎么做出来的?想到这里,顺手百度了一下,大家可以看看,http://www.guokr.com/question/273034/,主要是云层图和历史数据,还要天气预报人员的经验!
很愉快地结束了这一篇文章,大家有任何问题建议欢迎提出,转载请务必注明来源,谢谢
标签:
原文地址:http://blog.csdn.net/cl1143015961/article/details/44982691