如何计算 R 中的 7 天移动平均线?
How to calculate 7-day moving average in R?
我正在使用 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)
我认为将所有 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
?rollmean
说:
character specifying whether the index of the result should
be left- or right-aligned or centered (default) compared to
the rolling window of observations.
让我们看几个不同的例子。我将使用 rollmax
,因为它的结果 easier/faster 比(比方说)rollmean
好一些。此外,由于我认为填充有助于可视化,我将包括 fill=NA
,确保所有 returns 与输入的长度相同。最后,我将 rbind
它们进行垂直对齐。
set.seed(4)
vec <- sample(100, size = 15)
宽度为5的第一个window,它看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
align
在 rollmean
和 rollapply
中具有相同的含义,但在 rollapply
中更容易看到,因为使用输入数据 1:8 和 window 宽度为 3 并使用 toString
而不是 mean
作为要应用的函数,我们可以显示每个点使用了哪些索引。
对齐是指 window 的哪条边(或中心)与当前点对齐,因为我们遍历输入的连续位置。
因此使用长度为 3 的 window,它使用当前位置的值和前 2 个位置的值对齐 = "right"。例如,对于输入 1:8 的第一个位置,不存在右端位于第一个位置的 3 个值的 window,因此我们得到 NA。对于输入的第二个位置,到那个点只有 2 个位置,所以再一次没有 window 的 3 个位置的右端在当前位置,所以我们再次得到 NA。对于第三个位置,有三个位置以位置 3 结尾,因此我们将 c(1, 2, 3) 传递给 toString,其格式化如下所示。对于第 4 个位置,还有 3 个位置的右端位于位置 4,因此我们得到 2、3、4 等等,如下面代码中标记为## 的第一行所示。
对于 align = "center"
它将 window 的中心放在当前位置,因此它使用先前值、当前值和下一个值。
对于 align = "left"
它将 window 的左端放在当前位置,因此它使用当前值和接下来的 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=
并且有包装器 rollmeanr
和 rollapplyr
(请注意最后的 r
,则 align = "center"
是默认值),默认为 align = "right"
.
我正在使用 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)
我认为将所有 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
?rollmean
说:
character specifying whether the index of the result should be left- or right-aligned or centered (default) compared to the rolling window of observations.
让我们看几个不同的例子。我将使用 rollmax
,因为它的结果 easier/faster 比(比方说)rollmean
好一些。此外,由于我认为填充有助于可视化,我将包括 fill=NA
,确保所有 returns 与输入的长度相同。最后,我将 rbind
它们进行垂直对齐。
set.seed(4)
vec <- sample(100, size = 15)
宽度为5的第一个window,它看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
align
在 rollmean
和 rollapply
中具有相同的含义,但在 rollapply
中更容易看到,因为使用输入数据 1:8 和 window 宽度为 3 并使用 toString
而不是 mean
作为要应用的函数,我们可以显示每个点使用了哪些索引。
对齐是指 window 的哪条边(或中心)与当前点对齐,因为我们遍历输入的连续位置。
因此使用长度为 3 的 window,它使用当前位置的值和前 2 个位置的值对齐 = "right"。例如,对于输入 1:8 的第一个位置,不存在右端位于第一个位置的 3 个值的 window,因此我们得到 NA。对于输入的第二个位置,到那个点只有 2 个位置,所以再一次没有 window 的 3 个位置的右端在当前位置,所以我们再次得到 NA。对于第三个位置,有三个位置以位置 3 结尾,因此我们将 c(1, 2, 3) 传递给 toString,其格式化如下所示。对于第 4 个位置,还有 3 个位置的右端位于位置 4,因此我们得到 2、3、4 等等,如下面代码中标记为## 的第一行所示。
对于 align = "center"
它将 window 的中心放在当前位置,因此它使用先前值、当前值和下一个值。
对于 align = "left"
它将 window 的左端放在当前位置,因此它使用当前值和接下来的 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=
并且有包装器 rollmeanr
和 rollapplyr
(请注意最后的 r
,则 align = "center"
是默认值),默认为 align = "right"
.