【问题标题】:R Model prediction using GLM for day-ahead forecasts in a for-loop使用 GLM 在 for 循环中进行日前预测的 R 模型预测
【发布时间】:2021-01-02 08:51:54
【问题描述】:

我有以下数据表,我想使用 GLM(= 广义线性模型)根据数据表中的其他变量来预测 DE 价格。

set.seed(123)
dt.data <- data.table(date = seq(as.Date('2019-01-01'), by = '1 day', length.out = 731),
                      'DE' = rnorm(731, 30, 1), 'windDE' = rnorm(731, 10, 1),
                      'consumptionDE' = rnorm(731, 50, 1), 'nuclearDE' = rnorm(731, 8, 1), 
                      'solarDE' = rnorm(731, 1, 1), check.names = FALSE)


dt.forecastData <- dt.data
dt.forecastData <- na.omit(dt.forecastData)


fromTestDate <- "2019-12-31"
fromDateTest <- base::toString(fromTestDate)      


## Create train and test date-vectors depending on fromDateTest: ##
v.train <- which(dt.forecastData$date <= fromDateTest)
v.test <- which(dt.forecastData$date == as.Date(fromDateTest)+1)

## Create data tables for train and test data with specific date range (fromTestDate): ##
dt.train <- dt.forecastData[v.train]
v.trainDate <- dt.train$date
dt.test <- dt.forecastData[v.test]
v.testDate <- dt.test$date

## Delete column "date" of train and test data for model fitting: ##
dt.train <- dt.train[, c("date") := NULL]
dt.test <- dt.test[, c("date") := NULL]


## MODEL FITTING: ##
## Generalized Linear Model: ##
xgbModel <- stats::glm(DE ~ .-1, data = dt.train, 
                       family = quasi(link = "identity", variance = "constant"))


## Train and Test Data PREDICTION with xgbModel: ##
dt.train$prediction <- stats::predict.glm(xgbModel, dt.train)
dt.test$prediction <- stats::predict.glm(xgbModel, dt.test)


## Add date columns to dt.train and dt.test: ##
dt.train <- data.table(date = v.trainDate, dt.train)
dt.test <- data.table(date = v.testDate, dt.test)

在这段代码中,我使用2019-01-012019-12-31 的数据训练模型,并使用2020-01-01 的前一天预测对其进行测试。 现在我想创建一个for-loop,以便我总共运行我的模型365,如下:

运行 1:

a) 使用 01-01-201931-12-2019 训练我的模型

b) 预测01-01-2020(测试数据)

c) 使用01-01-2020 的实际数据点来评估预测

运行 2:

a) 使用 01-01-201901-01-2020 来训练我的模型

b) 预测02-01-2020

c) 使用02-01-2020 的实际数据点来评估预测

最后,我想绘制例如单个预测性能的累积总和或单个预测性能的直方图和一些汇总统计数据(均值、中位数、标准差等)

不幸的是,我不知道如何从循环开始,以及在哪里可以保存每次运行的预测? 我希望有人可以帮助我!

【问题讨论】:

    标签: r for-loop prediction forecasting glm


    【解决方案1】:

    基本上,您必须构建一个包含每次运行的结束日期的向量。然后,您可以在循环的每次迭代中选择一个结束日期,运行模型并提前一天预测。使用您的代码,这可能看起来像这样:

    set.seed(123)
    dt.data <- data.table(date = seq(as.Date('2019-01-01'), by = '1 day', length.out = 731),
                          'DE' = rnorm(731, 30, 1), 'windDE' = rnorm(731, 10, 1),
                          'consumptionDE' = rnorm(731, 50, 1), 'nuclearDE' = rnorm(731, 8, 1), 
                          'solarDE' = rnorm(731, 1, 1), check.names = FALSE)
    
    
    dt.forecastData <- dt.data
    dt.forecastData <- na.omit(dt.forecastData)
    

    在这里,我构建了一个包含 2019 年 12 月 31 日至 2020 年 1 月 15 日之间所有日子的向量,根据需要进行调整:

    # vector of all end dates
    eval.dates <- seq.Date(from = as.Date("2019-12-31"), 
                           to   = as.Date("2020-01-15"),
                           by   = 1)
    

    在这里,我为提前一天的预测创建一个存储文件

    # storage file for all predictions
    test.predictions  <- numeric(length = length(eval.dates))
    

    现在,使用您的代码运行循环并在每次迭代中选择一个结束日期:

    for(ii in 1:length(eval.dates)){ # loop start
    
    fromTestDate <- eval.dates[ii] # get end date for iteration
    fromDateTest <- base::toString(fromTestDate)      
    
    
    ## Create train and test date-vectors depending on fromDateTest: ##
    v.train <- which(dt.forecastData$date <= fromDateTest)
    v.test <- which(dt.forecastData$date == as.Date(fromDateTest)+1)
    
    ## Create data tables for train and test data with specific date range (fromTestDate): ##
    dt.train <- dt.forecastData[v.train]
    v.trainDate <- dt.train$date
    dt.test <- dt.forecastData[v.test]
    v.testDate <- dt.test$date
    
    ## Delete column "date" of train and test data for model fitting: ##
    dt.train <- dt.train[, c("date") := NULL]
    dt.test <- dt.test[, c("date") := NULL]
    
    
    ## MODEL FITTING: ##
    ## Generalized Linear Model: ##
    xgbModel <- stats::glm(DE ~ .-1, data = dt.train, 
                           family = quasi(link = "identity", variance = "constant"))
    
    
    
    
    
    
    ## Train and Test Data PREDICTION with xgbModel: ##
    test.predictions[ii] <- stats::predict.glm(xgbModel, dt.test)
    
    
    # verbose
    print(ii)
    
    } # loop end
    

    如您所见,这是您的代码的一个简化版本,为简洁起见,我省略了对训练集的预测。可以按照上面的代码行轻松添加它们。

    您没有指定要使用哪些度量来评估您的样本外预测。对象test.predictions 包含您所有的提前一步预测,您可以使用它来计算 RMSE、LPS 或您想使用的任何预测能力量化。

    【讨论】:

    • 为了评估我的前一天预测,我想将这些预测与实际的 DE 价格进行比较,这些位于数据表 dt.data 的第二列中。
    • 这对训练数据集有什么作用?我已经尝试过了,但是对于火车数据集的每个日期,我总是得到相同的值..
    • 对于训练数据集,您需要构造一个矩阵或数组,因为您在循环的每次迭代中进行多次预测,因此向量不再适用。
    • 不幸的是,我没有得到它的火车数据集......
    • 如何获得迭代的整体 RSME?
    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2021-09-16
    相关资源
    最近更新 更多