Chúng tôi sẽ mô tả cách sử dụng spline thông qua các kỹ thuật Lọc Kalman (KF) liên quan đến Mô hình Không gian Nhà nước (SSM). Việc một số mô hình spline có thể được đại diện bởi SSM và được tính toán với KF đã được tiết lộ bởi CF Ansley và R. Kohn trong những năm 1980-1990. Các chức năng ước tính và các dẫn xuất của nó là những kỳ vọng của nhà nước có điều kiện về các quan sát. Các ước tính này được tính bằng cách sử dụng làm mịn khoảng thời gian cố định , một nhiệm vụ thường xuyên khi sử dụng SSM.
Để đơn giản, giả sử rằng các quan sát được thực hiện tại các thời điểm t1<t2<⋯<tn và số quan sát k tại
tk chỉ liên quan đến một đạo hàm với thứ tự dk trong
{0,1,2} . Phần quan sát của viết mô hình như
y(tk)=f[dk](tk)+ε(tk)(O1)
nơif(t) biểu thị không quan sát đượcđúngchức năng vàε(tk)
là một lỗi Gaussian với phương saiH(tk) tùy theo thứ tự đạo hàmdk. Phương trình chuyển tiếp (thời gian liên tục) có dạng tổng quát
ddtα(t)=Aα(t)+η(t)(T1)
nơilà vector không quan sát được trạng thái và
là một tiếng ồn trắng Gaussian với hiệp phương sai, được coi là độc lập với nhiễu quan sát r.vs. Để mô tả một spline, chúng ta xem xét một nhà nước thu được bằng cách xếp chồng các
phái sinh đầu tiên, tức là . Quá trình chuyển đổi là
α(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 )
và sau đó chúng tôi nhận được một spline đa thức với thứ tự (và độ
). Trong khi tương ứng với spline hình khối thông thường,2m2m−1m=2>1. Để tuân thủ chủ nghĩa hình thức SSM cổ điển, chúng ta có thể viết lại (O1) dưới dạng
trong đó ma trận quan sát chọn đạo hàm phù hợp trong và phương sai của
được chọn tùy thuộc vào . Vì vậy trong đó ,
và . Tương tựy(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 ⋆ 3cho ba phương sai ,
và . H⋆1H⋆2H⋆3
Mặc dù quá trình chuyển đổi diễn ra trong thời gian liên tục, KF thực sự là thời gian rời rạc tiêu chuẩn . Trên thực tế, chúng tôi sẽ trong thực tế tập trung vào thời điểm nơi chúng tôi có một quan sát, hoặc trong trường hợp chúng ta muốn ước tính đạo hàm. Chúng ta có thể lấy tập hợp làm liên kết của hai tập hợp thời gian này và giả sử rằng quan sát tại có thể bị thiếu: điều này cho phép ước tính các đạo hàm bất cứ lúc nào
bất kể sự tồn tại của một quan sát. Vẫn còn để rút ra SSM rời rạc.t{tk}tkmtk
Chúng tôi sẽ sử dụng các chỉ mục cho các thời điểm riêng biệt, viết cho
, v.v. SSM thời gian rời rạc có dạng
trong đó ma trận và có nguồn gốc từ (T1) và (O2) trong khi phương sai của được đưa ra bởi
với điều kiệnαkα(tk)αk+1yk=Tkαk+η⋆k=Zkαk+εk(DT)
TkQ⋆k:=Var(η⋆k)εkHk=H⋆dk+1ykTk=exp{δkMột}=[ 1 δ 1 kkhông thiếu Sử dụng một số đại số, chúng ta có thể tìm thấy ma trận chuyển tiếp cho SSM
trong đó cho . Tương tự ma trận hiệp phương sai cho SSM thời gian rời rạc có thể được cung cấp dưới dạng
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
trong đó các chỉ số và nằm trong khoảng từ đến .ij1m
Bây giờ để thực hiện tính toán trong R, chúng ta cần một gói dành riêng cho KF và chấp nhận các mô hình thay đổi theo thời gian; gói CRAN KFAS có vẻ là một lựa chọn tốt. Chúng ta có thể viết các hàm R để tính toán các ma trận
và từ vectơ của thời gian
để mã hóa SSM (DT). Trong các ký hiệu được sử dụng bởi gói, một ma trận sẽ nhân lên tiếng ồn
trong phương trình chuyển tiếp của (DT): chúng tôi lấy nó ở đây để làm danh tính . Cũng lưu ý rằng một hiệp phương sai ban đầu khuếch tán phải được sử dụng ở đây.TkQ⋆ktkRkη⋆kIm
EDIT Các như ban đầu được viết là sai. Đã sửa lỗi (cũng như mã R và hình ảnh).Q⋆
CF Ansley và R. Kohn (1986) "Về sự tương đương của hai phương pháp tiếp cận ngẫu nhiên để làm mịn Spline" J. Appl. Con mồi , 23, trang 391 Hàng405
R. Kohn và CF Ansley (1987) "Một thuật toán mới để làm mịn Spline dựa trên việc làm mịn một quá trình ngẫu nhiên" SIAM J. Sci. và Stat. Tính toán. , 8 (1), trang 33
J. Helske (2017). "KFAS: Mô hình không gian nhà nước gia đình theo cấp số nhân trong R" J. Stat. Mềm mại. , 78 (10), trang 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
có thể tính toán các công cụ phái sinh và có lẽ bạn có thể sử dụng điều này như một điểm khởi đầu để phù hợp với dữ liệu bằng một số phương pháp nghịch đảo? Tôi quan tâm để tìm hiểu giải pháp cho việc này.