这是我的玩具时间序列数据:
library(tidyverse); library(tsibble); library(feasts)
df <- tibble::tribble(
~date, ~A, ~B, ~C,
"1/31/2010", NA, 0.017, NA,
"2/28/2010", NA, 0.027, NA,
"3/31/2010", NA, 0.003, 0.003,
"4/30/2010", -0.022, 0.018, 0.018,
"5/31/2010", -0.036, 0.02, 0.02,
"6/30/2010", -0.046, 0.023, 0.023,
"7/31/2010", NA, 0.027, 0.027,
"8/31/2010", -0.022, 0.008, 0.008,
"9/30/2010", 0.059, -0.003, -0.003,
"10/31/2010", 0.024, 0.058, 0.058,
"11/30/2010", NA, 0.023, NA,
"12/31/2010", NA, 0.014, NA
)
我想计算多个时间序列的自相关 (acf(。忽略插补部分,我需要:
- 删除介于 NA 之间的变量(而不是时间序列开头和结尾的变量(,例如 2010 年 7 月 31 日的 A 的 NA。因此,在这种情况下,请删除变量 A。
- 使用 ACF 函数从 B 和 C 上的盛宴包计算潜在的自相关。
我从这里开始,卡住了:
df %>%
mutate(date = mdy(date)) %>%
pivot_longer(cols = -date) %>%
as_tsibble(key = name, index = date) %>%
ACF()
预期输出将具有每个可能的序列的自相关滞后。像 B 一样,10-11 个滞后值为 10 个,B 系列也是如此
关于第 1 部分
我们可以利用rle
.让我们定义一个简洁的自定义函数has_middle_NA
has_middle_NA <- function(x) {
rl <- rle(is.na(x))$values
any(rl[-c(1, length(rl))])
}
然后
df %>%
group_by(date) %>%
select_if(~ !has_middle_NA(.x)) %>%
ungroup()
## A tibble: 12 x 3
# date B C
# <chr> <dbl> <dbl>
# 1 1/31/2010 0.017 NA
# 2 2/28/2010 0.027 NA
# 3 3/31/2010 0.003 0.003
# 4 4/30/2010 0.018 0.018
# 5 5/31/2010 0.02 0.02
# 6 6/30/2010 0.023 0.023
# 7 7/31/2010 0.027 0.027
# 8 8/31/2010 0.008 0.008
# 9 9/30/2010 -0.003 -0.003
#10 10/31/2010 0.058 0.058
#11 11/30/2010 0.023 NA
#12 12/31/2010 0.014 NA
这将删除所有带有非前导或尾随NA
的列。
关于第2部分
根据你提供的数据,我仍然不清楚你想用ACF做什么;但也许这会有所帮助。
关键是将您的数据视为每月数据,忽略日期。然后,我们可以:
- 使用
zoo::yearmon
将数据转换为每月数据, - 选择那些没有"中间"
NA
的列, - 从宽到长转换,并从每列创建一个
tsibble
, - 使用
feasts::ACF
计算每列的 ACF,并将结果存储在tsibble
s 的list
列中
library(tsibble)
library(tidyverse)
library(feasts)
library(zoo)
df <- df %>%
mutate(date = as.yearmon(date, format = "%m/%d/%Y")) %>%
group_by(date) %>%
select_if(~ !has_middle_NA(.x)) %>%
ungroup() %>%
pivot_longer(-date) %>%
group_by(name) %>%
nest() %>%
mutate(
data = map(data, as_tsibble),
ACF = map(data, ACF))
## A tibble: 2 x 3
## Groups: name [2]
# name data ACF
# <chr> <list> <list>
#1 B <tsibble [12 × 2]> <tsibble [10 × 2]>
#2 C <tsibble [12 × 2]> <tsibble [7 × 2]>