Saturday, February 27, 2016

Matlab: 小波分析—时间序列的多时间尺度分析(一)

一则小波分析帖子在我的科学网博客上获得了非常大的关注,至今这一帖子保持着留言询问最多的地位。不过,由于2015年11月的一场浩劫,这个帖子附带的示例代码就都烟消云散了,其后,还是有很多同学留言询问,我在这里把代码再回顾一遍,文字基本不变。
本部分对应——MATLAB:小波分析—时间序列的多时间尺度分析

Introduction

时间序列(Time Series)是地学研究中经常遇到的问题。在时间序列研究中,时域和频域是常用的两种基本形式。其中,时域分析具有时间定位能力,但无法得到关于时间序列变化的更多信息;频域分析(如Fourier变换)虽具有准确的频率定位功能,但仅适合平稳时间序列分析。然而,地学中许多现象(如河川径流、地震波、暴雨、洪水等)随时间的变化往往受到多种因素的综合影响,大都属于非平稳序列,它们不但具有趋势性、周期性等特征,还存在随机性、突变性以及“多时间尺度”结构,具有多层次演变规律。对于这类非平稳时间序列的研究,通常需要某一频段对应的时间信息,或某一时段的频域信息。显然,时域分析和频域分析对此均无能为力。
20世纪80年代初,由Morlet提出的一种具有时—频多分辨功能的小波分析(Wavelet Analysis)为更好的研究时间序列问题提供了可能,它能清晰的揭示出隐藏在时间序列中的多种变化周期,充分反映系统在不同时间尺度中的变化趋势,并能对系统未来发展趋势进行定性估计。
本帖以美国某气象站1894~2010年连续的年降水量为例,试用小波分析,完成如下任务:①小波变换系数;②绘制小波系数实部等值线图;③绘制小波系数模和模方等值线图;④绘制小波方差图;以及⑤绘制不同时间尺度的小波实部过程线。所谓年降水量时间序列的多时间尺度是指:年降水量在演化过程中,并不存在真正意义上的变化周期,而是其变化周期随着研究尺度的不同而发生相应的变化,这种变化一般表现为小时间尺度的变化周期往往嵌套在大尺度的变化周期之中。也就是说,年降水量变化在时间域中存在多层次的时间尺度结构和局部变化特征。
小波分析的计算过程请参考:小波分析—经典小波方差制作步骤等。
小波分析的基本理论在此不多叙述,请参考其他文献。本帖主要介绍小波分析的一般过程,数据及部分代码将附在文末

0.年降水量的变化趋势分析

该站点的年降水量变化情况(LI_plot函数)如图 0所示,其发展呈微微上升的趋势,降水量最高年份出现在2003年,全年累计达到1610.70mm,最低值出现在1965年,累计仅有748.90mm。
Fig. 0

1.数据的加载

加载多年降水量至MATLAB使用Load命令。

2.边界效应的消除或减小

由于本例中的实测年降水量数据为有限时间数据序列,在时间序列的两端可能会产生“边界效用”。为消除或减小序列开始点和结束点附近的边界效应,须对其两端数据进行延伸。在进行完小波变换后,去掉两端延伸数据的小波变换系数,保留原数据序列时段内的小波系数。本例中,我们利用Matlab小波工具箱中的信号延伸(Signal Extension)功能,对数据两端进行对称性延伸。
具体步骤:在Matlab界面的“Command Window”中输入小波工具箱调用命令“wavemenu”,按Enter键弹“Wavelet Toolbox Main Menu”(小波工具箱主菜单)界面(Fig. 1上);然后单击“Signal Extension”,打开Signal Extension /Truncation窗口,单击“File”菜单下的“Load Signal”,选择prec.mat文件单击“打开”,出现信号延伸界面。Matlab的Extension Mode菜单下包含多种延伸方式和Direction to extend菜单下的3种延伸模式(Both、Left and Right),在这里我们选择对称性两端延伸进行计算。具体操作过程是:在Extension Mode下选择“Symmetric(Whole-Point)”,Dircetion to extend下选择“Both”,单击“Extend”按钮进行对称性两端延伸计算(Fig. 1下),然后单击“File”菜单下的“Save Tranformed Signal”,将延伸后的数据结果存为ePrec.mat文件。
Fig. 1
从ePrec文件可知(entendvalue函数),系统自动将原时间序列数据向前对称延伸5个单位,向后延伸6个单位。

