Kalmanova filtrácia
Kalmanova filtrácia je metóda používaná na odhad aktuálneho a budúceho stavu dynamického systému. Je založená na tzv. Kalmanovom filtri, ktorý dokáže eliminovať šum z pozorovaní a získať čo najpresnejší odhad stavu systému.
Najčastejšie sa využíva v oblastiach ako GPS navigácia, vojenské riadenie, robotika, ale aj ekonómia a analýza časových radov. Aby bolo možné Kalmanov filter použiť, musí byť systém popísaný lineárnou stavovou formou.
Matematická formulácia
Stavová rovnica:
xt = A·xt-1 + B·ut-1 + wt-1
xt
– stavový vektorA
– prechodová maticaB
– matica parametrov exogénnych premennýchut
– vektor exogénnych premennýchwt
– procesný šum, s kovarianciouQ
Rovnica pozorovaní:
yt = H·xt + vt
yt
– pozorovanieH
– matica pozorovanívt
– šum pozorovaní, nezávislý odwt
, s kovarianciouR
Riešenie Kalmanovej filtrácie v R
Na riešenie Kalmanovej filtrácie v R môžeme využiť vstavanú funkciu StructTS()
, ktorá umožňuje pracovať s rôznymi typmi štrukturálnych modelov.
StructTS(x, type = c("level", "trend", "BSM"), init = NULL, fixed = NULL, optim.control = NULL)
Parametre:
x
– časový rad (môže obsahovať chýbajúce hodnoty)type
– typ modelu: napr."BSM"
– základný štrukturálny modelinit
– počiatočné hodnoty rozptylufixed
– voliteľný vektor pevných parametrov
Príklad na Kalmanovu filtráciu
V tomto príklade použijeme štvrťročné dáta z Českého štatistického úradu – konkrétne ide o počet osôb, ktoré strávili viac ako 4 noci v hoteloch v Českej republike.
Z dát vytvoríme časový rad s frekvenciou 4 (štvrťročne), so začiatkom v roku 2003, a vykreslíme ho do grafu.
my_cv_data <- c(1446.10, 1940.17, 5576.95, 978.36, 1410.89, 1500.21, 5068.24, 953.86, 1338.31, 2036.41, 5005.75, 1052.94, 1488.87, 1938.82, 5130.36, 1347.81, 1516.84, 1922.73, 5792.79, 1220.65, 1431.42, 1754.18, 5648.29, 1355.09) ts_freq <- 4 ts_start <- 2003 mcdata_ts <- ts(my_cv_data, start = ts_start, frequency = ts_freq) plot(mcdata_ts, lty = "dotted")
Pre vizualizáciu sezónnych zmien v čase načítame knižnicu forecast
a použijeme funkciu seasonplot()
:
library(forecast) seasonplot(mcdata_ts)
Tento graf umožňuje porovnať hodnoty rovnakých štvrťrokov naprieč rokmi, čo môže odhaliť sezónne vzory alebo odchýlky.

Predikcia Kalmanovou filtráciou
Po vytvorení modelu Kalmanovej filtrácie pomocou StructTS()
môžeme pristúpiť k predikcii na nasledujúce obdobia. V tomto prípade predikujeme 4 štvrťroky dopredu:
kts <- StructTS(mcdata_ts, type = "BSM") prog_kts <- predict(kts, 4)
Pre vizualizáciu reálnych, odhadnutých aj predikovaných dát použijeme vlastnú funkciu plot_kalman()
, ktorá ako parametre prijíma originálne dáta, model, predikciu a informácie o časovej osi:
plot_kalman <- function(data_ts, kts, prog_kts, t.start, t.freq) { prog_kts <- prog_kts$pred kts_s <- kts$fitted[,1] + kts$fitted[,2] + kts$fitted[,3] min_v <- min(data_ts, prog_kts, kts_s) max_v <- max(data_ts, prog_kts, kts_s) kts_w_prog <- ts(c(kts_s, prog_kts), start = t.start, freq = t.freq) plot(data_ts, xlim = attr(kts_w_prog, "tsp")[1:2], ylim = c(min_v, max_v), lty = "dotted") lines(kts_w_prog, col = "red") # Predikcia lines(kts_s, col = "blue") # Kalman filter }
Funkciu spustíme nasledovne:
plot_kalman(mcdata_ts, kts, prog_kts, ts_start, ts_freq)
Výsledný graf zobrazí:
- Reálne dáta (čiarkovaná čiara)
- Kalmanom odhadnuté hodnoty (modrá čiara)
- Predikcie na ďalšie 4 kvartály (červená čiara)

Výpočet RMSE pre Kalmanovu filtráciu
Na overenie kvality odhadu Kalmanovým filtrom môžeme použiť odmocnenú priemernú štvorcovú chybu (RMSE – Root Mean Squared Error).
RMSE vypočítame ako odmocninu z priemeru druhých mocnín rozdielov medzi odhadovanými hodnotami kts$fitted
a pôvodnými dátami mcdata_ts
.
RMSE_kalman <- sqrt(sum((rowSums(kts$fitted) - mcdata_ts)^2) / length(mcdata_ts)) RMSE_kalman # [1] 136.4347
Nižšia hodnota RMSE znamená lepší model – teda presnejšie odhady pôvodných dát pomocou Kalmanovej filtrácie.
Zdroj: Považanec, P.: Diplomová práca: Optimalizácia softvérového riešenia prognózovania časových radov ekonomických dát. 2010