我在R中有以下数据,我试图通过使用rollify创建一个函数来计算5天滚动Z分数(X减去滚动平均值,除以滚动标准差)。
library(tibbletime)
library(tidyverse)
rolling_Z <- rollify(~((.x - mean(.x))/sd(.x)), window = 5)
data <- structure(list(Date = structure(c(19282, 19283, 19284, 19285,
19286, 19289, 19290, 19291, 19292, 19293, 19296, 19297, 19298,
19299, 19300, 19303), class = "Date"), `US 10 Year` = c(3.824,
3.881, 3.881, 3.947, 3.943, 4.018, 4.01, 4.007, 4.134, 4.228,
4.217, 4.242, 4.102, 4.003, 3.919, 3.998)), row.names = c(NA,
-16L), class = c("tbl_df", "tbl", "data.frame"))
data %>%
mutate(Z_Score = rolling_Z(`US 10 Year`))但是,我得到了以下错误。我猜是因为US 10 Year的长度与滚动平均值和滚动标准差的长度不一样,就像前四天一样,安娜。有没有办法解决这个问题?
Error in `mutate()`:
! Problem while computing `Z_Score = rolling_Z(`US 10 Year`)`.
x `Z_Score` must be size 16 or 1, not 64.发布于 2022-11-09 10:52:44
所以我不知道tibbletime是如何工作的,但是您可以使用zoo包,它有多个roll函数。
您没有指定您需要的是前滚还是两边的滚动,所以在本例中,我使用了rollapplyr()
动物园roll()函数家族中有一些参数允许您指定如何滚动,是否应该允许部分,等等,您可以更改这些参数以满足您的需要。
library(tidyverse)
library(zoo)
data %>%
mutate(mean = rollapplyr(`US 10 Year`, 5, mean, partial = T),
sd = rollapplyr(`US 10 Year`, 5, sd, partial = T)) %>%
mutate(rolling_Z = (`US 10 Year` - mean) / sd)
output ---------
Date `US 10 Year` mean sd rolling_Z
<date> <dbl> <dbl> <dbl> <dbl>
1 2022-10-17 3.82 3.82 NA NA
2 2022-10-18 3.88 3.85 0.0403 0.707
3 2022-10-19 3.88 3.86 0.0329 0.577
4 2022-10-20 3.95 3.88 0.0503 1.27
5 2022-10-21 3.94 3.90 0.0511 0.936
6 2022-10-24 4.02 3.93 0.0568 1.48
7 2022-10-25 4.01 3.96 0.0560 0.896
8 2022-10-26 4.01 3.98 0.0368 0.598
9 2022-10-27 4.13 4.02 0.0692 1.61
10 2022-10-28 4.23 4.08 0.0986 1.51
11 2022-10-31 4.22 4.12 0.107 0.911
12 2022-11-01 4.24 4.17 0.0981 0.778
13 2022-11-02 4.10 4.18 0.0625 -1.32
14 2022-11-03 4.00 4.16 0.103 -1.51
15 2022-11-04 3.92 4.10 0.138 -1.29
16 2022-11-07 4.00 4.05 0.124 -0.442如果你想把它变成一个函数,你也可以这样做。
roll_z <- function(data, x) {
data %>%
mutate(mean = rollapplyr(x, 5, mean, partial = T),
sd = rollapplyr(x, 5, sd, partial = T)) %>%
mutate(rolling_Z = (x - mean) / sd) %>%
pull(rolling_Z)
}
data$rolling_Z <- roll_z(data, data$`US 10 Year`)https://stackoverflow.com/questions/74373528
复制相似问题