如何计算R中的7天移动平均线?

Ale*_*hes 0 r zoo

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

示例代码:

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

test <- cbind(test, data)
Run Code Online (Sandbox Code Playgroud)

Ian*_*ell 7

我认为将所有 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
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 5

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

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

因此,使用长度为 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      
Run Code Online (Sandbox Code Playgroud)

请注意,这align = "center"是默认的 ifalign=未指定并且有包装器,rollmeanr并且rollapplyr(最后注意r),默认为align = "right".