R多元化提前一步预测和准确性

时间:2016-06-06 15:55:07

标签: r time-series prediction

使用R我想比较两个预测模型的RMSE(均方根误差)。第一个模型使用1966年至2000年的估计来预测2001年,然后使用1966年至2001年的估计数来预测2002年等等到2015年。第二个模型使用1991年至2000年的估计数来预测2001年,然后使用1992年至2001年的估计数预测到2002年等等到2015年。这个问题让我非常难过,我真的很感激任何帮助。

DF <- data.frame(YEAR=1966:2015, TEMP=rnorm(50), PRESSURE=rnorm(50), RAINFALL=rnorm(50))

lmod <- lm(TEMP ~ PRESSURE + RAINFALL, data = DF)

rmse <- function(error) sqrt(mean(error^2))

rmse(lmod$residuals)

3 个答案:

答案 0 :(得分:1)

你可以循环它:

方法1:

pred1<-numeric(0)
rmse1<-numeric(0)

for(i in 1:15){

DF.train1<-DF[DF$YEAR < 2000+i,]
DF.test1<-DF[DF$YEAR == 2000+i,]
lmod1 <- lm(TEMP ~ PRESSURE + RAINFALL, data = DF.train1)
pred1[i]<- predict(lmod1, newdata = DF.test1)
rmse1[i]<-sqrt(mean((DF.test1$TEMP-pred1[i])^2))
}

pred1
rmse1  
mean(rmse1)  

方法2:

pred2<-numeric(0)
rmse2<-numeric(0)

for(i in 1:15){

DF.train2<-DF[DF$YEAR < 2000+i & DF$YEAR > 1989+i,]
DF.test2<-DF[DF$YEAR == 2000+i,]
lmod2 <- lm(TEMP ~ PRESSURE + RAINFALL, data = DF.train2)
pred2[i]<- predict(lmod2, newdata = DF.test2)
rmse2[i]<-sqrt(mean((DF.test2$TEMP-pred2[i])^2))
} 

pred2
rmse2  
mean(rmse2) 

比较rmse1rmse2的各个组成部分以及它们各自的方法应该是有用的。向量pred1pred2包含各自方法的每年(2001-2015)的单独TEMP预测。

编辑:应该现在正在运作,方法2训练10年的差距。另外,我将RMSE作为this文章中为预测变量定义的MSE的平方根。

答案 1 :(得分:1)

这是另一种解决方案,其中模拟属于一种功能 该解决方案的兴趣在于轻松修改模型规范。

例如,如果您想尝试范围为15年而不是10年的model2,只需修改函数(range = 15)中的输入即可。这也使您可以进行光敏感性分析。

compare_models <- function(DF, start = 1966, end = 2000, range = 10)
{
  require(hydroGOF)
  for (i in (end+1):tail(DF$YEAR)[6])
  {
   # model1
    lmod_1 = lm(TEMP ~ PRESSURE + RAINFALL, data = DF[DF$YEAR >= start & DF$YEAR < i,])
    DF$model1_sim[DF$YEAR == i] <- predict(lmod_1, newdata = DF[DF$YEAR == i,])
    # model2
    lmod_2 = lm(TEMP ~ PRESSURE + RAINFALL, data = DF[DF$YEAR >= i-range & DF$YEAR < i,])
    DF$model2_sim[DF$YEAR == i] <- predict(lmod_2, newdata = DF[DF$YEAR == i,])
  }
  return(DF)
} 

我使用hydroGOF包计算rmseNSE,这是模型效率的常见指标(请参阅Nash and Sutcliffe, 1970,此时引用11528条)。

output = compare_models(DF)

require(hydroGOF) # compute RMSE and NSE
# RMSE 
rmse(output$model1_sim,output$TEMP)
rmse(output$model2_sim,output$TEMP)

# Nash-Sutcliffe efficiency
NSE(output$model1_sim,output$TEMP, na.rm = T)
NSE(output$model2_sim,output$TEMP, na.rm = T)

一个简单的模拟/观察图来寻找模型预测:

# melting data for plot
output_melt = melt(output[,c("TEMP", "model1_sim", "model2_sim")], id = "TEMP")
# Plot
ggplot(output_melt, aes(x = TEMP, y = value, color = variable)) + 
theme_bw() + geom_point() + geom_abline(slope = 1, intercept = 0) + 
xlim(-2,2) + ylim(-2,2) + xlab("Measured") + ylab("Simulated")

enter image description here

答案 2 :(得分:0)

这是另一个解决方案:

year <- 2000
time.frame <- 35


train.models <- function(year, time.frame) {
   predictions <- sapply(year:(max(df$YEAR)-1), 
          function(year) {
             lmod <- lm(TEMP ~ PRESSURE + RAINFALL, DF,
                        subset = with(DF, YEAR %in% (year - time.frame + 1):year))

             pred <- predict(lmod, newdata = DF[DF$YEAR == (year + 1),])
             names(pred) <- year + 1
             return (pred)
          })

   return (predictions)
}

models1 <- train.models(2000, 35)
models2 <- train.models(2001, 10)


rmse(models1 - DF$TEMP[DF$YEAR %in% names(models1)])
rmse(models2 - DF$TEMP[DF$YEAR %in% names(models2)])