I'm using the HoltWinters function in R and I'm trying to understand what the "coefficients" represent in the object that is returned by that function. They don't seem to match in any obvious way the values returned when you look at the $

  • 6
    $\begingroup$ Did you leave off something on the end of your question? $\endgroup$
    – Glen_b
    Mar 24, 2013 at 22:04

6 Answers 6


+1 this is confusing. If your time series has length $N$ and frequency $p$, then the so-called "coefficients" (which can be accessed as HW$coeff if HW is the object returned by HoltWinters) are exactly the values $a[N]$, $b[N]$ and $s[N-p+1]$, $s[N-p+2], \cdots s[N]$ where these are defined by the formulas in the Holt Winters help page, which can be accessed from within R with ?HoltWinters.

For the additive model, which is the default, suppose my.ts is a time series object with positive frequency $p$. The values of $a[N-1]$, $b[N-1]$ and all the earlier $s[t]$ up to $s[N-p]$ are given in the table HoltWinters(my.ts)$fitted. The values in HoltWinters(my.ts)$coeff are calculated from these using the formulas $$a[t] = α (Y[t] - s[t-p]) + (1-α) (a[t-1] + b[t-1])$$

$$b[t] = β (a[t] - a[t-1]) + (1-β) b[t-1]$$

with $t=N$ and $\alpha = $ HoltWinters(my.ts)$alpha, $\beta = $ HoltWinters(my.ts)$beta, and

$$s[t] = γ (Y[t] - a[t]) + (1-γ) s[t-p]$$

with $t=N-p+1, \ldots, N$ and $\alpha = $ HoltWinters(my.ts)$alpha, $\beta = $ HoltWinters(my.ts)$beta, and $\gamma = $ HoltWinters(my.ts)$gamma.

This works for $a$ and $b$ (the level and trend) but when I do the calculation for the seasonals, I get slightly different values (within 5% or so) than are given in the output. I hope somebody can edit this answer to explain what is going on with the seasonals. Here is a link to the C code for the hw function which is called by the HoltWinters function:



The meaning of the a, b, s, alpha, beta and gamma parameters is described in the help on the HoltWinters function (try ?HoltWinters in R), under Details.

e.g. the additive model is described so:

Yhat[t+h] = a[t] + h * b[t] + s[t - p + 1 + (h - 1) mod p],
where a[t], b[t] and s[t] are given by
a[t] = α (Y[t] - s[t-p]) + (1-α) (a[t-1] + b[t-1])
b[t] = β (a[t] - a[t-1]) + (1-β) b[t-1]
s[t] = γ (Y[t] - a[t]) + (1-γ) s[t-p]

If we look at the help, one of the examples is:

(m <- HoltWinters(co2))

With output:

Holt-Winters exponential smoothing with trend and additive seasonal component.

 HoltWinters(x = co2) 

Smoothing parameters:
 alpha:  0.5126484 
 beta :  0.009497669 
 gamma:  0.4728868 

a   364.7616237
b     0.1247438
s1    0.2215275
s2    0.9552801
s3    1.5984744
s4    2.8758029
s5    3.2820088
s6    2.4406990
s7    0.8969433
s8   -1.3796428
s9   -3.4112376
s10  -3.2570163
s11  -1.9134850
s12  -0.5844250

output of plot(m)

output of plot(fitted(m))

Now let's look at the output of calling coefficients:

          a           b          s1          s2          s3          s4 
364.7616237   0.1247438   0.2215275   0.9552801   1.5984744   2.8758029 
         s5          s6          s7          s8          s9         s10 
  3.2820088   2.4406990   0.8969433  -1.3796428  -3.4112376  -3.2570163 
        s11         s12 
 -1.9134850  -0.5844250 

Which correspond exactly to the output of the same quantities generated before.

Taking into account the description of a, b, s, alpha, beta and gamma on the help page, which parts are unclear to you?

  • $\begingroup$ Could you tell which time point are "a" and "b" representing? $\endgroup$
    – Diansheng
    Mar 19, 2018 at 16:56

I agree that there is puzzle. To see the puzzle I considered the co2 series available in R. The answer is long. May you just to the *-part that I added today

I have expected that




i.e. the coeff equals the last extimated trend. Below you can check that this is not the case. However


equals coefficient you were to obtain if you drop the last value of the series as is deomestrated below. I suspect that the coefficient is somehow "written forward". I find it furthermore puzzling the matters are different if you allow beta to be estimated.

