Užívateľský manuál

Táto stránka je aktuálne v procese tvorby. Ďakujeme za trpezlivosť!

Vo výrobe

Brownovo exponenciálne vyrovnávanie

Exponenciálne vyrovnávanie navrhol v roku 1956 pán Robert Goodel Brown, neskôr ho v roku 1957 rozšíril pán Charles Holt. Ide o techniku, pomocou ktorej je možné dáta časového radu vyhladiť a zároveň urobiť predpoveď na budúce obdobie.

Brownovo exponenciálne vyrovnávanie je určené pre nesezónne dáta a umožňuje rôzne typy trendov:

  • Jednoduché exponenciálne vyrovnávanie – konštantný trend
  • Dvojité exponenciálne vyrovnávanie – lineárny trend
  • Trojité exponenciálne vyrovnávanie – kvadratický trend

Predtým než začneme, je dobré si pripraviť vektor dát, na ktoré budeme exponenciálne vyrovnávanie aplikovať. Dáta sú dostupné aj v podobe reálnych údajov.

Príklad vytvorenia dátového vektora v R:

data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39,
         13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61,
         11.41, 11.33, 11.33, 11.3, 10.87)
  

Brownovo jednoduché exponenciálne vyrovnávanie v Rcran so zvolením parametra alfa

Exponenciálne vyrovnávanie je možné realizovať aj v prostredí R, pomocou vlastnej funkcie, ktorá zohľadňuje zvolený parameter α. Nižšie uvedená funkcia vypočíta MSE (mean squared error), vypíše odhadované hodnoty Y a poskytne aj predpoveď na jedno obdobie dopredu.

Funkcia BA() pracuje s dátovým vektorom a zvolenou hodnotou parametra alfa. Okrem toho automaticky vykreslí graf pôvodných a vyhladených hodnôt.

BA = function(vector, alpha) {
  avg_vector = sum(vector) / length(vector)
  pom_vector = 1:length(vector)
  pom_vector[1] = alpha * vector[1] + (1 - alpha) * avg_vector
  for (i in 2:length(vector)) {
    pom_vector[i] = alpha * vector[i] + (1 - alpha) * pom_vector[i - 1]
  }
  est_vector = 1:length(vector)
  est_vector[1] = avg_vector
  est_vector[2] = pom_vector[1]
  for (i in 3:length(vector)) {
    est_vector[i] = pom_vector[i - 1]
  }
  residuals = (vector - est_vector)^2
  MSE = mean(residuals)
  forecast = pom_vector[length(vector)]
  cat("Zvolená alfa:", alpha, "\nMSE:", MSE, "\nForecast:", forecast, "\n")
  plot(vector, type = "o", col = "blue", ylim = range(c(vector, est_vector)))
  lines(est_vector, type = "o", col = "red")
  points(length(vector) + 1, forecast, col = "brown", pch = 19)
}
  

Ukážka použitia funkcie:

data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39,
         13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61,
         11.41, 11.33, 11.33, 11.3, 10.87)

BA(data, 0.3)
  

Táto funkcia vykreslí originálne hodnoty (modrá), odhadované hodnoty (červená) a predikciu pre ďalšie obdobie (hnedá).

Brownovo jednoduché exponenciálne vyrovnávanie v Rcran s výpočtom optimálneho parametra alfa

Táto funkcia vykonáva to isté ako predchádzajúca verzia, avšak navyše automaticky vyhľadáva hodnotu parametra α, pri ktorej je stredná kvadratická chyba MSE najnižšia.

Funkcia prechádza interval od 0 do 0.7 a vyhodnocuje výsledky po zadanom kroku.

