class Statsample::TimeSeries::Arima::KalmanFilter
Attributes
ar[R]
Autoregressive coefficients
i[RW]
Integerated part order
ma[R]
Moving average coefficients
p[RW]
Autoregressive order
q[RW]
Moving average order
ts[W]
timeseries object
Public Class Methods
T(r, k, p)
click to toggle source
# File lib/statsample-timeseries/arima/kalman.rb, line 113 def self.T(r, k, p) #=T #The coefficient matrix for the state vector in state equation # It's dimensions is r+k x r+k #==Parameters #* *r*: integer, r is max(p, q+1), where p and q are orders of AR and MA respectively #* *k*: integer, number of exogeneous variables in ARMA model #* *q*: integer, The AR coefficient of ARMA model #==References Statsmodels tsa, Durbin and Koopman Section 4.7 raise NotImplementedError end
log_likelihood(params, timeseries, p, q)
click to toggle source
Log Likelihood¶ ↑
Computes Log likelihood on given parameters, ARMA order and timeseries
params¶ ↑
-
params: array of floats, contains phi/theta parameters
-
timeseries: timeseries object
-
p: integer, AR(p) order
-
q: integer, MA(q) order
Returns¶ ↑
LogLikelihood object
Usage¶ ↑
s = (1..100).map { rand }.to_ts p, q = 1, 0 ll = KalmanFilter.log_likelihood([0.2], s, p, q) ll.log_likelihood #=> -22.66 ll.sigma #=> 0.232
# File lib/statsample-timeseries/arima/kalman.rb, line 108 def self.log_likelihood(params, timeseries, p, q) Arima::KF::LogLikelihood.new(params, timeseries, p, q) end
new(ts=[], p=0, i=0, q=0)
click to toggle source
Creates a new KalmanFilter
object and computes the likelihood
# File lib/statsample-timeseries/arima/kalman.rb, line 25 def initialize(ts=[], p=0, i=0, q=0) @ts = ts.to_a @p = p @i = i @q = q ks #call the filter end
Public Instance Methods
ks()
click to toggle source
Kalman Filter¶ ↑
Function which minimizes KalmanFilter.ll iteratively for initial parameters
Usage¶ ↑
@s = [-1.16025577,0.64758021,0.77158601,0.14989543,2.31358162,3.49213868,1.14826956,0.58169457,-0.30813868,-0.34741084,-1.41175595,0.06040081, -0.78230232,0.86734837,0.95015787,-0.49781397,0.53247330,1.56495187,0.30936619,0.09750217,1.09698829,-0.81315490,-0.79425607,-0.64568547,-1.06460320,1.24647894,0.66695937,1.50284551,1.17631218,1.64082872,1.61462736,0.06443761,-0.17583741,0.83918339,0.46610988,-0.54915270,-0.56417108,-1.27696654,0.89460084,1.49970338,0.24520493,0.26249138,-1.33744834,-0.57725961,1.55819543,1.62143157,0.44421891,-0.74000084 ,0.57866347,3.51189333,2.39135077,1.73046244,1.81783890,0.21454040,0.43520890,-1.42443856,-2.72124685,-2.51313877,-1.20243091,-1.44268002 ,-0.16777305,0.05780661,2.03533992,0.39187242,0.54987983,0.57865693,-0.96592469,-0.93278473,-0.75962671,-0.63216906,1.06776183, 0.17476059 ,0.06635860,0.94906227,2.44498583,-1.04990407,-0.88440073,-1.99838258,-1.12955558,-0.62654882,-1.36589161,-2.67456821,-0.97187696, -0.84431782 ,-0.10051809,0.54239549,1.34622861,1.25598105,0.19707759,3.29286114,3.52423499,1.69146333,-0.10150024,0.45222903,-0.01730516, -0.49828727, -1.18484684,-1.09531773,-1.17190808,0.30207662].to_ts @kf=Statsample::TimeSeries::ARIMA.ks(@s,1,0,0) #=> ks is implictly called in above operation @kf.ar #=> AR coefficients
# File lib/statsample-timeseries/arima/kalman.rb, line 50 def ks initial = Array.new((@p+@q), 0.0) my_f = Proc.new{ |x, params| #In rb-gsl, params remain idle, x is varied upon #In R code, initial parameters varied in each iteration #my_func.set_params([(1..100).to_a.to_ts, p_value, q_value]) timeseries = params[0] p,q = params[1], params[2] params = x #puts x -Arima::KF::LogLikelihood.new(x.to_a, timeseries, p, q).log_likelihood #KalmanFilter.ll(x.to_a, timeseries, p, q) } np = @p + @q my_func = Function.alloc(my_f, np) my_func.set_params([@ts, @p, @q]) x = GSL::Vector.alloc(initial) ss = GSL::Vector.alloc(np) ss.set_all(0.1) minimizer = FMinimizer.alloc("nmsimplex", np) minimizer.set(my_func, x, ss) status = GSL::CONTINUE iter = 0 while status == GSL::CONTINUE && iter < 100 iter += 1 begin status = minimizer.iterate status = minimizer.test_size(1e-2) x = minimizer.x rescue break end end @ar = (p > 0) ? x.to_a[0...p] : [] @ma = (q > 0) ? x.to_a[p...(p+q)] : [] x.to_a end
to_s()
click to toggle source
# File lib/statsample-timeseries/arima/kalman.rb, line 37 def to_s sprintf("ARIMA model(p = %d, i = %d, q = %d) on series(%d elements) - [%s]", @p, @i, @q, @ts.size, @ts.to_a.join(',')) end
ts()
click to toggle source
# File lib/statsample-timeseries/arima/kalman.rb, line 33 def ts Daru::Vector.new(@ts) end