初见Gnuplot——时间序列的描述

  研读一本书,《数据之魅:基于开源工具的数据分析》(Data Analysis with Open Source Tools),写的很好。这里,复述一下书中用Gnuplot分析时间序列数据的部分。

  Gnuplot安装很简单,直接到官网下载exe文件,安装运行即可(我是win7 32bit)。数据集来自这里,下载解压后,找到carbon.dioxide.txt文件,把内容复制到test.txt(方便而已),将test.txt文件放到Gnuplot的默认文件目录中(我的是在C:\Users\Administrator\Documents)。数据格式和书里面不太一样,只有一列,不过不影响分析。

  首先,看下数据的总体趋势。

plot ‘test.txt‘ u 1 w l

  可以解释为,画出,‘test.txt‘的图像,用(u-->using)第 1 列的数据,用直线表示(w l --> with line).

  输出图形:

  可以看出总体非线性的上升趋势和短期的周期性。

  为了模拟方便,将数据减去一个垂直偏移,是图像经过原点。

plot ‘test.txt‘ u 0:($1-315) w l

  这里,$1表是引用用数据的第一列的数据。用行号作为x坐标(位于伪列0),第一列(数据列)减去315,作为对应的y的坐标.

  输出如下:

  可以看到,曲线符合幂函数想x^k的特征,且曲线下凸,得出其k>1.

  为了固定图的右上角(这里不太懂。。。),我们需要调整两轴,因为x^k通过(1,1),那么b(x/a)^k将通过(a,b)。这样就找到一个待定的拟合函数。点(35,350)在其附近,故得到函数35*(x/350)^k,这里仅知道k>1,经过测试,k=1.35时,拟合得最好。

plot ‘test.txt‘ u 0:($1-315) w l, 35*(x/350)**1.35

  拟合图如下:

  这样,我们继续,如果上面的函数拟合的足够好,那么消除这个总体趋势后,剩余部分将不会表现自身的趋势,将仅仅关于y=0对称。

plot ‘test.txt‘ u 0:($1-315-35*($0/350)**1.35) w l

  从下面输出可以看出,基本是符合的。

  在数据中很难看到长期趋势,一次我们用一天平滑曲线去逼近它。这里利用Gnuplot里面的加权样条法。

 f(x) = 315 + 35*(x/350)**1.35
 plot ‘test.txt‘ u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l

  输出如下,这里的“0.001”越小,生成的曲线越平滑。

  可以看到,整体剩余部分几乎是平坦的,横跨0的上下两端,也就是说,剩余部分几乎不存在系统偏差的迹象了。

完成对趋势的处理后,接下来要处理的特征就是周期性。

  观察上图,可以看出其接近于正弦曲线,且振幅接近3.由于数据是按照月份统计的,所以我们猜测周期是一年。这意味着,每隔12个数据点,数据就是相同的。

plot ‘test.txt‘ u 0:($1-f($0)) w l, 3*sin(2*pi*x/12) w l

  

  可以看到,数据拟合得特别好!同样的,让我们看看,本次拟合的剩余部分。

f(x) = 315 + 35*(x/350)**1.35 + 3*sin(2*pi*x/12)
plot ‘test.txt‘ u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l

  输出如下:

  让我们放大一个具体的区间看一下。这里lp为线点类型,[60,120]自然是区间。

plot [60:120] ‘test.txt‘ u 0:($1-f($0)) w lp, "" u 0:($1-f($0)):(0.001) s acs w l

  输出:

  现在数出来两个主波谷间的数据点:12个!这是主要的季节性。但是,在两个主波谷之间还存在着一个次波谷,所以,图中含有更高次谐波(参考wiki解释,需FQ)。

图中看到,上升部分为7个月,下降部分为5个月,对于这种不对称性,我们试一下第一次高次谐波。

f(x) = 315 + 35*(x/350)**1.35 + 3*sin(2*pi*x/12) - 0.75*sin(2*pi*$0/6)
plot ‘test.txt‘ u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l

  输出:

  现在,我们再来看下残差。

plot ‘test.txt‘ u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l,0,1,-1

  输出:

  观察到,残差偏向于正值,我们以0.1为单位调整垂直偏移。

f(x) = 315 + 35*(x/350)**1.35 + 3*sin(2*pi*x/12) - 0.75*sin(2*pi*$0/6) + 0.1
plot ‘test.txt‘ u 0:($1-f($0)) w l, "" u 0:($1-f($0)):(0.001) s acs w l,0,1,-1

  输出:

  可以看到,残差已经很小了。现在,我们结合分析模型再来看一下原始数据。

f(x) = 315 + 35*(x/350)**1.35 + 3*sin(2*pi*x/12) - 0.75*sin(2*pi*$0/6) + 0.1
plot ‘test.txt‘ u 0:1 w l , f(x)

  输出:

  Perfect!至此,我们已经得到一个解析式可以很好地描述数据。通过它,我们就可以相对准确地预测以后的数据。

plot [0:600] ‘test.txt‘ u 0:1 w l , f(x)

  

  书中有段话写的很好:

那么问题的关键在哪里呢?关键在于,我们开始时对数据一无所知,即我们根本不知道数据会是什么样子。然后,经过逐层处理,我们剔除了数据的各个组成部分,直到只剩下随机噪音。最后,我们得到了一个明确的解析式,它很好地描述了数据。

时间: 2024-08-16 14:23:39

初见Gnuplot——时间序列的描述的相关文章

计量经济与时间序列_时间序列过程的移动平均和自回归表示

