我正在尝试为 names
中的每一个计算一个窗口的移动方差,假设为 4 年。 A
, B
和 C
.数据为每周:
> head(data1, 17)
date name value
1 1985-01-01 A -0.44008233
2 1985-01-01 B NA #Observe that there are some NA's
3 1985-01-01 C 0.38682496
4 1985-01-08 A 0.41806540
5 1985-01-08 B -0.05460831
6 1985-01-08 C -0.52051435
7 1985-01-15 A 1.25769395
8 1985-01-15 B 0.80272053
9 1985-01-15 C -0.34501742
10 1985-01-22 A -0.43401839
11 1985-01-22 B 0.91113966
12 1985-01-22 C 1.07131717
13 1985-01-29 A -1.55395857
14 1985-01-29 B -0.43281709
15 1985-01-29 C 0.98034779
16 1985-02-05 A 1.70557396
17 1985-02-05 B 0.44688788
到目前为止,我的方法是
dcast
数据然后运行 rollapply()
( zoo
) 列明智,移动窗口为 192 = 4*12*4:v <- dcast(data1, date ~ name, value.var = "value")
var <- rollapply(v[-1], width=4*12*4, var, fill=NA, by.column = T)
var <- cbind(v$date, var)
var[,1] <- as.Date(var[,1])
但是,我意识到有几个月我有四次观察(例如 2 月 7、14、21、28 日),而有些人每周有五次观察(例如 1 月的 1、8、15、22 和 29),因此使用
4 years * 12 months * 4 weeks
的窗口观察结果不正确。我想在时间窗口( width
)上添加这些额外的观察结果,但我不确定如何(或者甚至可能),因为这些变化取决于每月 5 周的次数和次数时间窗口内有每月 4 周的观察。另外,我想要一个
NA
当有 NA
移动时间窗口内的观察(我认为这是由 var()
自动处理的),而且我想忽略零观察。为此,我想我可以在运行运行方差函数之前删除零,然后最后以某种方式将它们放回去。所以你可以忽略那部分,当然,除非你有一些好主意可以一步完成。样本数据 :
set.seed(486)
date <- rep(seq(as.Date("1985-01-01"), as.Date("2010-01-1"), by="weeks"), each=3)
N <- length(date)
name <- c("A","B","C")
value <- rnorm(N)
i<-which(value %in% sample(value, 25)) ;i
j<-which(value %in% sample(value, 150)) ;j
value[i] <- NA
value[j] <- 0
data1 <- data.frame(date, name, value)
最佳答案
4 年有 208 周加 5 天,所以不能被整除为周。如果我们使用 209 周,那么我们在 4 年内只剩下 2 天,所以让我们尝试一下。
先转换 data1
至 "zoo"
类根据第二列的值将数据拆分为单独的列。 z
每个 A
将有一列, B
和 C
.然后定义一个不包括零的方差函数并将其与 rollapplyr
一起使用
library(zoo)
z <- read.zoo(data1, split = 2) # 1305 x 3
var0 <- function(x) var(x[x != 0])
r <- rollapplyr(z, 209, var0)
将其保留为动物园对象可能就足够了,但这会将其转换为具有列
Index
的 4 列数据框, A
, B
和 C
:fortify.zoo(r)
关于时间窗口不恒定时的运行方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30914717/