问题描述
我正在使用hts包中的aggts()函数来汇总我的分层时间序列。 在汇总时间序列之前,该函数将NA替换为零。 如果至少一个观测值不是NA,这将很有用。但是,如果给定时间的所有观测值均为NA,则我希望保留NA而不是0。
编辑(工作示例):
library(hts)
df <- data.frame(
AB = c(5,10,15,NA,25,30,40),AA = c(10,20,50,60,70,80)
)
hts_object <- hts(df)
> aggts(hts_object)
Time Series:
Start = 1
End = 8
Frequency = 1
Total AB AA
1 15 5 10
2 30 10 20
3 45 15 30
4 0 0 0
5 75 25 50
6 90 30 60
7 70 0 70
8 120 40 80
但是我需要的是:
> aggts(hts_object)
Time Series:
Start = 1
End = 8
Frequency = 1
Total AB AA
1 15 5 10
2 30 10 20
3 45 15 30
4 NA NA NA
5 75 25 50
6 90 30 60
7 70 NA 70
8 120 40 80
Edit2(更新了“ hts”软件包后):
> aggts(hts_object)
Time Series:
Start = 1
End = 8
Frequency = 1
Total AB AA
1 15 5 10
2 30 10 20
3 45 15 30
4 NA NA NA
5 75 25 50
6 90 30 60
7 NA NA 70
8 120 40 80
这不是我所期望的。也许通过一些背景信息会更清楚。由于Covid-19,我必须将多个每月数据点标记为异常值。如果所有层次结构级别的观察值都是NA,则在汇总时间序列后,我希望保留NA。但是,如果不是在特定层次结构级别上的所有观察值都为NA,则必须加和。
我现实生活中的业务示例是:
-
所有层次结构级别的全局离群值(例如Covid-19)
->如果所有底部时间序列均为NA,则所有聚合时间序列都应包含NA
-
具有不同市场进入时间的产品(某些时间序列具有领先的NA)
->聚合级别需要sum(na.rm = TRUE)
-
经典缺失观察
->聚合级别需要sum(na.rm = TRUE),也许事先需要插值
解决方法
现在固定在开发版本中的https://github.com/earowang/hts
如果NA实际为零,则将它们替换为零。
如果确实缺少它们,则根据定义,总和必须为NA,因为您不知道其价值。您可以将其替换为估算值,也可以继续处理包含NA的数据。包括ARIMA模型在内的某些模型都可以毫无问题地处理NA。
,您可以考虑对数据帧进行预处理,以便将NA值转换为零,除非整个行仅包含NA:
library(dplyr)
df %>%
# label which rows contain only NAs
plyr::adply(1,.fun = function(x) ifelse(all(is.na(x)),TRUE,FALSE)) %>%
# in all columns with numeric data,convert NAs to zeros,UNLESS the row contains only NAs
mutate(across(where(is.numeric),function(x) ifelse(is.na(x) & !V1,x))) %>%
# remove column of NA-only labels created in first step
select(-V1) %>%
hts() %>%
aggts()
使用hts::aggts
开发版本的结果:
Time Series:
Start = 1
End = 8
Frequency = 1
Total AB AA
1 15 5 10
2 30 10 20
3 45 15 30
4 NA NA NA
5 75 25 50
6 90 30 60
7 70 0 70
8 120 40 80