3.计算小波系数

选择Matlab小波工具箱中的Morlet复小波函数对延伸后的数据序列(ePrec.mat)进行小波变换,计算小波系数并保存。
小波工具箱主菜单界面见Fig. 1上,单击“One-Dimensional”下的子菜单“Complex Continuous Wavelet 1-D”,打开一维复连续小波界面,单击“File”菜单下的“Load Signal”按钮,载入时间序列数据ePrec.mat。Fig. 2第一排的左侧为信号显示区域,右侧区域给出了信号序列和复小波变换的有关信息和参数,主要包括数据长度(Data Size)、小波函数类型(Wavelet:cgau、shan、fbsp和cmor)、取样周期(Sampling Period)、周期设置(Scale Setting)和运行按钮(Analyze),以及显示区域的相关显示设置按钮。本例中,我们选择cmor (1-1.5)、取样周期为1、最大尺度为64(延伸后的时间序列的一半),单击“Analyze”运行按钮,计算小波系数。然后单击“File”菜单下的“Save Coefficients”,保存小波系数为cePrec.mat文件。
Fig. 2

4.计算Morlet复小波系数的实部

去除两端延伸数据的小波系数(entendvalue函数),并计算小波系数实部(real函数)。

5.绘制小波系数实部等值线图

这部分过程应用LI_contourf函数,年降水量小波系数实部等值线图见Fig. 3。
如Fig. 3所示的小波系数实部等值线图。其中,横坐标为时间(年份),纵坐标为时间尺度,图中的等值曲线为小波系数实部值。小波系数实部等值线图能反映年降水量序列不同时间尺度的周期变化及其在时间域中的分布,进而能判断在不同时间尺度上,年降水量的未来变化趋势。
Fig. 3
由Fig. 3可以看出降水量1894~2010年演化过程中存在着28~36a的主振荡周期(这一周期是多个振荡周期叠加的矢量和,随后将在小波方差图中对这一主周期进行分解,剥离出第一主周期等等)。在整个时间尺度上出现4个偏多中心和3个偏少中心,分别为1899、1938、1972、2007年和1919、1956、1990年。
红框处出现4个偏多中心和3个偏少中心,一对临近的偏多和偏少波动就可以被识别为一个周期,所以是28~36a主震荡周期。
周期判断可以从正弦曲线上类比,如下图,两个最邻近波峰(或波谷)之间是一个完整的周期,或者两个最邻近的与x轴向下(或向上)交点也是一个完整的周期。
那么按照正弦曲线的周期检测思路,两个最邻近的偏多中心(或偏少中心)就是一个完整的周期长度。

6.绘制小波系数模和模方等值线图

首先,计算小波系数的模和模方,再利用LI_contourf函数绘制模和模方等值线图。
Fig. 4
Morlet小波系数的模值是不同时间尺度变化周期所对应的能量密度在时间域中分布的反映,系数模值愈大,表明其所对应时段或尺度的周期性就愈强。从Fig. 4可以看出,在降水量演化过程中,纵轴40~64a时间尺度模值最大(大于400),但1924~1994年之间模值小余200,说明在此时段内40~64年时间尺度的周期变化并不明显,1995年之后模值再次增大,此时期后40~64年时间尺度的周期变化趋于显著。
Fig. 5
小波系数的模方相当于小波能量谱,它可以分析出不同周期的震荡能量。由Fig. 5可知,40~64年时间尺度的能量最强、周期最显著,但它的周期变化具有局部性(1924年之前和1994年之后);10~15年时间尺度能量虽然较弱,但周期分布比较明显,几乎占据整个研究时域(1894~2010年)。

