我正在尝试编写一个简短的函数来创建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(或其他软件包)创建最佳系数。当然,如果您对我的代码有任何其他批评,我想知道我将来可以做些什么。谢谢您的帮助。