我有一个用于年度时间序列预测的函数;现在,我想在现有函数的基础上制作一个类似的函数来预测每月时间序列数据。
现有功能
library(forecast)
library(zoo)
set.seed(289805)
y <- arima.sim(n = 10, model = list(ar = 0.8, order = c(1, 0, 0)), sd = 1)
y <- ts(y, frequency = 1, start = c(1981))
#-- Extract Training Data, Fit the Wrong Model, and Forecast
yt <- window(y, end = 1990)
#yfit <- Arima(yt,order = c(3, 1, 4))
yfit <- forecast::auto.arima(yt)
yfor <- forecast(yfit)
#---Extract the Data for ggplot using funggcast()
funggcast <- function(dn, fcast){
en <- max(time(fcast$mean)) # Extract the max date used in the forecast
# Extract Source and Training Data
ds <- as.data.frame(window(dn, end = en))
names(ds) <- 'observed'
ds$Year <- as.Date(time(window(dn, end = en)))
# Extract the Fitted Values (need to figure out how to grab confidence intervals)
dfit <- as.data.frame(fcast$fitted)
dfit$Year <- as.Date(time(fcast$fitted))
names(dfit)[1] <- 'fitted'
ds <- merge(ds, dfit, all.x = T) # Merge fitted values with source and training data
# Extract the Forecast values and confidence intervals
dfcastn <- as.data.frame(fcast)
dfcastn$Year <- as.Date(paste(row.names(dfcastn), "01", "01", sep = "-"))
names(dfcastn) <- c('forecast', 'lo80', 'hi80', 'lo95', 'hi95', 'Year')
pd <- merge(ds, dfcastn, all = T) # final data.frame for use in ggplot
return(pd)
}
pd <- funggcast(y ,yfor)
pd
# Year observed fitted forecast lo80 hi80 lo95 hi95
#1 1981-01-01 -0.2505125 -0.1002050 NA NA NA NA NA
#2 1982-01-01 0.8855338 -0.2004100 NA NA NA NA NA
#3 1983-01-01 0.1975730 0.7084271 NA NA NA NA NA
#4 1984-01-01 1.5355101 0.1580584 NA NA NA NA NA
#5 1985-01-01 4.6956397 1.2284081 NA NA NA NA NA
#6 1986-01-01 4.4414254 3.7565120 NA NA NA NA NA
#7 1987-01-01 3.0230805 3.5531406 NA NA NA NA NA
#8 1988-01-01 1.8058732 2.4184646 NA NA NA NA NA
#9 1989-01-01 1.1661036 1.4446987 NA NA NA NA NA
#10 1990-01-01 1.1631486 0.9328829 NA NA NA NA NA
#11 1991-01-01 NA NA 0.9305189 -0.8119452 2.672983 -1.734350 3.595388
#12 1992-01-01 NA NA 0.7444152 -1.4870278 2.975858 -2.668282 4.157113
#13 1993-01-01 NA NA 0.5955322 -1.8990535 3.090118 -3.219607 4.410672
#14 1994-01-01 NA NA 0.4764258 -2.1728901 3.125742 -3.575353 4.528205
#15 1995-01-01 NA NA 0.3811406 -2.3626271 3.124908 -3.815090 4.577371
#16 1996-01-01 NA NA 0.3049125 -2.4976344 3.107459 -3.981213 4.591038
#17 1997-01-01 NA NA 0.2439300 -2.5955971 3.083457 -4.098752 4.586612
#18 1998-01-01 NA NA 0.1951440 -2.6677997 3.058088 -4.183351 4.573639
#19 1999-01-01 NA NA 0.1561152 -2.7217152 3.033946 -4.245147 4.557377
#20 2000-01-01 NA NA 0.1248922 -2.7624254 3.012210 -4.290879 4.540663
我尝试过的
library(forecast)
library(zoo)
set.seed(289805)
y <- arima.sim(n = 10, model = list(ar = 0.8, order = c(1, 0, 0)), sd = 1)
y <- ts(y, frequency = 12, start = c(1981, 1))
#-- Extract Training Data, Fit the Wrong Model, and Forecast
yt <- window(y, end = c(1981, 10))
#yfit <- Arima(yt,order = c(3, 1, 4))
yfit <- forecast::auto.arima(yt)
yfor <- forecast(yfit)
#---Extract the Data for ggplot using funggcast()
funggcast <- function(dn, fcast){
en <- max(time(fcast$mean)) # Extract the max date used in the forecast
# Extract Source and Training Data
ds <- as.data.frame(window(dn, end = en))
names(ds) <- 'observed'
ds$Year <- as.Date(time(window(dn, end = en)))
# Extract the Fitted Values (need to figure out how to grab confidence intervals)
dfit <- as.data.frame(fcast$fitted)
dfit$Year <- as.Date(time(fcast$fitted))
names(dfit)[1] <- 'fitted'
ds <- merge(ds, dfit, all.x = T) # Merge fitted values with source and training data
# Extract the Forecast values and confidence intervals
dfcastn <- as.data.frame(fcast)
dfcastn$Year <- as.Date(paste(row.names(dfcastn), "01", "01", sep = "-"))
names(dfcastn) <- c('forecast', 'lo80', 'hi80', 'lo95', 'hi95', 'Year')
pd <- merge(ds, dfcastn, all = T) # final data.frame for use in ggplot
return(pd)
}
pd <- funggcast(y ,yfor)
pd
我收到此错误消息:
charToDate(x) 中的错误: 字符串不是标准的明确格式 另外: 警告消息: 1:在 window.default(x, ...) 中:“结束”值未更改 2:在 window.default(x, ...) 中:'end' 值未更改
我想要什么
我需要
Year
,而不是
Month/Year
列
我想要这样的东西
data frame
,其中提供的时间序列数据是从1981年1月1日到1982年2月1日到1981年10月1日的每月数据。样本外预测将是从11月开始的每月时间序列预测1981年1月1日至1981年12月1日至1982年8月1日,如下所示:
# Year/Month observed fitted forecast lo80 hi80 lo95 hi95
#1 1981-01-01 -0.2505125 -0.1002050 NA NA NA NA NA
#2 1981-02-01 0.8855338 -0.2004100 NA NA NA NA NA
#3 1981-03-01 0.1975730 0.7084271 NA NA NA NA NA
#4 1981-04-01 1.5355101 0.1580584 NA NA NA NA NA
#5 1981-05-01 4.6956397 1.2284081 NA NA NA NA NA
#6 1981-06-01 4.4414254 3.7565120 NA NA NA NA NA
#7 1981-07-01 3.0230805 3.5531406 NA NA NA NA NA
#8 1981-08-01 1.8058732 2.4184646 NA NA NA NA NA
#9 1981-09-01 1.1661036 1.4446987 NA NA NA NA NA
#10 1991-10-01 1.1631486 0.9328829 NA NA NA NA NA
#11 1981-11-01 NA NA 0.9305189 -0.8119452 2.672983 -1.734350 3.595388
#12 1981-12-01 NA NA 0.7444152 -1.4870278 2.975858 -2.668282 4.157113
#13 1982-01-01 NA NA 0.5955322 -1.8990535 3.090118 -3.219607 4.410672
#14 1982-02-01 NA NA 0.4764258 -2.1728901 3.125742 -3.575353 4.528205
#15 1982-03-01 NA NA 0.3811406 -2.3626271 3.124908 -3.815090 4.577371
#16 1982-04-01 NA NA 0.3049125 -2.4976344 3.107459 -3.981213 4.591038
#17 1982-05-01 NA NA 0.2439300 -2.5955971 3.083457 -4.098752 4.586612
#18 1982-06-01 NA NA 0.1951440 -2.6677997 3.058088 -4.183351 4.573639
#19 1982-07-01 NA NA 0.1561152 -2.7217152 3.033946 -4.245147 4.557377
#20 1982-08-01 NA NA 0.1248922 -2.7624254 3.012210 -4.290879 4.540663
问题是
dfcastn
的行名称已经包含月份名称的缩写。为了解决这个问题,您可以使用例如as.Date(paste("01", row.names(dfcastn)), format = "%d %B %Y")
转换为正确的日期。
注意:由于我在德语区域设置上运行,因此我必须暂时切换到英语区域设置,以将月份名称的英语缩写转换为正确的日期。如果您的情况并非如此,您可以删除相应的代码行。
library(forecast)
library(zoo)
funggcast <- function(dn, fcast) {
en <- max(time(fcast$mean)) # Extract the max date used in the forecast
# Extract Source and Training Data
ds <- as.data.frame(window(dn, end = en))
names(ds) <- "observed"
ds$Year <- as.Date(time(window(dn, end = en)))
# Extract the Fitted Values (need to figure out how to grab confidence intervals)
dfit <- as.data.frame(fcast$fitted)
dfit$Year <- as.Date(time(fcast$fitted))
names(dfit)[1] <- "fitted"
ds <- merge(ds, dfit, all.x = T) # Merge fitted values with source and training data
# Extract the Forecast values and confidence intervals
dfcastn <- as.data.frame(fcast)
# Switch to english locale
old <- Sys.getlocale(category = "LC_TIME")
Sys.setlocale(category = "LC_TIME", locale = "en_US.UTF-8")
dfcastn$Year <- as.Date(paste("01", row.names(dfcastn)), format = "%d %B %Y")
# Restore old locale
Sys.setlocale(category = "LC_TIME", locale = old)
names(dfcastn) <- c("forecast", "lo80", "hi80", "lo95", "hi95", "Year")
merge(ds, dfcastn, all = T) # final data.frame for use in ggplot
}
pd <- funggcast(y, yfor)
#> Warning in window.default(x, ...): 'end' value not changed
#> Warning in window.default(x, ...): 'end' value not changed
pd
#> Year observed fitted forecast lo80 hi80 lo95
#> 1 1981-01-01 -0.2505125 -0.1002050 NA NA NA NA
#> 2 1981-02-01 0.8855338 -0.2004100 NA NA NA NA
#> 3 1981-03-01 0.1975730 0.7084271 NA NA NA NA
#> 4 1981-04-01 1.5355101 0.1580584 NA NA NA NA
#> 5 1981-05-01 4.6956397 1.2284081 NA NA NA NA
#> 6 1981-06-01 4.4414254 3.7565120 NA NA NA NA
#> 7 1981-07-01 3.0230805 3.5531406 NA NA NA NA
#> 8 1981-08-01 1.8058732 2.4184646 NA NA NA NA
#> 9 1981-09-01 1.1661036 1.4446987 NA NA NA NA
#> 10 1981-10-01 1.1631486 0.9328829 NA NA NA NA
#> 11 1981-11-01 NA NA 0.930518905 -0.8119452 2.672983 -1.734350
#> 12 1981-12-01 NA NA 0.744415169 -1.4870278 2.975858 -2.668282
#> 13 1982-01-01 NA NA 0.595532171 -1.8990535 3.090118 -3.219607
#> 14 1982-02-01 NA NA 0.476425765 -2.1728901 3.125742 -3.575353
#> 15 1982-03-01 NA NA 0.381140635 -2.3626271 3.124908 -3.815090
#> 16 1982-04-01 NA NA 0.304912527 -2.4976344 3.107459 -3.981213
#> 17 1982-05-01 NA NA 0.243930036 -2.5955971 3.083457 -4.098752
#> 18 1982-06-01 NA NA 0.195144041 -2.6677997 3.058088 -4.183351
#> 19 1982-07-01 NA NA 0.156115242 -2.7217152 3.033946 -4.245147
#> 20 1982-08-01 NA NA 0.124892201 -2.7624254 3.012210 -4.290879
#> 21 1982-09-01 NA NA 0.099913767 -2.7934593 2.993287 -4.325119
#> 22 1982-10-01 NA NA 0.079931018 -2.8173109 2.977173 -4.351018
#> 23 1982-11-01 NA NA 0.063944818 -2.8357705 2.963660 -4.370787
#> 24 1982-12-01 NA NA 0.051155858 -2.8501413 2.952453 -4.385995
#> 25 1983-01-01 NA NA 0.040924689 -2.8613844 2.943234 -4.397774
#> 26 1983-02-01 NA NA 0.032739753 -2.8702168 2.935696 -4.406949
#> 27 1983-03-01 NA NA 0.026191804 -2.8771790 2.929563 -4.414131
#> 28 1983-04-01 NA NA 0.020953444 -2.8826825 2.924589 -4.419775
#> 29 1983-05-01 NA NA 0.016762757 -2.8870429 2.920568 -4.424225
#> 30 1983-06-01 NA NA 0.013410206 -2.8905040 2.917324 -4.427743
#> 31 1983-07-01 NA NA 0.010728165 -2.8932555 2.914712 -4.430532
#> 32 1983-08-01 NA NA 0.008582533 -2.8954456 2.912611 -4.432745
#> 33 1983-09-01 NA NA 0.006866027 -2.8971906 2.910923 -4.434505
#> 34 1983-10-01 NA NA 0.005492822 -2.8985820 2.909568 -4.435906
#> hi95
#> 1 NA
#> 2 NA
#> 3 NA
#> 4 NA
#> 5 NA
#> 6 NA
#> 7 NA
#> 8 NA
#> 9 NA
#> 10 NA
#> 11 3.595388
#> 12 4.157113
#> 13 4.410672
#> 14 4.528205
#> 15 4.577371
#> 16 4.591038
#> 17 4.586612
#> 18 4.573639
#> 19 4.557377
#> 20 4.540663
#> 21 4.524946
#> 22 4.510880
#> 23 4.498677
#> 24 4.488307
#> 25 4.479623
#> 26 4.472429
#> 27 4.466514
#> 28 4.461681
#> 29 4.457750
#> 30 4.454564
#> 31 4.451988
#> 32 4.449910
#> 33 4.448237
#> 34 4.446892