【问题标题】:Assess prediction models by calculating mean squared prediction error通过计算均方预测误差来评估预测模型
【发布时间】:2017-06-07 01:47:54
【问题描述】:

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

这里是数据集earnings.csv dataset的链接

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

  2. 在 R 中同时使用 decompose() 和 stl() 函数将时间序列分解为趋势、季节性和误差分量。

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

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

这是我的 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。我在这里做错了什么?感谢您的帮助

【问题讨论】:

  • 请参阅stats.stackexchange.com/help/on-topic 以获取有关主题内容的建议。你的问题是关于找出你的代码有什么问题。当您提供对数据集的访问权限时,这似乎是 Stack Overflow 的主题,我正在投票支持迁移。请注意,您的 #4 尤其不是编程问题,即使在这里也算作自学。

标签: r time-series cross-validation prediction


【解决方案1】:

虽然不太确定您的方法在理论上是否合理,但已尝试解决您的代码存在的问题。主要问题是从 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)

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

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 2019-04-18
    • 2019-05-13
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多