使用日历变量格式化预测历史数据

时间:2016-10-18 13:42:12

标签: r prediction forecasting categorical-data

我有2015年的每小时时间序列数据。这些数据对应于大型商业建筑的耗电量。我想使用这些数据来预测2016年的使用情况。要开发预测模型,我需要以合适的格式格式化这些数据。

我计划使用以下功能来预测2016年的使用情况:(1)一周中的某一天,(2)一天中的时间(3)温度,(4)2015年的使用情况。 我能够创建前3个功能,但第四个功能似乎很棘手。

我应该如何安排2015年的数据,以便在2016年的某一天我可以使用2015年的相应日期数据。我关注的是:

  • 我不应该使用2015年的周末数据来预测工作日的使用情况
  • 2015年有几天,全天数据缺失数据。对于2016年的相应日期,我应该如何解释这些缺失的读数

在这里,我创建了与2015年和2016年相对应的虚拟数据。

library(xts)
set.seed(123)
seq1 <- seq(as.POSIXct("2015-01-01"),as.POSIXct("2015-12-31"), by = "hour")
data1 <- xts(rnorm(length(seq1),150,5),seq1)
seq2 <- seq(as.POSIXct("2016-01-01"),as.POSIXct("2016-09-30"), by = "hour")
data2 <- xts(rnorm(length(seq2),140,5),seq2)

让我举一个例子来澄清我的问题:

  1. 假设模型为:lm( output ~ dayofweek + timeofday + temperature + lastyearusage, data = xxx)
  2. 现在假设我想使用dayY onm2 oct 2015(lastyearusage)预测2016年2月2日(dayX)的使用情况。在此步骤中,问题是1)如果dayX是工作日,我应该如何确保dayY不是周末。我确信在这种情况下,如果我使用dayX预测dayY而不检查日期类型输出将会变得混乱。

1 个答案:

答案 0 :(得分:0)

程序包中可能已经有一个函数可以执行此操作,但在此处发布一个自定义函数,将所有这些日历变量(包括周末信息)添加到包含日期/小时列的data.frame中。假数据:

df <- data.frame(datetime=seq(as.POSIXlt("2013/01/01 00:00:00"), as.POSIXlt("2013/12/31 23:00:00"), by="hour"), variable=rnorm(8760))
####              datetime    variable
#### 1 2013-01-01 00:00:00  1.68959052
#### 2 2013-01-01 01:00:00  0.02023722
#### 3 2013-01-01 02:00:00 -0.42080942

该功能的代码:

CreateCalendarVariables = function(df, id_column=NULL) {
  df <- data.frame(df)
  if (is.null(id_column)) stop("Id column for the datetime variable is a mandatory argument")
  temp <- df[, id_column]
  if (  !(class(temp)[1] %in% c("Date", "POSIXct", "POSIXt", "POSIXlt"))  ){
    stop("the indicated datetime variable doesn't have the suitable format")
  }
  require(lubridate)
  df['year']      <- year(temp)
  df['.quarter']  <- quarter(temp)
  df['.month']       <- month(temp)
  df['.week']    <- week(temp)
  df['.DMY']        <- as.Date(temp)
  df['.dayinyear']     <- yday(temp)
  df['.dayinmonth']   <- mday(temp)
  df['.weekday']    <- wday(temp, label=T, abbr=FALSE) %>% factor(., levels=levels(.)[c(2,3,4,5,6,7,1)])
  df['.is_we']      <- df$.weekday %in% c("Saturday", "Sunday")
  if(class(temp)[1] != "Date"){
    df['.hour']    <- factor(hour(temp))
  }
  return(df)
}

然后您只需指定包含日期格式的列的N°。如果您需要因子格式的模型这些变量,请随意调整代码:

CreateCalendarVariables(df, 2)
#### Error in CreateCalendarVariables(df, 2) : 
####   the indicated datetime variable doesn't have the suitable format
CreateCalendarVariables(df, 1)
####              datetime    variable year .quarter .month .week       .DMY .dayinyear .dayinmonth .weekday .is_we .hour
#### 1 2013-01-01 00:00:00  1.68959052 2013        1      1     1 2012-12-31          1           1  Tuesday  FALSE     0
#### 2 2013-01-01 01:00:00  0.02023722 2013        1      1     1 2013-01-01          1           1  Tuesday  FALSE     1

要回答您的上一个问题,如果校准数据集中缺少整个级别(即一整个杂草并且您使用.Week作为预测器),则需要先将数据归咎于此。