时间序列数据的移动平均
专注系列化、高质量的R语言教程
推文索引 | 联系小编 | 付费合集
移动平均(Moving Average)是对时间序列数据常用的一种处理办法,目的是减弱数据因偶然因素造成的波动性,便于分析数据的变化趋势。
本篇推文目录如下:
理论基础
R语言的函数
filter函数
定义新函数
多列数据求移动平均
特别注意
理论基础
阶简单移动平均的方法是:时间点的移动平均值是它与前面个时间点(滞后期)的原始数据的平均数。即
对于简单移动平均来说,参与平均的每期系数都相同,即。如果不相同,则是一般化的加权移动平均。即
通常来说,加权系数之和应为1:
此外,还有居中移动平均。它是以时间点及其前、后各个时间点的(加权)平均数作为移动平均值。以简单居中移动平均为例:
其中为奇数。
R语言的函数
filter函数
在R语言中,可以使用基础统计包stats
中的filter()
函数进行各种移动平均。它的语法结构如下:
filter(x, filter, method = c("convolution", "recursive"),sides = 2, circular = FALSE, init)
其中,
x
为原始时间序列数据;filter
为加权系数;向量形式,向量长度是移动平均的阶数;method
的默认值convolution
表示移动平均方法,另一个取值recursive
表示自回归方法;side = 1
时为(加权)移动平均;side = 2
(默认值)时为居中(加权)移动平均。
下面以1到20的自然数为原始时间序列数据,使用5阶移动平均举几个例子。
对于简单移动平均来说,filter
参数是长度为5,元素均为1/5的向量;sides
参数为1:
x <- 1:20 ## 普通移动平均
filter(x, filter = rep(0.2, 5),sides = 1)
## [1] NA NA NA NA 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
简单居中移动平均的filter
参数同上,sides
参数为2:
## 居中移动平均
filter(x, filter = rep(0.2, 5),sides = 2)
## [1] NA NA 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 NA NA
加权移动平均的每期系数不同,通常来说倾向于离点越近,权重越大。比如,设定权重值按线性增长:
w <- 1:5/(sum(1:5))
w
## [1] 0.06666667 0.13333333 0.20000000 0.26666667 0.33333333filter(x, filter = w, sides = 1)
## [1] NA NA NA NA 2.333333 3.333333 4.333333
## [8] 5.333333 6.333333 7.333333 8.333333 9.333333 10.333333 11.333333
## [15] 12.333333 13.333333 14.333333 15.333333 16.333333 17.333333
定义新函数
通过前面的例子可以看到,移动平均序列的前个值和居中移动平均的前、后个值都是缺失值,这是因为这些位置缺乏足够多的滞后期来计算移动平均值。
一种解决方法是使用这些位置的累积平均值作为它们的移动平均值:
ma <- filter(x, filter = rep(0.2, 5), sides = 1)
ma[1:4] <- cumsum(x[1:4])/1:4
ma
## [1] 1.0 1.5 2.0 2.5 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0
## [16] 14.0 15.0 16.0 17.0 18.0
为了方便,可以编写如下一个新函数:
filter.new <- function(x, ..., filter = NULL, sides = 1,n = NULL, cum = T) {if (is.null(n)) n = length(filter) else filter = rep(1/n, n)ma <- stats::filter(x, ..., filter = filter, sides = sides) if (cum) ma[1:n] <- cumsum(x[1:n])/1:nreturn(ma)
}
用法说明:
...
表示filter()
函数除filter
和sides
外的所有参数,含义和用法不变;
filter
参数含义和用法同filter()
函数,但是当新增参数n
不为空时可忽略;
sides
参数含义和用法同filter()
函数,但默认值为1;
n
表示移动平均的阶数;
cum = TRUE
时表示使用累积平均值表示前n-1
个时间点的移动平均值。
filter.new(x, n = 5)
## [1] 1.0 1.5 2.0 2.5 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0
## [16] 14.0 15.0 16.0 17.0 18.0filter.new(x, filter = rep(0.2, 5))
## [1] 1.0 1.5 2.0 2.5 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0
## [16] 14.0 15.0 16.0 17.0 18.0
多列数据求移动平均
filter()
函数是支持多列矩阵同时计算移动平均值的:
y <- matrix(1:30, ncol = 3)filter(y, rep(0.2, 5), sides = 1)
## [,1] [,2] [,3]
## 1 NA NA NA
## 2 NA NA NA
## 3 NA NA NA
## 4 NA NA NA
## 5 3 13 23
## 6 4 14 24
## 7 5 15 25
## 8 6 16 26
## 9 7 17 27
## 10 8 18 28
但不支持多列数据框:
y <- data.frame(y)filter.new(y, n = 5)
## Error in `[.data.frame`(x, 1:n) : 选择了未定义的列
自定义的filter.new()
函数也一样。
对于多列数据框而言,我们可以先将其转化为矩阵;或者使用apply()
函数进行向量化运算:
apply(y, 2, filter.new, n = 5)
## [,1] [,2] [,3]
## [1,] 1.0 11.0 21.0
## [2,] 1.5 11.5 21.5
## [3,] 2.0 12.0 22.0
## [4,] 2.5 12.5 22.5
## [5,] 3.0 13.0 23.0
## [6,] 4.0 14.0 24.0
## [7,] 5.0 15.0 25.0
## [8,] 6.0 16.0 26.0
## [9,] 7.0 17.0 27.0
## [10,] 8.0 18.0 28.0
特别注意
需要特别注意的是,这里使用的filter()
函数与dplyr
包中进行样本筛选的filter()
函数同名,并且后者使用的频率很高。一旦用户加载dplyr
或tidyverse
包,前者就会被后者覆盖:
library(dplyr)
此时,再调用filter()
函数就会默认为后者,导致本文前面一些代码不能正常运行:
filter(x, filter = rep(0.2, 5), sides = 1)
## Error in UseMethod("filter") :
## no applicable method for 'filter' applied to an object of class ## "c('integer', 'numeric')"
解决办法是在filter()
函数前加上工具包名称加以区别:
stats::filter(x, filter = rep(0.2, 5), sides = 1)
## [1] NA NA NA NA 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
时间序列数据的移动平均相关推荐
- 通过 Python 代码实现时间序列数据的统计学预测模型
来源 | DeepHub IMBA 封图 | CSDN 付费下载于视觉中国 在本篇中,我们将展示使用 Python 统计学模型进行时间序列数据分析. 目标是:根据两年以上的每日广告支出历史数据,提前预 ...
- 独家 | ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)
作者:夏米莎·查特吉 Sharmistha Chatterjee 翻译:陈之炎 校对:吴金笛 本文约5500字,建议阅读10+分钟. 本文探讨了简单的ARIMA/Sarima与LSTM的时间序列数据集 ...
- 季节性时间序列数据分析_如何指导时间序列数据的探索性数据分析
季节性时间序列数据分析 为什么要进行探索性数据分析? (Why Exploratory Data Analysis?) You might have heard that before proceed ...
- 大规模时间序列数据自动异常检测架构
Yahoo大规模时列数据异常检测技术及其高性能可伸缩架构 本文已经在InfoQ首发 本文是Yahoo在ACM国际会议上发布的一篇关于时序数据自动异常检测上的学术论文,对在智能监控尤其是趋势预测.异常数 ...
- R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据
在本文中,我将介绍ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型如何用于预测给定的时间序列数据. 使用后移运算符计算滞后差异 我们可以使用backshift运算符来执行 ...
- 时序预测 | MATLAB实现趋势外推时间序列预测(含移动平均、指数平滑对比)
时序预测 | MATLAB实现趋势外推时间序列预测(含移动平均.指数平滑对比) 目录 时序预测 | MATLAB实现趋势外推时间序列预测(含移动平均.指数平滑对比) 基本介绍 程序设计 学习总结 参考 ...
- 时间序列数据趋势分析 Cox-Stuart、Mann-Kendall、Dickey-Fuller
时序数据趋势检测 斜率法 Cox-Stuart检验 Mann-Kendall检验 稳定性检验 滚动统计 Dickey-Fuller(迪基-福勒检验.单根检验) 时序数据趋势检测 斜率法 原理: 斜率法 ...
- 《量化金融R语言初级教程》一1.1 使用时间序列数据
本节书摘来异步社区<量化金融R语言初级教程>一书中的第1章,第1.1节,作者: [匈牙利]Gergely Daróczi(盖尔盖伊) , 等 译者: 高蓉 , 李茂 责编: 胡俊英,更多章 ...
- ARIMA/Sarima与LSTM的时间序列数据集成学习
动机 传统时间序列预测中最常使用到的时间序列模型有以下五种,包括: 自回归(AR)模型 移动平均(MA)模型 自回归移动平均(ARMA)模型 差分自回归移动平均模型(ARIMA) 季节性差分自回归移动 ...
最新文章
- 中国染料行业运营现状及前景产销需求预测报告2021-2027年版
- python 使用标准库连接linux实现scp和执行命令
- ajax div 赋值重新渲染_优化向:单页应用多路由预渲染指南
- 多表更新,用一个表更新另外一个表
- java hashset 源码_Java集合:HashSet的源码分析
- ICPC程序设计题解系列
- 关联——Apriori算法详解
- django 1366, “Incorrect string value: for column ‘‘ at row
- MacBook M1 虚拟机安装Windows7 Xp
- 思岚科技A1,A2雷达驱动安装
- 淘宝app搜索排名优化技巧
- 2021年N1叉车司机最新解析及N1叉车司机模拟考试
- 关于redis创建集群时出现[ERR] Node x.x.x.x:6379 is not empty. Either the node already knows other nodes (check
- 地图定位技术揭秘(一)
- python opencv获取图片分辨率_python-opencv遍历图片像素,并对像素进行操作
- vanish(squid) + HAProxy + nginx + memcached(redis)
- 大数据培训Spark 高频面试考点分享
- 百万现金+新机预装,华为开发者联盟力促“最佳新锐”出炉
- Python学习笔记——绘图设置(二)填色图与等值线图
- 基于环境小卫星的湖泊水质遥感监测
热门文章
- 作文素材——八字短句
- java如何遍历树_java 遍历树的四种方式
- 00后计算机学霸,这些00后学霸逆天了!超一本线135分,12岁少女考上985!
- 有哪些提高OCR文字识别软件识别正确率的方法
- 今日头条、广点通、快手最火的平台联调作弊码有哪些?
- 微信是如何飞起来的(延伸阅读:性,微信下的机会?一个超级用户的自白:移动社交那点事类kik手机通信录互动应用前景探讨)
- iphone6s计算机驱动,iPhone 6s驱动安装失败解决办法【详解】
- Confluence集成实践:2:Confluence的RestAPI
- 中职计算机英语教学设计,中职英语教学设计模板
- 据说可以用来测试智力的几张图片