BO = function(vector, step) {
  alpha = step
  best_alpha = alpha
  min_mse = Inf
  best_forecast = NA
  best_est = rep(0, length(vector))

  while (alpha <= 0.7) {
    avg = mean(vector)
    smooth = rep(0, length(vector))
    smooth[1] = alpha * vector[1] + (1 - alpha) * avg
    for (i in 2:length(vector)) {
      smooth[i] = alpha * vector[i] + (1 - alpha) * smooth[i-1]
    }

    est = c(avg, smooth[1:(length(vector)-1)])
    mse = mean((vector - est)^2)

    if (mse < min_mse) {
      min_mse = mse
      best_alpha = alpha
      best_est = est
      best_forecast = smooth[length(vector)]
    }

    alpha = alpha + step
  }

  cat("Najlepšia hodnota α:", best_alpha, "\nNajnižšie MSE:", min_mse, "\nForecast:", best_forecast, "\n")
  plot(vector, type="o", col="blue", ylim=range(c(vector, best_est)))
  lines(best_est, type="o", col="red")
  points(length(vector)+1, best_forecast, col="brown", pch=19)
}
  

Ukážka použitia funkcie:

data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39,
         13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61,
         11.41, 11.33, 11.33, 11.3, 10.87)

BO(data, 0.05)
  

Modrá línia predstavuje pôvodné hodnoty, červená vyhladené hodnoty s optimálnym α a hnedý bod označuje predikciu na ďalšie obdobie.

Brownovo dvojité exponenciálne vyrovnávanie v Rcran so zvolením parametra alfa

Táto funkcia vykonáva dvojité exponenciálne vyrovnávanie, ktoré je vhodné pre časové rady s lineárnym trendom. Výpočet vyžaduje výber hodnoty parametra α a na jeho základe určuje strednú kvadratickú chybu MSE, predikciu a vyhladené hodnoty.

Funkcia tiež automaticky vykreslí graf s originálnymi hodnotami, odhadom a predpoveďou na jedno obdobie dopredu.

BEA = function(vector, alpha) {
  time = 1:length(vector)
  regr = lm(vector ~ time)
  b0 = regr$coef[1]
  b1 = regr$coef[2]

  st1 = b0 - (b1 * (1 - alpha) / alpha)
  st2 = b0 - (2 * b1 * (1 - alpha) / alpha)

  smooth1 = numeric(length(vector))
  smooth2 = numeric(length(vector))
  smooth1[1] = alpha * vector[1] + (1 - alpha) * st1

  for (i in 2:length(vector)) {
    smooth1[i] = alpha * vector[i] + (1 - alpha) * smooth1[i - 1]
  }

  smooth2[1] = alpha * smooth1[1] + (1 - alpha) * st2
  for (i in 2:length(vector)) {
    smooth2[i] = alpha * smooth1[i] + (1 - alpha) * smooth2[i - 1]
  }

  b_t = (alpha / (1 - alpha)) * (smooth1 - smooth2)
  a_t = 2 * smooth1 - smooth2

  est_vector = c(b0 + b1)
  for (i in 2:length(vector)) {
    est_vector[i] = a_t[i - 1] + b_t[i - 1]
  }

  mse = mean((vector - est_vector)^2)
  forecast = a_t[length(vector)] + b_t[length(vector)]

  cat("Zvolená α:", alpha, "\nMSE:", mse, "\nForecast:", forecast, "\n")
  plot(vector, type = "o", col = "blue", ylim = range(c(vector, est_vector)))
  lines(est_vector, type = "o", col = "red")
  points(length(vector) + 1, forecast, col = "brown", pch = 19)
}
  

Ukážka použitia funkcie:

data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39,
         13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61,
         11.41, 11.33, 11.33, 11.3, 10.87)

BEA(data, 0.3)
  

Modrá línia predstavuje pôvodné hodnoty, červená línia je dvojito vyhladený odhad a hnedý bod označuje predikciu do ďalšieho obdobia.

Brownovo dvojité exponenciálne vyrovnávanie v Rcran s výpočtom optimálneho parametra alfa

Táto funkcia rozširuje klasické dvojité exponenciálne vyrovnávanie o výpočet optimálnej hodnoty parametra α, pri ktorej je MSE (mean squared error) najnižšia. Parametre funkcie umožňujú definovať krok hľadania v rámci intervalu 0–0.7.

