【问题标题】:How to calculate 7-day moving average in R?如何计算R中的7天移动平均线?
【发布时间】:2020-05-14 19:43:05
【问题描述】:

我正在使用zoo 包的rollmean 函数来计算一个简单的7 天移动平均线。该函数有一个参数align,如果我输入“right”、“center”或“left”,它会改变值。它们有什么区别?

示例代码:

test <- sample(1:50)
data <- rollmean(test, 7, fill = list(NA, NULL, NA), align = "right")

test <- cbind(test, data)

【问题讨论】:

    标签: r zoo


    【解决方案1】:

    alignrollmeanrollapply 中具有相同的含义,但在rollapply 中更容易看到,因为使用输入数据1:8 和窗口宽度3 并使用toString 而不是@987654326 @ 作为应用函数,我们可以显示在每个点使用了哪些索引。

    对齐是指当我们遍历输入的连续位置时,窗口的哪个边缘(或中心)与当前点对齐。

    因此使用长度为 3 的窗口,它使用当前位置的值和 align = "right" 的前 2 个位置。例如,对于输入 1:8 的第一个位置,没有右端位于第一个位置的 3 个值的窗口,因此我们得到一个 NA。对于输入的第二个位置,到该点只有 2 个位置,所以再次没有右端位于当前位置的 3 个位置的窗口,所以我们再次得到 NA。对于第三个位置,有三个位置以位置 3 结尾,因此我们将 c(1, 2, 3) 传递给 toString,它们的格式如下所示。对于第 4 个位置,还有 3 个位置的右端位于第 4 位,因此我们得到 2、3、4 等等,如下面代码中标记为 ## 的第一行所示。

    对于align = "center",它将窗口的中心放置在当前位置,因此它使用先前值、当前值和下一个值。

    对于align = "left",它将窗口的左端放在当前位置,因此它使用当前值和接下来的 2 个值。

    library(zoo)
    x <- 1:8
    
    rollapply(x, 3, toString, align = "right", fill = NA)
    ## [1] NA        NA        "1, 2, 3" "2, 3, 4" "3, 4, 5" "4, 5, 6" "5, 6, 7" "6, 7, 8"
    
    rollapply(x, 3, toString, align = "center", fill = NA)
    ## [1] NA        "1, 2, 3" "2, 3, 4" "3, 4, 5" "4, 5, 6" "5, 6, 7" "6, 7, 8" NA       
    
    rollapply(x, 3, toString, align = "left", fill = NA)
    ## [1] "1, 2, 3" "2, 3, 4" "3, 4, 5" "4, 5, 6" "5, 6, 7" "6, 7, 8" NA        NA      
    

    请注意,如果align= 未指定并且有包装器rollmeanrrollapplyr(最后注意r),则align = "center" 是默认值,默认为align = "right"

    【讨论】:

    • 可视化的好主意
    【解决方案2】:

    我认为将所有 3 个结果并排查看是很有启发性的:

    library(zoo)
    means <- sapply(c("right","center","left"),
                    function(x)zoo::rollmean(test,7,align = x, na.pad = TRUE))
    cbind(test,means)
          test    right   center     left
     [1,]    6       NA       NA 19.28571
     [2,]   50       NA       NA 21.42857
     [3,]   11       NA       NA 15.28571
     [4,]   16       NA 19.28571 15.00000
     [5,]    1       NA 21.42857 19.42857
     [6,]   26       NA 15.28571 25.28571
     [7,]   25 19.28571 15.00000 22.71429
     [8,]   21 21.42857 19.42857 24.42857
     [9,]    7 15.28571 25.28571 22.00000
    [10,]    9 15.00000 22.71429 23.42857
    ...
    [40,]   41 27.28571 31.85714 33.57143
    [41,]   49 29.42857 31.71429 33.85714
    [42,]   35 33.71429 31.42857 30.00000
    [43,]   20 31.85714 33.57143 26.85714
    [44,]   44 31.71429 33.85714 25.42857
    [45,]   28 31.42857 30.00000       NA
    [46,]   18 33.57143 26.85714       NA
    [47,]   43 33.85714 25.42857       NA
    [48,]   22 30.00000       NA       NA
    [49,]   13 26.85714       NA       NA
    [50,]   10 25.42857       NA       NA
    

    【讨论】:

    • na.pad 已弃用。请改用 fill=NA。
    【解决方案3】:

    ?rollmean 说:

    字符指定结果的索引是否应该 左对齐或右对齐或居中(默认) 观察的滚动窗口。

    让我们看几个不同的例子。我将使用rollmax,因为它的结果比(比如)rollmean 更容易/更快地看到。此外,由于我认为填充有助于可视化,因此我将包含 fill=NA,以确保所有返回与输入的长度相同。最后,我会rbind他们进行垂直对齐。

    set.seed(4)
    vec <- sample(100, size = 15)
    

    在宽度为 5 的第一个窗口中,它查看 59 到 79 之间的值。最大值为 79,使用align="left",它将结果放置在原始向量位置的最左侧。

    rbind(vec) # illustrative
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
    # vec    59    1   29   27   79   25   69   85   88     7    68    26     9    84    36
    ###      ^^^^^^^^^^^^^^^^^^^^^^ numbers considered in first window
    ###                          ^^ results go in this position when align="right"
    ###                ^^ results go in this position when align="center"
    ###      ^^ results go in this position when align="left"
    

    所以查看所有三个,注意 79 的位置......以及 NA 的位置。

    rbind(
      vec = vec,
      left = rollmax(vec, k=5, align="left", fill=NA),
      center = rollmax(vec, k=5, align="center", fill=NA),
      right = rollmax(vec, k=5, align="right", fill=NA)
    )
    #        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
    # vec      59    1   29   27   79   25   69   85   88     7    68    26     9    84    36
    # left     79   79   79   85   88   88   88   88   88    84    84    NA    NA    NA    NA
    # center   NA   NA   79   79   79   85   88   88   88    88    88    84    84    NA    NA
    # right    NA   NA   NA   NA   79   79   79   85   88    88    88    88    88    84    84
    

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      相关资源
      最近更新 更多