R中的Holt Winters-系数数学优化

时间:2018-06-29 21:01:11

标签: r mathematical-optimization coefficients holtwinters

我正在尝试编写一个简短的函数来创建Holt-Winter的函数。我知道有些软件包可以为我完成所有这些工作,但是我认为这在R中是一种很好的做法,因为我有一段时间没有做过这样的项目了。

我已经接受了here的指示。除了网站的作者使用Excel Solver工具查找最佳系数的那一部分之外,我已经完成了所有步骤。我已经进行了一些研究,我相信我需要使用nloptr包来选择最佳系数,但是我不确定如何使用。

这是我到目前为止所做的:

hwAlpha = 0.5
hwBeta = 0.0
hwGamma = 0.0
hwSeason = 7

dfTemp$HWES <- 0                                    # Prepare the column to be return 
dfTemp$HWESunadjusted <- 0                          # Prepare the unadjusted smoothing column 
dfTemp$HWEStrend <- 0                               # Prepare the trend adjustment column 
dfTemp$HWESseason <- 0                              # Prepare the seasonality adjustment column 

for(i in 1:hwSeason){                               # Calculate the initial     Seasonality adjustment 
  dfTemp$HWESseason[(i)] <- dfTemp$Actual[(i)] / mean(dfTemp$Actual[1:hwSeason])
}

dfTemp$HWESunadjusted[hwSeason] <-                  # Calculate the first unadjusted smoothed value 
  dfTemp$Actual[hwSeason] / dfTemp$HWESseason[hwSeason]

for(i in 1:(sum(!is.na(dfTemp$Actual)) - hwSeason)){  
  dfTemp$HWESunadjusted[(i + hwSeason)] <-        # First, calculate unadjusted smoothing 
      (hwAlpha * (dfTemp$Actual[(i + hwSeason)] / dfTemp$HWESseason[i])) +
      ((1 - hwAlpha) * (dfTemp$HWESunadjusted[(i + hwSeason - 1)] + 
                      dfTemp$HWEStrend[(i + hwSeason - 1)]))

  dfTemp$HWEStrend[(i + hwSeason)] <-             # Second, calculate trend adjustment 
      (hwBeta * (dfTemp$HWESunadjusted[(i + hwSeason)] - 
                   dfTemp$HWESunadjusted[(i + hwSeason - 1)])) +
      ((1 - hwBeta) * (dfTemp$HWEStrend[i + hwSeason - 1]))

  dfTemp$HWESseason[(i + hwSeason)] <-            # Third, calculate seasonality adjustment 
      (hwGamma * dfTemp$Actual[(i + hwSeason)] / dfTemp$HWESunadjusted[(i + hwSeason)]) + 
      ((1 - hwGamma) * dfTemp$HWESseason[i])

  dfTemp$HWES[(i + hwSeason)] <-                  # Fourth, calculate the smoothed, trended, seasonally adjusted 
      (dfTemp$HWESunadjusted[(i + hwSeason - 1)] + dfTemp$HWEStrend[(i + hwSeason - 1)]) * 
      dfTemp$HWESseason[(i)]

  EndActual <- EndActual + 1                      # Advance the count
} 

for (i in 1:(sum(!is.na(dfTemp$Actual)))){
    dfTemp[i, "MeanAbsError"] <- abs(dfTemp[i, "Actual"] - dfTemp[i, "HWES"])
    dfTemp[i, "MeanSqrError"] <- dfTemp[i, "MeanAbsError"] ^ 2
}

RootMeanSqrError <- sqrt(sum(dfTemp[1:sum(!is.na(dfTemp$Actual)), "MeanSqrError"]))

同样,我想更改此值以使用NLoptr(或其他软件包)创建最佳系数。当然,如果您对我的代码有任何其他批评,我想知道我将来可以做些什么。谢谢您的帮助。

0 个答案:

没有答案