通过计算均方预测误差来评估预测模型

时间:2017-01-22 10:47:05

标签: r time-series cross-validation prediction

我试图通过计算均方预测误差来比较两种不同的预测模型。

以下是数据集earnings.csv dataset

的链接
  1. 使用2000 - 2006年的数据作为训练数据集,使用2007-2008数据作为测试数据集。

  2. 在R中使用decompose()和stl()函数将时间序列分解为趋势,季节和错误成分。

  3. 在R中使用lm()函数将线性模型拟合到趋势分量。然后预测2007-2008年度的月收入。用测试数据集比较两种方法下的预测,图形化和计算样本均方预测误差(MSPE)。

  4. 讨论两种不同分解方法的误差项的随机性质。

  5. 这是我的R代码:

    Data <-read.table("earnings.csv",header = T,sep=",")
    tsData <- ts(Data$X,start = 2000, frequency = 12)
    plot(tsData,xlab= "Month",ylab = "Earnings")
    tsData = log(tsData)
    
    trainingSet = window(tsData,start=2000,end=c(2006,12))
    testSet = window(tsData,start=2007,end=c(2008,12))
    decompTS =decompose(trainingSet)
    stltraining = stl(trainingSet,s.window = "periodic")
    
    lm1 = lm(trainingSet~decompTS$trend)
    lm1
    
    lm2 = lm(trainingSet~stltraining$time.series[,2])
    lm2
    
    
    decompTest=(decompose(testSet))$trend
    pred1=lm1$coefficients*decompTest
    pred2=predict(lm2,decompTest)
    plot(pred1)
    plot(pred2)
    
    mspe1=mean((testSet-pred1)^2)
    

    我为mspe1获得的值为null。我在这做错了什么?谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

虽然不太确定您的方法的理论正确性,但尝试用您的代码修复问题。主要问题是从ts对象转换回来,同时删除由预测产生的NA值。

Data <-read.table("earnings.csv",header = T,sep=",")
tsData <- ts(Data$X,start = 2000, frequency = 12)
plot(tsData,xlab= "Month",ylab = "Earnings")
tsData = log(tsData)

trainingSet = window(tsData,start=2000,end=c(2006,12))
testSet = window(tsData,start=2007,end=c(2008,12))
decompTS =decompose(trainingSet)
stltraining = stl(trainingSet,s.window = "periodic")

x <- as.numeric(decompTS$trend) 
y <- as.numeric(trainingSet) # convert the data from ts to numeric before lm
lm1 = lm(y~x)
lm1
#Call:
#(Intercept)            x  
#   -0.01082      1.00679  

x <- stltraining$time.series[,2]
lm2 = lm(y~x)
lm2
#(Intercept)            x  
# 0.0022       0.9984  

decompTest=as.numeric((decompose(testSet))$trend)
pred1=predict(lm1,data.frame(x=decompTest)) #lm1$coefficients*decompTest
pred2=predict(lm2,data.frame(x=decompTest))

pred1TS = window(ts(pred1,start = 2007, frequency = 12),start=2007,end=c(2008,12)) # convert back to ts, for plotting
pred2TS = window(ts(pred2,start = 2007, frequency = 12),start=2007,end=c(2008,12))
library(xts)
plot(as.xts(testSet), main='TestSet')
lines(as.xts(pred1TS), col='red', pch=19, lwd=2)
lines(as.xts(pred2TS), col='green', pch=19, lwd=2)

enter image description here

mspe1=mean((as.numeric(testSet)-pred1)^2, na.rm=TRUE)
# [1] 0.01865166
mspe2=mean((as.numeric(testSet)-pred2)^2, na.rm=TRUE)
# [1] 0.018508