1   在时间序列分析中有两种有用的表示来描述时间序列过程.一种是将过程写成一列不相关的随机变量的线性组合.这个过程叫moving average过程,也叫MA过程. 2   Wold(1938年)证明:纯非确定性的平稳过程(即改过程不包含能够由自身过去值进行精确预报的确定性成分)能够表示成下面的式子: 3   Zt = μ + at + φ1at-1 + φ2at-2+ ... ... (3.1) 4   (3.1)的式子中,Wold表示说,任何能够表示成这种形式的过程称为非确定性过程.这也叫

《BI那点儿事》浅析十三种常用的数据挖掘的技术

原文:<BI那点儿事>浅析十三种常用的数据挖掘的技术 一.前沿 数据挖掘就是从大量的.不完全的.有噪声的.模糊的.随机的数据中,提取隐含在其中的.人们事先不知道的但又是潜在有用的信息和知识的过程.数据挖掘的任务是从数据集中发现模式,可以发现的模式有很多种,按功能可以分为两大类:预测性(Predictive)模式和描述性(Descriptive)模式.在应用中往往根据模式的实际作用细分为以下几种:分类,估值,预测,相关性分析,序列,时间序列,描述和可视化等. 数据挖掘涉及的学科领域和技术很多,有

人生若只如初见-安意如

[此一生与谁初见] 1.有太多的人喜欢这一句,“人生若只如初见”. 可知我们都遗憾深重.命运像最名贵的丝绢,再怎样巧夺天工,拿到手上看,总透出丝丝缕缕的光,那些错落,是与生俱行的原罪 :人生若只如初见.不知道为什么很喜欢这样的一句,以前一直以为这句诗描述的是初次见面时的美好,后来才明白,除了美好以外,更多的是一种苍凉,是对回 不到和忘不了的过去的一种怀念,一切也终成往事. 2.就像我们与一个人相遇,初见,也曾山水迢迢.眉目相应,以为能够携手相随千里万里,却最终擦身而过.一错手,就慢慢地,渐渐地,

R学习日记——分解时间序列(非季节性数据)

分解时间序列,就是将一个时间序列拆分成不同的构成元件.一般序列(非季节性序列)包含一个趋势部分和一个不规则部分(也就是随机部分),而如果是一个季节性序列,除以上两个外,还有季节性部分. 在此,我们先讲——非季节性数据的分解. 一个非季节性时间序列包含一个趋势部分和一个不规则部分. 分解时间序列即为试图把时间序列拆分成这些成分,也就是说, 需要估计趋势的和不规则的这两个部分. 为了估计出一个非季节性时间序列的趋势部分, 使之能够用相加模型进行描述, 最常用的方法便是平滑法, 比如计算时间序列的简单

R学习日记——分解时间序列(季节性数据)

上篇说明了分解非季节性数据的方法.就是通过TTS包的SMA()函数进行简单移动平均平滑.让看似没有规律或没有趋势的曲线变的有规律或趋势.然后再进行时间序列曲线的回归预测. 本次,开始分解季节性时间序列. 一个季节性时间序列中会包含三部分,趋势部分.季节性部分和无规则部分.分解时间序列就是要把时间序列分解成这三部分,然后进行估计. 对于可以使用相加模型进行描述的时间序列中的趋势部分和季节性部分,我们可以使用 R中的“decompose()” 函数来估计.这个函数可以估计出时间序列中趋势的.季节性的

面板数据、截面数据、时间序列数据

截面数据.时间序列数据.面板数据是最常见的三种样本数据形式,网上对于此类数据的介绍比较零散,我在此做一个汇总归纳,如有错误,欢迎指正,我在此只做简单介绍,并不涉及具体分析,特别是面板数据,分析比较复杂,有专门的书籍可以参阅. 一.截面数据(Cross Section data) 1.概念: 截面数据是指由同一时期.不同个体的一个或多个统计指标所组成的数据集.该数据强调同一时期,因此也称为静态数据,我们平时获取的样本数据,大都具有同期性,因此截面数据也是最常见的 样本数据.例如:2016年各省份人

时间序列数据挖掘综述

时间序列数据挖掘综述 http://hi.baidu.com/superkiki1989/item/33d609ec4d936204560f1d14 一.引言 时间序列是指按时间顺序排列的一组数据,是一类重要的复杂数据对象.作为数据库中的一种数据形式,它广泛存在于各种大型的商业.医学.工程和社会科学等数据库中,如股票价格.各种汇率.销售数量.产品的生产能力.天气数据等.大量时间序列数据真实地记录了系统在各个时刻的所有重要信息,若能改进某种高效的数据处理方法,发现其中各时间序列之间的相互关系,必将

使用R进行时间序列分解

非季节性数据的时间序列分解 数据 http://robjhyndman.com/tsdldata/misc/kings.dat 分析 非季节性的数据包含两个组成成分,分别为随机噪声和趋势.为了能使用加性模型(Additive Model)描述非季节性数据的趋势成分,我们使用平滑法(SMA)来计算一个时间序列的移动平均.在使用SMA计算时间序列的移动平均值时,需设定跨度n. R代码 library("TTR") kings <- scan("kings.dat"

MongoDB 初见指南

技术若只如初见,那么还会踩坑么? 在系统引入 MongoDB 也有几年了,一开始是因为 MySQL 中有单表记录增长太快(每天几千万条吧)容易拖慢 MySQL 的主从复制.而这类数据增长迅速的流水表,对数据一致性也没那么高要求,而且业务上也不需要关联查询它,就考虑分出去.为什么是 MongoDB?刚巧赶上公司 DBA 团队引入了这个数据库,有人帮助运维,对业务团队就成了一个自然的选择.不过对于任何技术产品你如果要把它用在生产环境上,最好确定对它的架构和运作机理有个全面的理解. 形态 MongoD