Ми розповімо, як сплайн можна використовувати за допомогою методів Kalman Filtering (KF) у зв'язку з державно-космічною моделлю (SSM). Те, що деякі моделі сплайну можуть бути представлені SSM та обчислені з KF, було виявлено К. Ф. Анслі та Р. Конном у 1980-1990 роках. Оціночна функція та її похідні - це очікування держави, що обумовлюються спостереженнями. Ці оцінки обчислюються за допомогою згладжування з фіксованим інтервалом , звичайної задачі при використанні SSM.
Для простоти припустімо, що спостереження проводяться в рази т1< т2< ⋯ < tн і що число спостереження к при
тк включає лише одну похідну з порядком гк в
{ 0 ,1 ,2 } . Частина спостереження моделі записує як
у( т. звк) = f[ дк]( т. звк) + ε ( tк)(O1)
деf( t ) позначає непоміченусправжнюфункцію, аε ( tк)
- помилка Гаусса при дисперсіяН( т. звк) залежно від порядку отриманнягк. Рівняння переходу (безперервний час) приймає загальну форму
де - вектор, що не спостерігається, і
- гауссовий білий шум з коваріацією , вважається незалежним від спостережного шуму r.vs . Для того щоб описати сплайн, ми розглянемо стан, отриманий шляхом складання
перших похідних, тобто . Перехід є
гд тα ( t ) = A α ( t ) + η ( t )(T1)
α ( t )η ( t )Qε ( tк)мα ( t ) : = [ f( t ) ,f[ 1 ]( t ) ,… ,f[ м - 1 ]( t ) ]⊤⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f[ 1 ]( t )f[ 2 ]( t )⋮f[ м - 1 ]( t )f[ м ]( t )⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥= ⎡⎣⎢⎢⎢⎢⎢⎢⎢00⋮010…01⋱10⎤⎦⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f( t )f[ 1 ]( t )⋮f[ м - 2 ]( t )f[ м - 1 ]( t )⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥+ ⎡⎣⎢⎢⎢⎢⎢⎢⎢00⋮0η( t )⎤⎦⎥⎥⎥⎥⎥⎥⎥
і тоді ми отримуємо поліноміальний сплайн з порядком (і ступеня
). У той час як відповідає звичайному кубічному сплайну,2м2м-1 = Z ( t k ) α ( t k 2 м2 м - 1m = 2> 1. Щоб дотримуватися класичного формалізму SSM, ми можемо переписати (O1) як
де спостереження матриця вибирає потрібну похідну і дисперсія з
вибирається в залежності від . Тож де ,
та . Аналогічноу( т. звк) = Z ( tк) α ( tк) + ε ( tк) ,(O2)
Z ( tк)α ( tк)Н( т. звк)ε ( tк)гкZ ( tк) = Z⋆гк+ 1Z⋆1: = [ 1 ,0 ,… ,0 ]Z⋆2: = [ 0 ,1 ,…0 ]Z⋆3: = [ 0 ,0 ,1 , 0 ,… ]Н( т. звк) = Н⋆гк+ 1 H ⋆ 1 H ⋆ 2 H ⋆ 3для трьох варіацій ,
та . Н⋆1Н⋆2Н⋆3
Хоча перехід відбувається в безперервному часі, КФ насправді є стандартним дискретним часом . Дійсно, ми на практиці зосередимось на часу де ми спостерігаємо, або де ми хочемо оцінити похідні. Ми можемо взяти множину як об'єднання цих двох множин разів і припустити, що спостереження при може бути відсутнім: це дозволяє оцінити похідних у будь-який момент
незалежно від існування спостереження. Залишається отримати дискретний SSM.т{ тк}ткмтк
Ми будемо використовувати індекси для дискретних разів, записуючи для
тощо. Дискретний час SSM приймає форму
де матриці і походять від (T1) та (O2), тоді як дисперсія задана
умови, щоαкα ( tк)αk + 1ук= Ткαк+ η⋆к= Zкαк+ εк(DT)
ТкQ⋆к: = Var ( η⋆к)εкНк= Н⋆гк+ 1укне відсутня. Використовуючи деяку алгебру, ми можемо знайти матрицю переходу для дискретного SSM
де для . Аналогічно матриці коваріації для SSM дискретного часу може бути задано як
Тк= Досвід{ δкA }= ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢10⋮0δ1к1 !1…δ2к2 !δ1к1 !…⋱δм - 1к( м - 1 ) !δ1к1 !1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥,
δк: = tk + 1- ткk < nQ⋆к= Вар ( η⋆к)Q⋆к= σ2η[ δ2 м - i - j + 1к( м - і ) ! ( m - j ) ! ( 2 м - i - j + 1 )]i , j
ij1
де показники і знаходяться між і .ij1м
Тепер, щоб перенести обчислення в R, нам потрібен пакет, присвячений KF та прийняття змінних за часом моделей; пакет CRAN KFAS здається хорошим варіантом. Ми можемо записати R функції для обчислення матриць
та з вектора разів
, щоб кодувати SSM (DT). У позначеннях, використовуваних пакетом, матриця надходить для множення шуму
у рівнянні переходу (DT): ми вважаємо його тут ідентичним . Також зауважте, що тут слід використовувати дифузну початкову коваріацію.ТкQ⋆кткRкη⋆кЯм
EDIT , як спочатку написано було неправильно. Виправлено (також в коді R та зображенні).Q⋆
К. Ф. Анслі та Р. Кон (1986) "Про еквівалентність двох стохастичних підходів до згладжування сплайну" Дж. Еппл. Імовірно. , 23, с. 391–405
Р. Кон і К. Ф. Анслі (1987) "Новий алгоритм згладжування сплайну на основі згладжування стохастичного процесу" SIAM J. Sci. і Стат. Обчислення. , 8 (1), стор 33–48
Й. Гельське (2017). "KFAS: Експоненціальні моделі простору сімейного стану в R" J. Stat. М’який. , 78 (10), стор 1-39
smoothWithDer <- function(t, y, d, m = 3,
Hstar = c(3, 0.2, 0.1)^2, sigma2eta = 1.0^2) {
## define the SSM matrices, depending on 'delta_k' or on 'd_k'
Tfun <- function(delta) {
mat <- matrix(0, nrow = m, ncol = m)
for (i in 0:(m-1)) {
mat[col(mat) == row(mat) + i] <- delta^i / gamma(i + 1)
}
mat
}
Qfun <- function(delta) {
im <- (m - 1):0
x <- delta^im / gamma(im + 1)
mat <- outer(X = x, Y = x, FUN = "*")
im2 <- outer(im, im, FUN = "+")
sigma2eta * mat * delta / (im2 + 1)
}
Zfun <- function(d) {
Z <- matrix(0.0, nrow = 1, ncol = m)
Z[1, d + 1] <- 1.0
Z
}
Hfun <- function(d) ifelse(d >= 0, Hstar[d + 1], 0.0)
Rfun <- function() diag(x = 1.0, nrow = m)
## define arrays by stacking the SSM matrices. We need one more
## 'delta' at the end of the series
n <- length(t)
delta <- diff(t)
delta <- c(delta, mean(delta))
Ta <- Qa <- array(0.0, dim = c(m, m, n))
Za <- array(0.0, dim = c(1, m, n))
Ha <- array(0.0, dim = c(1, 1, n))
Ra <- array(0.0, dim = c(m, m, n))
for (k in 1:n) {
Ta[ , , k] <- Tfun(delta[k])
Qa[ , , k] <- Qfun(delta[k])
Za[ , , k] <- Zfun(d[k])
Ha[ , , k] <- Hfun(d[k])
Ra[ , , k] <- Rfun()
}
require(KFAS)
## define the SSM and perform Kalman Filtering and smoothing
mod <- SSModel(y ~ SSMcustom(Z = Za, T = Ta, R = Ra, Q = Qa, n = n,
P1 = matrix(0, nrow = m, ncol = m),
P1inf = diag(1.0, nrow = m),
state_names = paste0("d", 0:(m-1))) - 1)
out <- KFS(mod, smoothing = "state")
list(t = t, filtered = out$att, smoothed = out$alphahat)
}
## An example function as in OP
f <- function(t, d = rep(0, length = length(t))) {
f <- rep(NA, length(t))
if (any(ind <- (d == 0))) f[ind] <- 2.0 + t[ind] - 0.5 * t[ind]^2
if (any(ind <- (d == 1))) f[ind] <- 1.0 - t[ind]
if (any(ind <- (d == 2))) f[ind] <- -1.0
f
}
set.seed(123)
n <- 100
t <- seq(from = 0, to = 10, length = n)
Hstar <- c(3, 0.4, 0.2)^2
sigma2eta <- 1.0
fTrue <- cbind(d0 = f(t), d1 = f(t, d = 1), d2 = f(t, d = 2))
## ============================================================================
## use a derivative index of -1 to indicate non-observed values, where
## 'y' will be NA
##
## [RUN #0] no derivative m = 2 (cubic spline)
## ============================================================================
d0 <- sample(c(-1, 0), size = n, replace = TRUE, prob = c(0.7, 0.3))
ft0 <- f(t, d0)
## add noise picking the right sd
y0 <- ft0 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d0 + 2])
res0 <- smoothWithDer(t, y0, d0, m = 2, Hstar = Hstar)
## ============================================================================
## [RUN #1] Only first order derivative: we can take m = 2 (cubic spline)
## ============================================================================
d1 <- sample(c(-1, 0:1), size = n, replace = TRUE, prob = c(0.7, 0.15, 0.15))
ft1 <- f(t, d1)
y1 <- ft1 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d1 + 2])
res1 <- smoothWithDer(t, y1, d1, m = 2, Hstar = Hstar)
## ============================================================================
## [RUN #2] First and second order derivative: we can take m = 3
## (quintic spline)
## ============================================================================
d2 <- sample(c(-1, 0:2), size = n, replace = TRUE, prob = c(0.7, 0.1, 0.1, 0.1))
ft2 <- f(t, d2)
y2 <- ft2 + rnorm(n = n, sd = c(0.0, sqrt(Hstar))[d2 + 2])
res2 <- smoothWithDer(t, y2, d2, m = 3, Hstar = Hstar)
## plots : a ggplot with facets would be better here.
for (run in 0:2) {
resrun <- get(paste0("res", run))
drun <- get(paste0("d", run))
yrun <- get(paste0("y", run))
matplot(t, resrun$smoothed, pch = 16, cex = 0.7, ylab = "", xlab = "")
matlines(t, fTrue, lwd = 2, lty = 1)
for (dv in 0:2) {
points(t[drun == dv], yrun[drun == dv], cex = 1.2, pch = 22, lwd = 2,
bg = "white", col = dv + 1)
}
title(main = sprintf("run %d. Dots = smooothed, lines = true, square = obs", run))
legend("bottomleft", col = 1:3, legend = c("d0", "d1", "d2"), lty = 1)
}
splinefun
можна обчислити похідні, і, мабуть, ви могли б використовувати це як вихідну точку для пристосування даних за допомогою деяких зворотних методів? Мені цікаво дізнатися рішення цього.