Kami akan menjelaskan bagaimana spline dapat digunakan melalui teknik Kalman Filtering (KF) sehubungan dengan State-Space Model (SSM). Fakta bahwa beberapa model spline dapat diwakili oleh SSM dan dihitung dengan KF diungkapkan oleh CF Ansley dan R. Kohn pada tahun 1980-1990. Fungsi yang diestimasi dan turunannya adalah harapan negara tergantung pada pengamatan. Estimasi ini dihitung dengan menggunakan pemulusan interval tetap , tugas rutin saat menggunakan SSM.
Demi kesederhanaan, asumsikan bahwa pengamatan dilakukan pada waktu dan bahwa angka pengamatan pada
hanya melibatkan satu turunan dengan urutan dalam
. Bagian pengamatan model menulis sebagai
mana menunjukkan fungsi true yang tidak teramati dan
adalah kesalahan Gaussian dengan varian tergantung pada urutan derivasi . Persamaan transisi (waktu kontinu) mengambil bentuk umum
t1<t2<⋯<tnktkd k { 0 ,dk{0,1,2}y(tk)=f[dk](tk)+ε(tk)(O1)
f(t)ε ( t k ) H ( t k ) d k dε(tk)H(tk)dkddtα(t)=Aα(t)+η(t)(T1)
mana adalah vektor state yang tidak teramati dan
adalah derau putih Gaussian dengan kovarians , diasumsikan independen dari kebisingan pengamatan r.vs . Untuk menggambarkan spline, kami mempertimbangkan keadaan yang diperoleh dengan menumpuk
turunan pertama, yaitu . Transisinya adalah
α(t)η(t)Qε(tk)mα(t):=[f(t),f[1](t),…,f[m−1](t)]⊤⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f[1](t)f[2](t)⋮f[m−1](t)f[m](t)⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢00⋮010…01⋱10⎤⎦⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢f(t)f[1](t)⋮f[m−2](t)f[m−1](t)⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢⎢⎢⎢⎢⎢⎢00⋮0η(t)⎤⎦⎥⎥⎥⎥⎥⎥⎥
2m2m-1m=2>1 y ( t k )
dan kita kemudian mendapatkan spline polinomial dengan urutan (dan derajat
). Sementara sesuai dengan spline kubik biasa,2m2m−1m=2>1. Untuk tetap berpegang pada formalisme SSM klasik kita bisa menulis ulang (O1) sebagai
di mana matriks observasi memilih turunan yang sesuai di dan varian dari
dipilih tergantung pada . Jadi mana ,
dan . Demikian pulay(tk)=Z(tk)α(tk)+ε(tk),(O2)
Z(tk)α(tk)H(tk)ε(tk)dkZ(tk)=Z⋆dk+1Z⋆1:=[1,0,…,0]Z⋆2:=[0,1,…0]Z⋆3:=[0,0,1,0,…]H(tk)=H⋆dk+1 H ⋆ 1 H ⋆ 2 H ⋆ 3untuk tiga varian ,
, dan . H⋆1H⋆2H⋆3
Meskipun transisi dalam waktu kontinu, KF sebenarnya adalah waktu diskrit standar . Memang, kita akan dalam praktek fokus pada kali di mana kita memiliki observasi, atau di mana kita ingin memperkirakan derivatif. Kita dapat menganggap himpunan menjadi gabungan dari dua set waktu ini dan menganggap bahwa pengamatan pada dapat hilang: ini memungkinkan untuk memperkirakan turunan kapan saja
terlepas dari keberadaan suatu pengamatan. Masih ada untuk menurunkan SSM diskrit.t{tk}tkmtk
Kami akan menggunakan indeks untuk waktu diskrit, menulis untuk
dan seterusnya. SSM waktu diskret mengambil bentuk
mana matriks dan berasal dari (T1) dan (O2) sedangkan varian dari diberikan oleh
asalkanαkα(tk)αk+1yk=Tkαk+η⋆k=Zkαk+εk(DT)
TkQ⋆k:=Var(η⋆k)εkHk=H⋆dk+1ykTk=exp{δkA}=[ 1 δ 1 ktidak hilang. Dengan menggunakan beberapa aljabar, kita dapat menemukan matriks transisi untuk SSM-waktu diskrit
mana untuk . Demikian pula matriks kovarians untuk SSM waktu diskrit dapat diberikan sebagai
Tk=exp{δkA}=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢10⋮0δ1k1!1…δ2k2!δ1k1!…⋱δm−1k(m−1)!δ1k1!1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥,
δk:=tk+1−tkk<nQ⋆k=Var(η⋆k)Q⋆k=σ2η[δ2m−i−j+1k(m−i)!(m−j)!(2m−i−j+1)]i,j
mana indeks dan berada di antara dan .ij1m
Sekarang untuk meneruskan perhitungan dalam R kita membutuhkan paket yang ditujukan untuk KF dan menerima model yang bervariasi waktu; paket CRAN KFAS tampaknya merupakan pilihan yang baik. Kita dapat menulis fungsi R untuk menghitung matriks
dan dari vektor kali
untuk mengkodekan SSM (DT). Dalam notasi yang digunakan oleh paket, sebuah matriks hadir untuk mengalikan noise
dalam persamaan transisi (DT): kami menganggapnya sebagai identitas . Perhatikan juga bahwa kovarians awal difus harus digunakan di sini.TkQ⋆ktkRkη⋆kIm
EDIT Bintang seperti yang ditulis pada awalnya salah. Diperbaiki (termasuk dalam kode R dan gambar).Q⋆
CF Ansley dan R. Kohn (1986) "Pada Kesetaraan Dua Pendekatan Stochastic untuk Spline Smoothing" J. Appl. Mungkin. , 23, hlm. 391-405
R. Kohn dan CF Ansley (1987) "Algoritma Baru untuk Spline Smoothing Berdasarkan Proses Smoothing Stochastic" SIAM J. Sci. dan Stat. Komputasi. , 8 (1), hlm. 33–48
J. Helske (2017). "KFAS: Model Ruang Keluarga Negara Eksponensial dalam R" J. Stat. Lembut. , 78 (10), hlm. 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
dapat menghitung turunan dan mungkin Anda bisa menggunakan ini sebagai titik awal untuk menyesuaikan data menggunakan beberapa metode terbalik? Saya tertarik untuk mempelajari solusi untuk ini.