I reading the source code (http://svn.r-project.org/R/trunk/src/library/stats/R/HoltWinters.R) but I am not yet sure what goes on.

This is the complete code


    co2HW = HoltWinters(co2, alpha = 0.2, gamma = 0.2, beta = 0.5)
    # co2HW$coeff[2]

    co2Bis = window(co2,end=c(1997,11))
    co2HWBis = HoltWinters(co2Bis, alpha=0.2, gamma=0.2, beta=0.5)
        # co2HWBis$fitted[length(co2HWBis$fitted[,3])-1,3]

    co2HW$beta*(co2HW$fitted[length(co2HW$fitted[,2]),2] -  
        co2HW$fitted[length(co2HW$fitted[,2])-1,2]) +
        (1 - co2HW$beta)*co2HW$fitted[length(co2HW$fitted[,3])-1,3]


    co2HW = HoltWinters(co2, alpha = 0.2, gamma = 0.2)
    # co2HW$coeff[2]

    co2Bis = window(co2,end=c(1997,11))
    co2HWBis = HoltWinters(co2Bis, alpha=0.2, gamma=0.2)
        # co2HWBis$fitted[length(co2HWBis$fitted[,3])-1,3]

    co2HW$beta*(co2HW$fitted[length(co2HW$fitted[,2]),2] -  
        co2HW$fitted[length(co2HW$fitted[,2])-1,2]) +
        (1 - co2HW$beta)*co2HW$fitted[length(co2HW$fitted[,3])-1,3]


... one night later I think I can give an answer that looks like an answer. In my opinion the problem is the timing of the table co2HW$fitted. The last line is not the estimated trend level and saison of the last period in the sample. The coefficients are the estimated level, trend and saison of the last period but these value are not displayed in the table. I hope th following code is convincing

x = co2
m = HoltWinters(x)
# m$fitted[length(m$fitted[,3]),3]

aux1 = m$alpha*( x[length(x)] - m$fitted[length(m$fitted[,3]),4]  ) + 
    ( 1 - m$alpha )*( m$fitted[length(m$fitted[,3]),3] + 
m$fitted[length(m$fitted[,3]),2] );

aux2 = m$beta*(aux1 - m$fitted[length(m$fitted[,3]),2] ) +

    aux3 = m$gamma*(x[length(x)] - aux1) + 
( 1 - m$gamma )*m$fitted[length(m$fitted[,3]),4]
  • 1
    $\begingroup$ Welcome to the site, are you the original poster of the question? This doesn't appear to be an answer. $\endgroup$
    – Andy W
    Jul 30, 2013 at 11:49
  • $\begingroup$ Thanks @user28623! I agree that there is something fishy about it. I also tried to read the source code but didn't make progress. $\endgroup$
    – Flounderer
    Jul 30, 2013 at 22:15
  • $\begingroup$ I posted the co2 stuff and I think I figured out what is going on. First, the last value of co2HW$fitted[,3] is not the estimated trend of the last period of the sample. It is the estimated trend of one period before that last period. Second, co2HW$coeff[2] is the trend of the last period. In my opinion the timing of the table of co2HW$fitted is misleading. $\endgroup$
    – user28623
    Jul 31, 2013 at 20:11
  • $\begingroup$ @user28623, do you mean co2HW$fitted[,1] instead of co2HW$fitted[,3]? and co2HW$fitted[,1] is supposed to be level, not trend. i think your answer is really helpful, but a bit confusing $\endgroup$
    – Diansheng
    Mar 19, 2018 at 16:31

I think the key point about the coefficients, which I couldn't see in the other answers but may have missed, is that they are the values of smoothed level and smoothed trend for the last period in the time series on which the forecast was based/made; and smoothed seasonal components for the last 12 months of that time series.

Understanding the table of fitted values for the forecast also helps. For each row corresponding to time t, the values of level and trend are the smoothed values for time t-1, and the value of season is the smoothed value for t-p. These are added to give the estimated true level for time t, Xhat.

I have only begun to use R fairly recently, so apologies if my terminology isn't fully accurate.

  • $\begingroup$ I don't think the question is clearly stated . As glen_b points out it is incomplete. Since the question is unclear I don't see how an answer can be given. $\endgroup$ Mar 17, 2018 at 23:53

This is from the HoltWinters documentation in R. I had the same question and this answers why I could not calculate the same seasonal values. The function is using a decomposition method to find all the initial values when incorporating seasonality, whereas for single and double exponential smoothing it doesn't do this.

"For seasonal models, start values for a, b and s are inferred by performing a simple decomposition in trend and seasonal component using moving averages (see function decompose) on the start.periods first periods (a simple linear regression on the trend component is used for starting level and trend). For level/trend-models (no seasonal component), start values for a and b are x[2] and x[2] - x[1], respectively. For level-only models (ordinary exponential smoothing), the start value for a is x[1]."

Found this website that explains how to get initial values: https://robjhyndman.com/hyndsight/hw-initialization/


Coefficients in Holtwinter's Method

In the HoltWinter's model with seasonal= 'additive', I am able to produce the model output for coefficients manually. It seems like we need to use a[N-p],b[N-p] instead of a[N-1],b[N-1] in the HW formula. This may be because 'a' and 'b' depend on 's' component. I think the coefficients are the smoothed out values for the Nth data and for the last season. If the season has length p, then there will be p many smoothed values.

result=HoltWinters(co2,alpha=NULL,beta=NULL,gamma=NULL,seasonal = 'additive')


let us produce the coefficients manually


betat = 0.009497669




A_N=alphat*(co2[N]-result\$fitted[N-p,4] )+(1-alphat)*(result\$fitted[N-p,2]+ result\$fitted[N-p,3])







Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.