Skip to contents

Identical recursion to the matrix-argument form in Kalmf; only the interface differs, the system being passed as one object with entries F, H, Q, R and optionally x0 and P0 – the shape a fitted model is usually kept in. This function DELEGATES to Kalmf rather than carrying a second copy of the recursion, because a second copy would agree with the first at any tolerance and so could never be told apart from correct work.

Usage

Klmflt(y, model)

Arguments

y

Observation matrix, one row per time point.

model

Named list with F, H, Q, R and optionally x0, P0.

Value

List with estimate, state, loglik, n, method.

Details

Formula: see Kalmf; predict x_pred = F x, P_pred = F P F' + Q, then update with gain K = P_pred H' (H P_pred H' + R)^{-1}.

References

Kalman (1960), Transactions of the ASME, Journal of Basic Engineering 82(1):35-45. doi:10.1115/1.3662552

Examples

set.seed(1)
y <- matrix(cumsum(rnorm(20)) + rnorm(20), 20, 1)
model <- list(F = matrix(1), H = matrix(1), Q = matrix(0.1), R = matrix(1),
              x0 = 0, P0 = matrix(1))
Klmflt(y, model)
#> $estimate
#> [1] 2.885739
#> 
#> $state
#> $state[[1]]
#> [1] 0.1532266
#> 
#> $state[[2]]
#> [1] 0.2247193
#> 
#> $state[[3]]
#> [1] -0.2413166
#> 
#> $state[[4]]
#> [1] -0.669023
#> 
#> $state[[5]]
#> [1] -0.1172496
#> 
#> $state[[6]]
#> [1] -0.148668
#> 
#> $state[[7]]
#> [1] -0.06467182
#> 
#> $state[[8]]
#> [1] -0.1612138
#> 
#> $state[[9]]
#> [1] 0.1943665
#> 
#> $state[[10]]
#> [1] 0.6128912
#> 
#> $state[[11]]
#> [1] 1.581138
#> 
#> $state[[12]]
#> [1] 1.997379
#> 
#> $state[[13]]
#> [1] 2.265658
#> 
#> $state[[14]]
#> [1] 1.743686
#> 
#> $state[[15]]
#> [1] 1.309204
#> 
#> $state[[16]]
#> [1] 1.239908
#> 
#> $state[[17]]
#> [1] 1.190555
#> 
#> $state[[18]]
#> [1] 1.50002
#> 
#> $state[[19]]
#> [1] 2.260943
#> 
#> $state[[20]]
#> [1] 2.885739
#> 
#> 
#> $cov
#> $cov[[1]]
#>           [,1]
#> [1,] 0.5238095
#> 
#> $cov[[2]]
#>           [,1]
#> [1,] 0.3841642
#> 
#> $cov[[3]]
#>           [,1]
#> [1,] 0.3262201
#> 
#> $cov[[4]]
#>          [,1]
#> [1,] 0.298846
#> 
#> $cov[[5]]
#>          [,1]
#> [1,] 0.285125
#> 
#> $cov[[6]]
#>           [,1]
#> [1,] 0.2780435
#> 
#> $cov[[7]]
#>           [,1]
#> [1,] 0.2743335
#> 
#> $cov[[8]]
#>           [,1]
#> [1,] 0.2723746
#> 
#> $cov[[9]]
#>          [,1]
#> [1,] 0.271336
#> 
#> $cov[[10]]
#>           [,1]
#> [1,] 0.2707841
#> 
#> $cov[[11]]
#>           [,1]
#> [1,] 0.2704905
#> 
#> $cov[[12]]
#>           [,1]
#> [1,] 0.2703342
#> 
#> $cov[[13]]
#>          [,1]
#> [1,] 0.270251
#> 
#> $cov[[14]]
#>           [,1]
#> [1,] 0.2702067
#> 
#> $cov[[15]]
#>           [,1]
#> [1,] 0.2701831
#> 
#> $cov[[16]]
#>           [,1]
#> [1,] 0.2701705
#> 
#> $cov[[17]]
#>           [,1]
#> [1,] 0.2701638
#> 
#> $cov[[18]]
#>           [,1]
#> [1,] 0.2701603
#> 
#> $cov[[19]]
#>           [,1]
#> [1,] 0.2701584
#> 
#> $cov[[20]]
#>           [,1]
#> [1,] 0.2701574
#> 
#> 
#> $predicted
#> $predicted[[1]]
#> [1] 0
#> 
#> $predicted[[2]]
#> [1] 0.1532266
#> 
#> $predicted[[3]]
#> [1] 0.2247193
#> 
#> $predicted[[4]]
#> [1] -0.2413166
#> 
#> $predicted[[5]]
#> [1] -0.669023
#> 
#> $predicted[[6]]
#> [1] -0.1172496
#> 
#> $predicted[[7]]
#> [1] -0.148668
#> 
#> $predicted[[8]]
#> [1] -0.06467182
#> 
#> $predicted[[9]]
#> [1] -0.1612138
#> 
#> $predicted[[10]]
#> [1] 0.1943665
#> 
#> $predicted[[11]]
#> [1] 0.6128912
#> 
#> $predicted[[12]]
#> [1] 1.581138
#> 
#> $predicted[[13]]
#> [1] 1.997379
#> 
#> $predicted[[14]]
#> [1] 2.265658
#> 
#> $predicted[[15]]
#> [1] 1.743686
#> 
#> $predicted[[16]]
#> [1] 1.309204
#> 
#> $predicted[[17]]
#> [1] 1.239908
#> 
#> $predicted[[18]]
#> [1] 1.190555
#> 
#> $predicted[[19]]
#> [1] 1.50002
#> 
#> $predicted[[20]]
#> [1] 2.260943
#> 
#> 
#> $predicted_cov
#> $predicted_cov[[1]]
#>      [,1]
#> [1,]  1.1
#> 
#> $predicted_cov[[2]]
#>           [,1]
#> [1,] 0.6238095
#> 
#> $predicted_cov[[3]]
#>           [,1]
#> [1,] 0.4841642
#> 
#> $predicted_cov[[4]]
#>           [,1]
#> [1,] 0.4262201
#> 
#> $predicted_cov[[5]]
#>          [,1]
#> [1,] 0.398846
#> 
#> $predicted_cov[[6]]
#>          [,1]
#> [1,] 0.385125
#> 
#> $predicted_cov[[7]]
#>           [,1]
#> [1,] 0.3780435
#> 
#> $predicted_cov[[8]]
#>           [,1]
#> [1,] 0.3743335
#> 
#> $predicted_cov[[9]]
#>           [,1]
#> [1,] 0.3723746
#> 
#> $predicted_cov[[10]]
#>          [,1]
#> [1,] 0.371336
#> 
#> $predicted_cov[[11]]
#>           [,1]
#> [1,] 0.3707841
#> 
#> $predicted_cov[[12]]
#>           [,1]
#> [1,] 0.3704905
#> 
#> $predicted_cov[[13]]
#>           [,1]
#> [1,] 0.3703342
#> 
#> $predicted_cov[[14]]
#>          [,1]
#> [1,] 0.370251
#> 
#> $predicted_cov[[15]]
#>           [,1]
#> [1,] 0.3702067
#> 
#> $predicted_cov[[16]]
#>           [,1]
#> [1,] 0.3701831
#> 
#> $predicted_cov[[17]]
#>           [,1]
#> [1,] 0.3701705
#> 
#> $predicted_cov[[18]]
#>           [,1]
#> [1,] 0.3701638
#> 
#> $predicted_cov[[19]]
#>           [,1]
#> [1,] 0.3701603
#> 
#> $predicted_cov[[20]]
#>           [,1]
#> [1,] 0.3701584
#> 
#> 
#> $loglik
#> [1] -39.83011
#> 
#> $n
#> [1] 20
#> 
#> $method
#> [1] "forward predict/update recursion, Kalman (1960); delegates to Kalmf"
#> 
#> attr(,"class")
#> [1] "morie_rich_result" "list"