R 如何保持;“真的”;使用aggts聚合分层或分组时间序列时的NAs?

R 如何保持;“真的”;使用aggts聚合分层或分组时间序列时的NAs?,r,time-series,R,Time Series,我正在使用hts包中的aggts()函数来聚合我的分层时间序列。 在聚合时间序列之前,该函数将NAs替换为零。 如果至少有一个观测值不为NA,则此选项非常有用。但是如果给定时间内的所有观测值都是NA,我希望保持NA而不是0 编辑(工作示例): library(hts) df <- data.frame( AB = c(5, 10, 15, NA, 25, 30, NA, 40) , AA = c(10, 20, 30, NA, 50, 60, 70, 80) ) hts_obj

我正在使用hts包中的aggts()函数来聚合我的分层时间序列。 在聚合时间序列之前,该函数将NAs替换为零。 如果至少有一个观测值不为NA,则此选项非常有用。但是如果给定时间内的所有观测值都是NA,我希望保持NA而不是0

编辑(工作示例):

library(hts)

df <- data.frame(
  AB = c(5, 10, 15, NA, 25, 30, NA, 40)
  , AA = c(10, 20, 30, NA, 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    NA NA 70
8   120 40 80

Edit2(更新“hts”软件包后):

library(hts)

df <- data.frame(
  AB = c(5, 10, 15, NA, 25, 30, NA, 40)
  , AA = c(10, 20, 30, NA, 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    NA NA 70
8   120 40 80
这不是我所期望的。也许有了一些背景资料,这会更清楚。由于新冠病毒-19,我必须将几个月的数据点标记为异常值。如果所有层次结构级别上的观察都是NAs,我希望在聚合时间序列后保留NAs。但是,如果不是特定层次级别上的所有观察都是NAs,则需要求和

我的实际业务示例如下:

  • 所有层次结构级别的全局异常值(如新冠病毒-19)

    -->如果所有底部时间序列均为NA,则所有聚合时间序列均应包含NA

  • 具有不同市场进入时间的产品(某些时间序列具有领先的NAs)

    -->聚合级别需要总和(na.rm=TRUE)

  • 经典缺失观测值

    -->聚合级别需要求和(na.rm=TRUE),可能需要事先进行插值


现在已在开发版本中修复

如果NAs实际上是零,则将其替换为零


如果它们确实缺失,那么根据定义,总和必须为NA,因为您无法知道其值。您可以将它们替换为估计值,或者继续处理包含NAs的数据。一些模型,包括arima模型,将处理NAs而没有问题。

可以考虑预处理数据文件,使NA值被转换为零,除非整个行仅包含NAs:

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, 0, 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

我测试了新版本的“hts”软件包,并在上面提供了更多详细信息,因为当前的开发版本没有按照我预期的方式实现。我看到了您的编辑,我完全同意,如果确实缺少值,那么总和必须为NA。但产品层次结构可能包含具有不同发布日期的时间序列。每个较年轻的产品都会产生一个时间序列,开始时为NAs或零。时间序列开始处的零将降低预测精度。我认为用户应该负责插值缺失的值,因此NA+NA=NA和NA+10=10。如果某些时间序列在开始时有NAs,那么通过事先使用na.trim(type=“left”)将更容易实现分层预测的自动化。年轻的产品应该在开始时有零,因为在发布之前没有销售。这些都没有丢失。那么,所使用的时间序列模型应该考虑到这种行为。你可能需要使用一个计数时间序列模型。我在这里辩护地理解你的观点,但是你如何处理“真”零呢?如果时间序列以n个零开始,Auto.arima的性能会更差。在插值“真”缺失值之前,考虑“真”NAs,在所有观测值都是NAs的情况下,使用No.Trimm(“左”)来增加预测精度,如果特定的时间序列比其他的短,则更为舒适。由于时间序列中可能存在“真”零,因此切断前导零将更加复杂。据我所知,只有已经发布的产品才能实现零销售额。我建议您编写自己的预测函数来过滤前导零。