r语言 - 我们如何检测和删除介于 NA 之间的变量,并计算多个时间序列上的 ACF?



这是我的玩具时间序列数据:

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(。忽略插补部分,我需要:

  1. 删除介于 NA 之间的变量(而不是时间序列开头和结尾的变量(,例如 2010 年 7 月 31 日的 A 的 NA。因此,在这种情况下,请删除变量 A。
  2. 使用 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,并将结果存储在tsibbles 的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]>

最新更新