使用 GTS 进行分层数据预测
Hierarchical data forecast using GTS
我 运行 在使用 GTS 指定两个层次结构组时出错。错误是:
Error in colnames<-
(*tmp*
, value = unlist(labels[levels])) :
length of 'dimnames' [2] not equal to array extent
我用下面的代码重现了这个问题。在此示例中,有两个层次结构 State/County 和 Industry/Sub-industry/product。 State/County 在这个例子中是常量——这在我的实际数据集中可能是也可能不是。
y3 <- ts(matrix(rnorm(25),ncol=5,nrow=5))
blnames3 <- paste(rep("CA",5), # State
rep("AL",5), # County
rep("O",5), # Industry
c("P","Q","Q","P","R"), # Sub-industry
c("514","807","514","807","807"), # product
sep="")
colnames(y3) <- blnames3
head(y3)
gy3 <- gts(y3, characters=list(c(2,2),c(1,1,3)))
fc3 <- forecast(gy3, h = 6, method = "comb", fmethod="ets")
如果我使用不同的方法,例如 bu,预测函数 returns 成功,但任何后续操作(例如 allts)都会失败并出现相同的错误。
fc3 <- forecast(gy3, h = 6, method = "bu", fmethod="ets")
allts(fc3)
我用过gts
几次,但不要声称对这个包一无所知。但希望这会有所帮助。
我认为您的 gts
对象正在指定您的数据中不存在的层次结构。列表中的第一个向量是 c(2,2)
,这表明 State/County 是层次结构级别。但是,所有州和县在您的数据中都是相同的,因此这并不是真正的层次结构。
那么您的第二层级由 c(1,1,3)
组成,但 Industry 始终不变,只剩下 Sub-Industry 和产品 正在更改。
综上所述,这看起来不像是一个分层系列。我注意到 gy3
中的标签有很多 NA
的
gy3$labels
$G1
[1] "G1/CA"
$<NA>
[1] "G1/CAAL"
$<NA>
[1] "G1/O"
$<NA>
[1] "G1/OP" "G1/OQ" "G1/OR"
$<NA>
[1] "G1/OP514" "G1/OQ807" "G1/OQ514" "G1/OP807" "G1/OR807"
$<NA>
[1] "G1/CAO"
$<NA>
[1] "G1/CAOP" "G1/CAOQ" "G1/CAOR"
$<NA>
[1] "G1/CAOP514" "G1/CAOQ807" "G1/CAOQ514" "G1/CAOP807" "G1/CAOR807"
$<NA>
[1] "G1/CAALO"
$<NA>
[1] "G1/CAALOP" "G1/CAALOQ" "G1/CAALOR"
通过代码追踪,这似乎导致 aggts
出现问题
aggts(gy3)
Error in `colnames<-`(`*tmp*`, value = unlist(labels[levels])) :
length of 'dimnames' [2] not equal to array extent
aggts
是在指定comb
方法时调用的,需要层级串联。 bu
不会失败,因为它是自下而上的,不需要层级。
长话短说,更正代码的一种方法是指定一个 c(6, 3)
的矢量,其中一个包含子行业,另一个包含产品。
gy3 <- gts(y3, characters=c(6, 3))
fc3 <- forecast(gy3, h = 6, method = "comb", fmethod="ets")
fc3
Grouped Time Series
4 Levels
Number of groups at each level: 1 3 2 5
Total number of series: 11
Number of observations in each historical series: 5
Number of forecasts per series: 6
Top level series of forecasts:
Time Series:
Start = 6
End = 11
Frequency = 1
[1] -0.5835628 -0.5835628 -0.5835628 -0.5835628 -0.5835628 -0.5835628
这也行
fc3 <- forecast(gy3, h = 6, method = "bu", fmethod="ets")
allts(fc3)
Time Series:
Start = 6
End = 11
Frequency = 1
Total G1/CAALOP G1/CAALOQ G1/CAALOR G2/514 G2/807 CAALOP514 CAALOQ807 CAALOQ514 CAALOP807 CAALOR807
6 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
7 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
8 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
9 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
10 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
11 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
示例中的blnames3
指定错误。列名只给了一个州和一个县,没有层次感。您需要至少提供两个州和另外两个县才能构建分组时间序列。
我想你已经看到 Rob's post 如何在 gts()
函数中指定 characters
参数。现在,我根据 Rob 的示例将名为 "Product" 的级别添加到 Industry/Sub-industry 层次结构中。
下面的代码表明有两个州,每个州有两个县,两个行业分别由三个和两个子行业组成。此外,每个子行业生产四种产品。
y3 <- ts(matrix(rnorm(300),ncol=60,nrow=5))
blnames3 <- paste0(rep(c("CA", "NY"), each = 30), # State
rep(c("AL", "LA", "CL", "ES"), each = 15), # County
rep(c("O", "O", "O", "C", "C"), 12), # Industry
rep(c("p", "q", "r", "p", "q"), 12), # Sub-industry
rep(504:507, 15)) # Product
colnames(y3) <- blnames3
gy3 <- gts(y3, characters=list(c(2,2),c(1,1,3)))
fc3 <- forecast(gy3, h = 6, method = "comb", fmethod="ets")
aggts(fc3)
希望对您有所帮助。
我 运行 在使用 GTS 指定两个层次结构组时出错。错误是:
Error in
colnames<-
(*tmp*
, value = unlist(labels[levels])) :
length of 'dimnames' [2] not equal to array extent
我用下面的代码重现了这个问题。在此示例中,有两个层次结构 State/County 和 Industry/Sub-industry/product。 State/County 在这个例子中是常量——这在我的实际数据集中可能是也可能不是。
y3 <- ts(matrix(rnorm(25),ncol=5,nrow=5))
blnames3 <- paste(rep("CA",5), # State
rep("AL",5), # County
rep("O",5), # Industry
c("P","Q","Q","P","R"), # Sub-industry
c("514","807","514","807","807"), # product
sep="")
colnames(y3) <- blnames3
head(y3)
gy3 <- gts(y3, characters=list(c(2,2),c(1,1,3)))
fc3 <- forecast(gy3, h = 6, method = "comb", fmethod="ets")
如果我使用不同的方法,例如 bu,预测函数 returns 成功,但任何后续操作(例如 allts)都会失败并出现相同的错误。
fc3 <- forecast(gy3, h = 6, method = "bu", fmethod="ets")
allts(fc3)
我用过gts
几次,但不要声称对这个包一无所知。但希望这会有所帮助。
我认为您的 gts
对象正在指定您的数据中不存在的层次结构。列表中的第一个向量是 c(2,2)
,这表明 State/County 是层次结构级别。但是,所有州和县在您的数据中都是相同的,因此这并不是真正的层次结构。
那么您的第二层级由 c(1,1,3)
组成,但 Industry 始终不变,只剩下 Sub-Industry 和产品 正在更改。
综上所述,这看起来不像是一个分层系列。我注意到 gy3
中的标签有很多 NA
的
gy3$labels
$G1
[1] "G1/CA"
$<NA>
[1] "G1/CAAL"
$<NA>
[1] "G1/O"
$<NA>
[1] "G1/OP" "G1/OQ" "G1/OR"
$<NA>
[1] "G1/OP514" "G1/OQ807" "G1/OQ514" "G1/OP807" "G1/OR807"
$<NA>
[1] "G1/CAO"
$<NA>
[1] "G1/CAOP" "G1/CAOQ" "G1/CAOR"
$<NA>
[1] "G1/CAOP514" "G1/CAOQ807" "G1/CAOQ514" "G1/CAOP807" "G1/CAOR807"
$<NA>
[1] "G1/CAALO"
$<NA>
[1] "G1/CAALOP" "G1/CAALOQ" "G1/CAALOR"
通过代码追踪,这似乎导致 aggts
aggts(gy3)
Error in `colnames<-`(`*tmp*`, value = unlist(labels[levels])) :
length of 'dimnames' [2] not equal to array extent
aggts
是在指定comb
方法时调用的,需要层级串联。 bu
不会失败,因为它是自下而上的,不需要层级。
长话短说,更正代码的一种方法是指定一个 c(6, 3)
的矢量,其中一个包含子行业,另一个包含产品。
gy3 <- gts(y3, characters=c(6, 3))
fc3 <- forecast(gy3, h = 6, method = "comb", fmethod="ets")
fc3
Grouped Time Series
4 Levels
Number of groups at each level: 1 3 2 5
Total number of series: 11
Number of observations in each historical series: 5
Number of forecasts per series: 6
Top level series of forecasts:
Time Series:
Start = 6
End = 11
Frequency = 1
[1] -0.5835628 -0.5835628 -0.5835628 -0.5835628 -0.5835628 -0.5835628
这也行
fc3 <- forecast(gy3, h = 6, method = "bu", fmethod="ets")
allts(fc3)
Time Series:
Start = 6
End = 11
Frequency = 1
Total G1/CAALOP G1/CAALOQ G1/CAALOR G2/514 G2/807 CAALOP514 CAALOQ807 CAALOQ514 CAALOP807 CAALOR807
6 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
7 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
8 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
9 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
10 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
11 -0.6227325 0.0344344 -0.8919916 0.2348247 -0.02331766 -0.5994149 0.2459208 -0.6227531 -0.2692384 -0.2114864 0.2348247
示例中的blnames3
指定错误。列名只给了一个州和一个县,没有层次感。您需要至少提供两个州和另外两个县才能构建分组时间序列。
我想你已经看到 Rob's post 如何在 gts()
函数中指定 characters
参数。现在,我根据 Rob 的示例将名为 "Product" 的级别添加到 Industry/Sub-industry 层次结构中。
下面的代码表明有两个州,每个州有两个县,两个行业分别由三个和两个子行业组成。此外,每个子行业生产四种产品。
y3 <- ts(matrix(rnorm(300),ncol=60,nrow=5))
blnames3 <- paste0(rep(c("CA", "NY"), each = 30), # State
rep(c("AL", "LA", "CL", "ES"), each = 15), # County
rep(c("O", "O", "O", "C", "C"), 12), # Industry
rep(c("p", "q", "r", "p", "q"), 12), # Sub-industry
rep(504:507, 15)) # Product
colnames(y3) <- blnames3
gy3 <- gts(y3, characters=list(c(2,2),c(1,1,3)))
fc3 <- forecast(gy3, h = 6, method = "comb", fmethod="ets")
aggts(fc3)
希望对您有所帮助。