7.绘制小波方差图

小波方差的计算过程参考:小波方差制作步骤(参考文献存在一个错误,小波方差未除N,本贴小波方差计算已有修正)。
小波方差图能反映降水量时间序列的波动能量随尺度(a)的分布情况。可用来确定降水量演化过程中存在的主周期。
Fig. 6

8.主周期趋势图的绘制及其在多时间尺度分析中的作用

根据小波方差检验的结果,绘制演变的第一和第二主周期小波系数图。
Fig. 7
Fig. 8
从主周期趋势图中可以分析出在不同的时间尺度下,降水量存在的平均周期及丰-枯变化特征。Fig. 7显示,在55a特征时间尺度上,降水量变化的平均周期为35a左右,大约经历了3个丰—枯转换期;而在30a特征时间尺度上(Fig. 8),平均变化周期为20a左右,大约6个周期的丰—枯变化。

More

36 comments:

  1. 您好,抱歉打扰。我初步接触小波,科学网博文讲述很详细,使我对小波的相关的概念有了清晰的认识,但对于读图能力还是比较差,如图3存在着14~18a的主振荡周期,图4 40~64年时间尺度模值最大等等这类信息不是很理解(读图读不太懂),特别希望得到您的指导,谢谢!(本人qq 676881904)

    ReplyDelete
    Replies
    1. 不打扰!原文内容14~18a的主震荡周期不正确,应该是2倍。
      我已经在正文追加一些揭示,并且修改了错误之处,供参考!

      Delete
    2. 您好,请问您一下,那个主周期趋势图是要怎么画呢?具体的操作步骤是什么?现在刚接触小波分析,好多不懂的。望解答,谢谢!

      Delete
    3. 请下载帖子的附件,内里是代码。

      Delete
  2. 您好,感谢回复。 对于文中“红框处出现4个偏多中心和3个偏少中心,一对临近的偏多和偏少波动就可以被识别为一个周期,所以是28~36a主震荡周期” 仍然不是很理解:1. 偏多偏少中心在图上如何识别?并且这些中心对应横轴的时间(1899、1938、1972、2007年和1919、1956、1990年)是如何确定的?2.28~36a的究竟是怎么得到的还是很迷惑。本人菜鸟,求指点,期待再次回复。

    ReplyDelete
    Replies
    1. 偏多和偏少中心的识别要看颜色,图上右侧的色带说明红色和蓝色分别表示高值和低值,这些偏多和偏少中心位置对应的x坐标就是那些年份;偏多和偏少的过程可以识别为一个周期,这个可以类比为正弦曲线,偏多和偏少对应波峰和波谷,它们各自都有一个变化过程,就是波动变化,就这样可以理解为一个周期了。

      Delete
    2. 非常感谢详细的回复,以后还需要多多向你请教学习。

      Delete
  3. 可以给more examples 嘛?谢谢

    ReplyDelete
  4. This comment has been removed by the author.

    ReplyDelete
  5. 您好,第一次接触这个方向,图看不明白,向您请教。
    在fig3中您解释
    “偏多和偏少中心的识别要看颜色,图上右侧的色带说明红色和蓝色分别表示高值和低值,这些偏多和偏少中心位置对应的x坐标就是那些年份;偏多和偏少的过程可以识别为一个周期,这个可以类比为正弦曲线,偏多和偏少对应波峰和波谷,它们各自都有一个变化过程,就是波动变化,就这样可以理解为一个周期了。”
    1.我想问的是周期就是从这个横轴x年份之间做减法得到的么?例如“(1899、1938、1972、2007年和1919、1956、1990年”周期就是1938-1899,1972-1938,2007-1972这样做的么?
    2.纵轴表示的period scale 是什么意思?按照一般的小波理解是尺度,但看您似乎是理解成年份,这里是怎么解释。此外纵轴有什么作用么?如上面一个问题,我们似乎不需要纵轴就可以得到周期了。
    3.28a 36a 这个a代表年么?因为我不是气候方向的,确实不明白这个。

    谢谢您。

    ReplyDelete
    Replies
    1. 1类比正弦曲线,两个最邻近的波峰(或波谷)之间就是一个完整的周期。转到这里,两个最邻近的偏多中心(偏少中心)之间也同样可以识别为一个完整周期,如1938-1899,你的理解正确。
      2period scale是时间尺度,理解为Number of years。尺度是小波分析的灵魂,数学显微镜即来源于此。建议参考小波分析书籍,这个太广泛。
      3a是年的国际单位。

      Delete
    2. 好像丢了我的问题,我再打一遍吧。泪。。。
      非常感谢博主的及时回复,我这几天没能登陆上。今天才感谢,不好意思。

      继续问第二问:
      1.我从小波书上理解的尺度是小波分层分解的一个指标,经常用2进小波,例如scale=2^k这样。所以我一直以为这是一个层数的无单位量。查阅资料发现,可以利用小波的做伪周期,利用matlab的 scal2frq命令将尺度转化为频率,那么您这里的路线是 尺度--频率--周期这么一条技术路线么?


      2. 那么纵轴是不是这样用的(尺度):
      a.平行于横轴,对应不同的纵轴数值进行观察,如果发现某个尺度附近(似乎不能严格对齐?)例如30a,观察到多个交替规律出现的红色中心和蓝色中心。
      b.计算这些红色(蓝色)中心之间的x轴数值差(也是近似)得到周期,例如近似为20a这样的。
      c.那么我们可以说在尺度30a之下,存在周期20a??

      这里哪个是主震荡周期?因为似乎尺度30a也是一个周期,我们自己计算x轴数值差的20a也是一个周期。这个是困扰我的一个问题。
      我模糊的感觉是不是这样解释:主震荡周期30a这个尺度下(如果尺度-频率-周期这个思路没错),存在20a这个(子)周期?

      希望您能解惑。非常感谢您!

      Delete
    3. 是的,我的邮件提示里面就有你的回复,但打开帖子却没有了,这还是头回遇上,其他人的留言没这种情况。
      1不是
      2a不严格对齐。最顶端的红色中心和蓝色中心表示第一主震荡周期,如Fig 3和Fig 4之间图片顶端的红框。
      b可以。
      c可以。但常用的是在最大尺度之下查看震荡周期,这里是60~65a尺度,帖子上认为是28~36a主震荡周期,你也可以认为是30~34a主震荡周期,可以浮动,并不严格对齐。

      主震荡周期是在fig 3顶端发现,这里的能量最大。
      下载代码,自己运行一下,多做体会!

      Delete
    4. 非常感谢您的回复,明白了很多。
      还有一个问题:
      fig5中,"10~15年时间尺度能量虽然较弱,但周期分布比较明显,几乎占据整个研究时域(1894~2010年)。"和“40~64年时间尺度的能量最强、周期最显著,但它的周期变化具有局部性(1924年之前和1994年之后)”

      问题是:这里的周期分布明显是怎么看的?确实能看出来能量最强,但是周期显著或者分布明显是看颜色还是什么? 40-60的时间尺度的周期难道不是看从左到右 红色--蓝色--红色这样的变化么?那么为什么又说具有局部性?这里的蓝色部分是周期的一部分还是不代表周期?这里实在是看不出来。

      10-15的周期明显,这个又是根据什么看?图上平行于x轴的颜色变化嘛?

      非常感谢您。很多基础问题,因为刚接触这个方向

      Delete
    5. 10~15年时间尺度,观察fig. 5纵轴10~15区间,转到平行的横轴方向,蓝色等值线横贯几乎全部时间序列(横轴),能量相近,而40-60的时间尺度对应的时间序列能量差异明显(红和蓝),所以本帖描述10~15区间“周期最显著”,40-60的时间尺度周期变化具有局部性。

      Delete
    6. 明白了,非常感谢您。

      Delete
  6. 你好我想请教下,小波方差结果的卡方检验是怎么做的

    ReplyDelete
    Replies
    1. 哥们,哪里的文献提到小波方差结果需要卡方检验?

      Delete
    2. 哥们,卡方检验的确需要,以后解决!
      Torrence, C.; Compo, G.P. A practical guide to wavelet analysis. Bull. Amer. Meteorol. Soc. 1998, 79, 61-78.

      Delete
  7. 请教一个问题:你为何选择使用 Complex Continuous Wavelet 1-D,而非其它呢?
    我一直心中有一个更大的疑问,是不是选择了其它类型就会得到完全不同的结论?有无理论或者实践方面的证据?
    多谢!

    ReplyDelete
    Replies
    1. 如Fig. 1所示,Complex Continuous Wavelet 1-D是在One-Dimensional之下,示例是一维时间序列数据。此一步骤是为延长数据之用,便于之后的小波分析输入,所以其他的方式也可以应用。
      我看到一个相似的例子应用在水文信息,类推到降水情形,理论或实践证据并没有看到。

      Delete
  8. 请问一下小波方差的图像是怎么画的??

    ReplyDelete
  9. This comment has been removed by the author.

    ReplyDelete
  10. 感谢分享!想请教一下,选择cmor (1-1.5),括号里面的两个数字代表的什么含义呢?我查的好像是带宽和中心频率,不知道对不对?本例中是否可以选择别的组合,如cmor (1-0.5)?

    ReplyDelete
    Replies
    1. 您好。可以使用cmor其他参数组合或者其他小波类型。
      数字含义我不肯定,留待以后。

      Delete
  11. 不好意思,想请教一下,小波方差检验是怎么做的?是做红噪声模拟之后绘制红噪声的方差尺度分布图么?我用Torrice的代码做出来的是红噪声的功率谱,请问这个和方差图有什么关系么?树枝上感觉差了10倍左右。

    ReplyDelete
  12. This comment has been removed by the author.

    ReplyDelete
  13. 你好,我想问一下,小波分析可以作两组时间序列数据的时域和频域分析吗?
    就是比如您的初始数据是一个流域,100年的;那可以作两个流域,100年的嘛?同时画一张图里的那种

    ReplyDelete
  14. This comment has been removed by the author.

    ReplyDelete
  15. 请问用LI_contourf这个函数画等值线图时提示错误是怎么回事啊?谢谢解答
    Error using year (line 22)
    Please enter D.

    ReplyDelete
  16. Li Xu,您好!你提供的这个小波周期分析demo很清晰,是一个非常好的案例。我这里有一个问题向您请教一下: 图7显示的结果是55a的周期变化,但是仔细分析图7的曲线变化,实际的周期好像要小于40a(年)。具体应该怎么理解这个问题?希望能得到您的答复。谢谢!

    ReplyDelete
    Replies
    1. 小波方差图中(图 6)存在4个较为明显的峰值,它们依次从小至大对应着8a、19a、30a和55a的时间尺度。其中,最大峰值对应着55a的时间尺度,说明55a左右(时间尺度)的周期震荡最强,为年降水量变化的第一主周期(注意:不是55a是第一主周期);30a时间尺度对应着第二峰值,为第二主周期;第三、第四峰值分别对应着19a和8a的时间尺度,它们依次为降水量的第三和第四主周期。这说明上述4个周期的波动控制着降水量在整个时间域内的变化特征。

      Delete
  17. 你好,打扰一下,附件中的entendvalue函数运行提示无法定义具有重复性的函数,这是为什么啊?

    ReplyDelete
  18. LI_contourf函数代码运行的时候提示输入参数不足,第二十三行出错了,这是为什么呢?

    ReplyDelete