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

R 通过计算均方预测误差评估预测模型,r,time-series,cross-validation,prediction,R,Time Series,Cross Validation,Prediction,我试图通过计算均方预测误差来比较两种不同的预测模型 这是数据集的链接 使用2000-2006年的数据作为培训数据集,使用2007-2008年的数据作为测试数据集 在R中使用decompose()和stl()函数将时间序列分解为趋势、季节和误差分量 在R中使用lm()函数将线性模型拟合到趋势组件。然后预测2007-2008年的月收入。通过图形和计算样本均方预测误差(MSPE),将两种方法下的预测与测试数据集进行比较 讨论了两种不同分解方法误差项的随机性质 这是我的R代码: Data <-re

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

这是数据集的链接

  • 使用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)
    

    Data虽然不太确定您的方法在理论上是否可靠,但尝试用您的代码解决问题。主要问题是从
    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)
    
    有关主题的建议,请参阅。您的问题是查找代码的错误。当您提供对数据集的访问时,这似乎是堆栈溢出的主题,我投票支持迁移。请注意,您的#4不是一个编程问题,即使在这里,它也算是自学。
    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