【问题标题】:Using moving averages in R在 R 中使用移动平均线
【发布时间】:2013-06-26 09:44:46
【问题描述】:

我需要一些帮助来平滑 R 中的一些数据。所以基本上,我只有一个“时间”列和一个“速度”列。速度基本上代表了某些蝌蚪的运动。只是我的数据有很多噪音,我认为使用“移动平均线”可能会帮助我平滑我的图表并揭示某些模式。我如何在 R 中做到这一点?或者有没有更好的平滑技术可以让像我这样的 R 新手用户更容易理解?

谢谢大家

我的数据基本上是这样的……但它持续了 9000 秒

Time    Velocity
1.36    2.4
1.81    1.2
2.19    2.4
2.51    2.1
2.98    1.8
3.51    3.0
4.88    2.1
5.38    2.0
6.52    2.4
6.71    1.2
7.29    2.4
7.67    2.1
8.27    1.8
9.13    3.0
9.95    2.1
10.69   2.0
11.29   2.54
12.82   1.64
13.32   2.70
13.89   2.19
14.33   2.44
14.93   2.93
15.75   2.77
17.63   3.21
18.18   2.4
18.82   1.2
20.02   2.4
20.86   2.1
21.44   1.8
22.24   3.0
23.07   2.1
23.67   2.0

【问题讨论】:

标签: r average


【解决方案1】:

查看 R 的 zoo 包中的 rollmean 函数。这应该符合您的需求!

更新:

现在我有更多的时间,这里有一些示例代码。如果您想在时间序列的开头和结尾填写值,则必须使用rollapply,否则只需使用rollmean。看看控制台输出,我的意思就会很清楚了。

# Packages
library(zoo)

# Start RNG
set.seed(10)

# Sample data
tmp <- data.frame(time = 1:30, 
                  velocity = round(runif(30, 1, 3), digits = 2))

# Moving average (window size = 5) using rollmean
rollmean(tmp[, 2], k = 5, fill = NA)
 [1]    NA    NA 1.806 1.694 1.682 1.620 1.588 1.726 1.896 2.014 1.952 1.944 1.916 1.828 1.620 1.680 1.602 1.792 1.966 2.192 2.396 2.378 2.206 2.142
[25] 2.232 2.018 2.184 2.164    NA    NA

# Moving average (window size = 5) using rollapply
rollapply(tmp[, 2], width = 5, function(...) {round(mean(...), digits = 3)}, partial = TRUE)
 [1] 1.823 1.965 1.806 1.694 1.682 1.620 1.588 1.726 1.896 2.014 1.952
[12] 1.944 1.916 1.828 1.620 1.680 1.602 1.792 1.966 2.192 2.396 2.378
[23] 2.206 2.142 2.232 2.018 2.184 2.164 2.103 1.910

【讨论】:

    【解决方案2】:

    R 中的移动平均线很简单:

    MoveAve <- function(x, width) {
        as.vector(filter(x, rep(1/width, width), sides=2));
    }
    

    x 是您的数据,width 是平均窗口的长度。

    使用filter函数的sides参数可以控制窗口的位置,见文档:

    如果边 = 1,则滤波器系数仅适用于过去的值;如果 边 = 2 它们以滞后 0 为中心。在这种情况下, 过滤器应该是奇数,但如果是偶数,则过滤器更多 在时间上向前而不是向后。

    【讨论】:

    • 平均窗口是什么意思?...所以如果我说宽度 = 20,它会平均每 20 秒间隔的速度吗?...。你能告诉我边代表什么吗?
    • width=20 时,滑动窗口会平均超过 20 个值。试试 x
    • @Mona Jalal:当然可以。它在列上执行平均值。如果你从函数中删除as.vector,它会返回一个矩阵。
    【解决方案3】:

    如果您加载“TTR”包(技术交易规则),您可以从 MA“家族”中选择众多 MA 之一。

    ?SMA
    

    SMA(x, n = 10, ...)

    EMA(x, n = 10, wilder = FALSE, ratio = NULL, ...)

    DEMA(x, n = 10, v = 1, wilder = FALSE, ratio = NULL)

    WMA(x, n = 10, wts = 1:n, ...)

    EVWMA(价格,数量,n = 10,...)

    ZLEMA(x, n = 10, ratio = NULL, ...)

    VWAP(价格,数量,n = 10,...)

    VMA(x, w, ratio = 1, ...)

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 2023-03-12
      • 2018-10-21
      • 2017-09-01
      • 2013-12-22
      • 2016-05-16
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多