Я пытаюсь рассчитать скользящую дисперсию с окном, скажем, 4 года, для каждого из names
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])
Однако я понял, что для некоторых месяцев у меня есть четыре наблюдения (например, 7, 14, 21, 28 февраля), а для некоторых у меня пять еженедельных наблюдений (например, 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)