专注系列化高质量的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()函数除filtersides外的所有参数,含义和用法不变;

  • 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()函数同名,并且后者使用的频率很高。一旦用户加载dplyrtidyverse包,前者就会被后者覆盖:

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

时间序列数据的移动平均相关推荐

  1. 通过 Python 代码实现时间序列数据的统计学预测模型

    来源 | DeepHub IMBA 封图 | CSDN 付费下载于视觉中国 在本篇中,我们将展示使用 Python 统计学模型进行时间序列数据分析. 目标是:根据两年以上的每日广告支出历史数据,提前预 ...

  2. 独家 | ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)

    作者:夏米莎·查特吉 Sharmistha Chatterjee 翻译:陈之炎 校对:吴金笛 本文约5500字,建议阅读10+分钟. 本文探讨了简单的ARIMA/Sarima与LSTM的时间序列数据集 ...

  3. 季节性时间序列数据分析_如何指导时间序列数据的探索性数据分析

    季节性时间序列数据分析 为什么要进行探索性数据分析? (Why Exploratory Data Analysis?) You might have heard that before proceed ...

  4. 大规模时间序列数据自动异常检测架构

    Yahoo大规模时列数据异常检测技术及其高性能可伸缩架构 本文已经在InfoQ首发 本文是Yahoo在ACM国际会议上发布的一篇关于时序数据自动异常检测上的学术论文,对在智能监控尤其是趋势预测.异常数 ...

  5. R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据

    在本文中,我将介绍ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型如何用于预测给定的时间序列数据. 使用后移运算符计算滞后差异 我们可以使用backshift运算符来执行 ...

  6. 时序预测 | MATLAB实现趋势外推时间序列预测(含移动平均、指数平滑对比)

    时序预测 | MATLAB实现趋势外推时间序列预测(含移动平均.指数平滑对比) 目录 时序预测 | MATLAB实现趋势外推时间序列预测(含移动平均.指数平滑对比) 基本介绍 程序设计 学习总结 参考 ...

  7. 时间序列数据趋势分析 Cox-Stuart、Mann-Kendall、Dickey-Fuller

    时序数据趋势检测 斜率法 Cox-Stuart检验 Mann-Kendall检验 稳定性检验 滚动统计 Dickey-Fuller(迪基-福勒检验.单根检验) 时序数据趋势检测 斜率法 原理: 斜率法 ...

  8. 《量化金融R语言初级教程》一1.1 使用时间序列数据

    本节书摘来异步社区<量化金融R语言初级教程>一书中的第1章,第1.1节,作者: [匈牙利]Gergely Daróczi(盖尔盖伊) , 等 译者: 高蓉 , 李茂 责编: 胡俊英,更多章 ...

  9. ARIMA/Sarima与LSTM的时间序列数据集成学习

    动机 传统时间序列预测中最常使用到的时间序列模型有以下五种,包括: 自回归(AR)模型 移动平均(MA)模型 自回归移动平均(ARMA)模型 差分自回归移动平均模型(ARIMA) 季节性差分自回归移动 ...

最新文章

  1. 中国染料行业运营现状及前景产销需求预测报告2021-2027年版
  2. python 使用标准库连接linux实现scp和执行命令
  3. ajax div 赋值重新渲染_优化向:单页应用多路由预渲染指南
  4. 多表更新,用一个表更新另外一个表
  5. java hashset 源码_Java集合:HashSet的源码分析
  6. ICPC程序设计题解系列
  7. 关联——Apriori算法详解
  8. django 1366, “Incorrect string value: for column ‘‘ at row
  9. MacBook M1 虚拟机安装Windows7 Xp
  10. 思岚科技A1,A2雷达驱动安装
  11. 淘宝app搜索排名优化技巧
  12. 2021年N1叉车司机最新解析及N1叉车司机模拟考试
  13. 关于redis创建集群时出现[ERR] Node x.x.x.x:6379 is not empty. Either the node already knows other nodes (check
  14. 地图定位技术揭秘(一)
  15. python opencv获取图片分辨率_python-opencv遍历图片像素,并对像素进行操作
  16. vanish(squid) + HAProxy + nginx + memcached(redis)
  17. 大数据培训Spark 高频面试考点分享
  18. 百万现金+新机预装,华为开发者联盟力促“最佳新锐”出炉
  19. Python学习笔记——绘图设置(二)填色图与等值线图
  20. 基于环境小卫星的湖泊水质遥感监测

热门文章

  1. 作文素材——八字短句
  2. java如何遍历树_java 遍历树的四种方式
  3. 00后计算机学霸,这些00后学霸逆天了!超一本线135分,12岁少女考上985!
  4. 有哪些提高OCR文字识别软件识别正确率的方法
  5. 今日头条、广点通、快手最火的平台联调作弊码有哪些?
  6. 微信是如何飞起来的(延伸阅读:性,微信下的机会?一个超级用户的自白:移动社交那点事类kik手机通信录互动应用前景探讨)
  7. iphone6s计算机驱动,iPhone 6s驱动安装失败解决办法【详解】
  8. Confluence集成实践:2:Confluence的RestAPI
  9. 中职计算机英语教学设计,中职英语教学设计模板
  10. 据说可以用来测试智力的几张图片