我试图通过计算均方预测误差来比较两种不同的预测模型。
以下是数据集earnings.csv dataset
的链接使用2000 - 2006年的数据作为训练数据集,使用2007-2008数据作为测试数据集。
在R中使用decompose()和stl()函数将时间序列分解为趋势,季节和错误成分。
在R中使用lm()函数将线性模型拟合到趋势分量。然后预测2007-2008年度的月收入。用测试数据集比较两种方法下的预测,图形化和计算样本均方预测误差(MSPE)。
讨论两种不同分解方法的误差项的随机性质。
这是我的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。我在这做错了什么?谢谢你的帮助
答案 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)
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