Výstupom sú okrem optimálneho α aj odhadované hodnoty Y, predpoveď na ďalšie obdobie a graf zobrazujúci pôvodné aj vyhladené dáta.

BEO = function(vector, step) {
  time = 1:length(vector)
  regr = lm(vector ~ time)
  b0 = regr$coef[1]
  b1 = regr$coef[2]
  alpha = step
  j = 0
  iterations = 0.7 / step
  MSE_data = numeric(iterations)
  parameter_alpha = alpha
  data_memory = numeric(length(vector))
  forecast = numeric(iterations)

  while (alpha <= 0.7) {
    j = j + 1
    st1 = b0 - (b1 * (1 - alpha) / alpha)
    st2 = b0 - (2 * b1 * (1 - alpha) / alpha)

    pom = numeric(length(vector))
    pom2 = numeric(length(vector))
    pom[1] = alpha * vector[1] + (1 - alpha) * st1
    for (i in 2:length(vector)) pom[i] = alpha * vector[i] + (1 - alpha) * pom[i - 1]

    pom2[1] = alpha * pom[1] + (1 - alpha) * st2
    for (i in 2:length(vector)) pom2[i] = alpha * pom[i] + (1 - alpha) * pom2[i - 1]

    b1t = (alpha / (1 - alpha)) * (pom - pom2)
    b0t = 2 * pom - pom2

    est_vector = numeric(length(vector))
    est_vector[1] = b0 + b1
    for (i in 2:length(vector)) est_vector[i] = b0t[i - 1] + b1t[i - 1]

    residuals = (vector - est_vector)^2
    MSE_data[j] = mean(residuals)

    if (j == 1 || MSE_data[j] < min(MSE_data[1:j])) {
      data_memory = est_vector
      parameter_alpha = alpha
      forecast[j] = b0t[length(vector)] + b1t[length(vector)]
    }

    alpha = alpha + step
  }

  MSE = min(MSE_data)
  cat("Optimálne α:", parameter_alpha, "\nNajnižšie MSE:", MSE, "\nForecast:", forecast[which.min(MSE_data)], "\n")

  plot(vector, type = "o", col = "blue", ylim = range(c(vector, data_memory)))
  lines(data_memory, type = "o", col = "red")
  points(length(vector) + 1, forecast[which.min(MSE_data)], col = "brown", pch = 19)
}
  

Ukážka použitia funkcie:

data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39,
         13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61,
         11.41, 11.33, 11.33, 11.3, 10.87)

BEO(data, 0.05)
  

Výsledný graf zobrazuje pôvodné hodnoty (modrá), optimálne vyhladené hodnoty (červená) a predikciu na ďalší časový bod (hnedá).

Brownovo trojité exponenciálne vyrovnávanie v Rcran so zvolením parametra alfa

Trojitá forma exponenciálneho vyrovnávania umožňuje modelovať kvadratické trendy v časových radoch. Táto verzia funkcie vyžaduje výber parametra α a následne vykonáva vyhladenie, výpočet odhadovaných hodnôt Y, hodnoty MSE a predikcie do ďalšieho obdobia.

Výsledkom je aj automatické vykreslenie grafu s originálnymi, vyhladenými a predikovanými hodnotami.

