很多做水文气象的人可能都有过这个经历:手里握着一串几十年甚至上百年的降水数据,导师或者审稿人开口就问,这地方的降雨量到底有没有趋势?周期是多少年?如果你只回答“看起来增加了”“好像有个8年周期”,那基本过不了关。这时候,出镜率最高的两个工具就是降雨量MK检验和Morlet小波分析。MK检验用来判断趋势有没有统计意义,Morlet小波分析用来定位周期成分在什么时候出现、什么时候消失。我自己刚开始用这两个方法时也走过不少弯路,这篇就从一个能直接跑的Matlab脚本出发,把原理、代码、参数选择和最容易踩的坑一起说清楚,适合刚接触时间序列分析的研究生,也适合想快速复核结论的从业者。
1. 先把结论说清楚:MK检验和小波分析分别解决什么问题
1.1 MK检验:不假设正态,只看趋势是否显著
Mann-Kendall检验是一个非参数趋势检验方法,它不要求数据服从正态分布,对少数异常值也不那么敏感,这是它在水文气象领域特别受欢迎的原因。降水量数据经常出现偏态分布,比如某个年份来一场极端暴雨,实测值比常年大好几倍,如果用普通的线性回归去做趋势检验,一个极值就可能把斜率拽偏。MK检验不比较数值本身,而是比较序列里两两数据的大小关系,所以它受极端值的影响要小得多。
它的原假设是序列没有单调趋势,备择假设是存在单调上升或下降趋势。输出结果里最关键的两个值是Z统计量和p值。Z的绝对值越大,趋势越强;p小于0.05通常认为趋势显著,在论文里写“年降水量呈显著增加趋势”时才站得住脚。
不过MK检验只能回答“有没有趋势”,不能回答“趋势有多大”。所以实际使用中,我一般会再配一个Sen斜率估计,用所有相邻点对之间的斜率中位数来代表单位时间变化量,单位通常是mm/年。这样MK检验给显著性,Sen斜率给变化速率,一篇文章里关于趋势部分就完整了。
1.2 Morlet小波:找到序列里的“隐藏周期”
Morlet小波是连续小波变换里最常用的复值小波,它的特点是既能看信号在时间上的变化,又能看频率上的周期成分。和傅里叶变换不同,小波变换会把“时间窗”收缩或拉伸,在短尺度上时间分辨率高、周期分辨率低,在长尺度上周期分辨率高、时间分辨率低。这个特性恰好适合分析降雨量这种非平稳序列。
什么叫非平稳?就是说它的统计性质会随时间变化。比如某地区上世纪60年代到80年代存在明显的3年
