R 如何在使用hts::combinef()协调自定义预测时使用加权最后平方?

R 如何在使用hts::combinef()协调自定义预测时使用加权最后平方?,r,time-series,hierarchy,forecast,R,Time Series,Hierarchy,Forecast,我正在尝试使用hts包中的combinef函数协调自定义预测。 我想比较重组的自动化方法和重组的自定义预测 () combinef(forecast.gts)的自动coutertpart非常用户友好。 如果需要自底向上预测,则可以设置method=“comb”。 如果需要协调,则您可以通过将参数权重设置为权重=c(“wls”、“ols”、“N系列”),在加权最后一个正方形、普通最后一个正方形和结构缩放之间进行选择 对于combinef(),权重参数的默认值是普通的最后平方,因此这种方法可以很容易

我正在尝试使用hts包中的combinef函数协调自定义预测。 我想比较重组的自动化方法和重组的自定义预测 ()

combinef(forecast.gts)的自动coutertpart非常用户友好。 如果需要自底向上预测,则可以设置method=“comb”。 如果需要协调,则您可以通过将参数权重设置为权重=c(“wls”、“ols”、“N系列”),在加权最后一个正方形、普通最后一个正方形和结构缩放之间进行选择

对于combinef(),权重参数的默认值是普通的最后平方,因此这种方法可以很容易地实现。 在另一个线程中,已经解释了如何应用自底向上方法()

我现在也对使用“wls”以及als“N系列”感兴趣。 有没有一个简单的方法来实现这一点

编辑 我深入研究了forecast.gts()和combinef()函数的原始代码。我最终得到了以下自定义代码:

library(hts)
library(rlist)

#forecast grouped time series by custom function
ally_df <- aggts(htseg1) %>% as.data.frame
forecast_list <- apply(ally_df, 2, function(x){x %>% auto.arima %>% forecast(h = 12)})

ally_fitted <- lapply(forecast_list, function(x){x$fitted %>% as.data.frame}) %>% list.cbind
colnames(ally_fitted) <- colnames(ally)

ally_forecast <- lapply(forecast_list, function(x){x$mean %>% as.data.frame}) %>% list.cbind
colnames(ally_forecast) <- colnames(ally)


#create weights for reconciliation
recomb_approaches <- c("wls", "ols", "nseries", "bu")
recomb_approach <- recomb_approaches[1]

if(recomb_approach == "bu"){
  
  weights <- c(rep(0, ncol(ally_df)-ncol(htseg1$bts)), rep(1, ncol(htseg1$bts)))
  
}else if(recomb_approach == "ols"){
  
  weights <- NULL
  
}else if(recomb_approach == "wls"){
  
  tmp.resid <- ally_df - ally_fitted
  weights <- 1/colMeans(tmp.resid^2, na.rm = TRUE)
  
}else if(recomb_approach == "nseries"){
  
  # A function to calculate No. of groups at each level
  Mlevel <- function(xgroup) {
    m <- apply(xgroup, 1, function(x) length(unique(x)))
    return(m)
  }
  
  # A function to get the inverse of row sums of S matrix
  InvS4g <- function(xgroup) {
    mlevel <- Mlevel(xgroup)
    len <- length(mlevel)
    repcount <- mlevel[len]/mlevel
    inv.s <- 1/unlist(mapply(rep, repcount, mlevel, SIMPLIFY = FALSE))
    return(inv.s)
  }
  weights <- InvS4g(htseg1$groups)
}

ally_forecast_recombined_df <- combinef(ally_forecast
                                      , nodes = get_nodes(htseg1)
                                      , weights = weights
                                      , algorithms = "lu"
                                      , keep = "bottom"
                                      , parallel = TRUE
                                      , num.cores = cores
) 
库(hts)
图书馆(rlist)
#按自定义函数预测分组的时间序列
ally_df%as.data.frame
预测列表%auto.arima%>%forecast(h=12)})
ally_已安装%as.data.frame})%%>%list.cbind
colnames(ally_fitted)%list.cbind

colnames(ally_forecast)WLS forecast对账使用与剩余方差相等的一步预测方差。下面是一个小示例中的一些代码

库(hts)

h感谢您提供的工作示例。我深入研究了您的forecast.gts代码,并使用部分代码为combinef()函数生成权重(选中编辑)。这会按它应该的方式工作吗?