BTA = function(vector, alpha) {
  time1 = 1:length(vector)
  time2 = time1^2
  time = cbind(time1, time2)

  regr = lm(vector ~ time)
  b0 = regr$coef[1]
  b1 = regr$coef[2]
  b2 = regr$coef[3]

  st01 = b0 - (b1 * (1 - alpha) / alpha) + (1 - alpha) * (2 - alpha) / (alpha^2) * b2
  st02 = b0 - (2 * b1 * (1 - alpha) / alpha) + (1 - alpha) * (3 - 2 * alpha) / (alpha^2) * 2 * b2
  st03 = b0 - (3 * b1 * (1 - alpha) / alpha) + 3 * (1 - alpha) * (4 - 3 * alpha) / (alpha^2) * b2

  st1 = numeric(length(vector)); st1[1] = alpha * vector[1] + (1 - alpha) * st01
  for (i in 2:length(vector)) {
    st1[i] = alpha * vector[i] + (1 - alpha) * st1[i - 1]
  }

  st2 = numeric(length(vector)); st2[1] = alpha * st1[1] + (1 - alpha) * st02
  for (i in 2:length(vector)) {
    st2[i] = alpha * st1[i] + (1 - alpha) * st2[i - 1]
  }

  st3 = numeric(length(vector)); st3[1] = alpha * st2[1] + (1 - alpha) * st03
  for (i in 2:length(vector)) {
    st3[i] = alpha * st2[i] + (1 - alpha) * st3[i - 1]
  }

  b0t = 3 * st1 - 3 * st2 + st3
  b1t = (alpha / (2 * (1 - alpha)^2)) * ((6 - 5 * alpha) * st1 - 2 * (5 - 4 * alpha) * st2 + (4 - 3 * alpha) * st3)
  b2t = (alpha^2 / (1 - alpha)^2) * (st1 - 2 * st2 + st3)

  est_vector = numeric(length(vector)); est_vector[1] = b0 + b1 + b2
  for (i in 2:length(vector)) {
    est_vector[i] = b0t[i - 1] + b1t[i - 1] + b2t[i - 1]
  }

  residuals = (vector - est_vector)^2
  mse = mean(residuals)
  forecast = b0t[length(vector)] + b1t[length(vector)] + b2t[length(vector)] / 2

  cat("Zvolená α:", alpha, "\nMSE:", mse, "\nForecast:", forecast, "\n")
  plot(vector, type = "o", col = "blue", ylim = range(c(vector, est_vector)))
  lines(est_vector, type = "o", col = "red")
  points(length(vector) + 1, forecast, col = "brown", pch = 19)
}
  

Ukážka použitia funkcie:

data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39,
         13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61,
         11.41, 11.33, 11.33, 11.3, 10.87)

BTA(data, 0.3)
  

V grafe budú vykreslené: pôvodné hodnoty (modrá), trojito vyhladené odhady (červená) a predikcia pre ďalší časový bod (hnedá).

Brownovo trojité exponenciálne vyrovnávanie v Rcran s výpočtom optimálneho parametra alfa

Táto funkcia rozširuje klasické trojité exponenciálne vyrovnávanie o výpočet optimálnej hodnoty parametra α, pri ktorej je MSE (mean squared error) najnižšie. Parametre funkcie umožňujú definovať krok hľadania v rámci intervalu 0–0.7.

Výstupom sú okrem optimálneho α aj odhadované hodnoty Y, predpoveď na ďalšie obdobie a graf zobrazujúci pôvodné aj vyhladené dáta.

BTO(data, 0.05)  # BTO = funkcia
                 # data = vektor hodnôt
                 # 0.05 = krok pre hľadanie najlepšieho alfa
  

Skrátený popis algoritmu:

  • Pre každé α z intervalu (0, 0.7] sa vypočíta predikcia a MSE.
  • Hodnota α s najnižším MSE je vybraná ako optimálna.
  • Graf zobrazí pôvodné hodnoty (modrá), vyhladené hodnoty (červená) a predikciu (hnedá).

Príklad použitia funkcie:

data = c(14.29, 13.81, 13.58, 13.88, 14.26, 13.67, 12.6, 13.44, 13.39,
         13.59, 13.25, 12.9, 12.71, 11.89, 11.93, 12.3, 11.61,
         11.41, 11.33, 11.33, 11.3, 10.87)

BTO(data, 0.05)
  

Výstup funkcie zobrazí optimálny parameter α, najnižšiu hodnotu MSE, odhadované hodnoty a predikciu na ďalšie obdobie.

🔍