เราจะอธิบายถึงวิธีใช้ spline ผ่านเทคนิคการกรอง Kalman (KF) ที่สัมพันธ์กับแบบจำลองพื้นที่รัฐ (SSM) ความจริงที่ว่าบางรุ่น spline สามารถแสดงโดย SSM และคำนวณด้วย KF ถูกเปิดเผยโดย CF Ansley และ R. Kohn ในปี 1980-1990 ฟังก์ชั่นโดยประมาณและอนุพันธ์ของมันคือความคาดหวังของรัฐตามเงื่อนไขในการสังเกต การประมาณเหล่านี้คำนวณโดยใช้ช่วงเวลาคงที่แบบคงที่ซึ่งเป็นงานประจำเมื่อใช้ SSM
เพื่อความเรียบง่ายสมมติว่าการสังเกตเกิดขึ้นในบางครั้งและหมายเลขการสังเกตที่
เกี่ยวข้องกับอนุพันธ์เพียงหนึ่งเดียวที่มีคำสั่งใน
. ส่วนการสังเกตของแบบจำลองเขียนเป็น
โดยที่หมายถึงฟังก์ชั่นที่ไม่ได้ตรวจสอบจริงและ
เป็นข้อผิดพลาดเสียนกับความแปรปรวนทั้งนี้ขึ้นอยู่กับการสั่งซื้อมาd_kสมการการเปลี่ยนภาพ (เวลาต่อเนื่อง) ใช้รูปแบบทั่วไป
t1<t2<⋯<tnktkd k { 0 ,dk{0,1,2}y(tk)=f[dk](tk)+ε(tk)(O1)
f(t)ε(tk)H(tk)dkε(tk)H(tk)dkddtα(t)=Aα(t)+η(t)(T1)
โดยที่เป็นสถานะเวกเตอร์ที่ไม่มีผู้ควบคุมและ
เป็นเสียงเกาส์สีขาวที่มีความแปรปรวนร่วมกับซึ่งสันนิษฐานว่าเป็นอิสระจาก สังเกตเสียง r.vs(t_k) เพื่อที่จะอธิบายเส้นโค้งเราพิจารณาสถานะที่ได้จากการซ้อน
อนุพันธ์แรกคือ F การเปลี่ยนแปลงคือ
α(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 ) 2m2m−1m=2>1. เพื่อที่จะยึดมั่นในพิธีการ SSM แบบดั้งเดิมเราสามารถเขียน (O1) เป็น
ที่สังเกตเมทริกซ์หยิบอนุพันธ์ที่เหมาะสมในและความแปรปรวนของ
ได้รับการแต่งตั้งขึ้นอยู่กับd_kดังนั้นโดยที่ ,
และdots] ในทำนองเดียวกันy(tk)=Z(tk)α(tk)+ε(tk),(O2)
Z(tk)α(tk)H(tk)k(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 ⋆ 3สามแปรปรวน ,
และH H⋆1H⋆2H⋆3
แม้ว่าช่วงการเปลี่ยนภาพจะอยู่ในช่วงเวลาต่อเนื่อง แต่แท้จริงแล้ว KF เป็นช่วงเวลาไม่ต่อเนื่องมาตรฐานหนึ่งช่วงเวลา อันที่จริงเราจะมุ่งเน้นในการปฏิบัติในครั้งที่เรามีการสังเกตหรือที่เราต้องการที่จะประเมินสัญญาซื้อขายล่วงหน้า เราสามารถใช้ setเป็นสหภาพของทั้งสองชุดและสมมติว่าการสังเกตที่อาจหายไป: สิ่งนี้ช่วยให้การประเมินอนุพันธ์ได้ทุกเวลา
โดยไม่คำนึงถึงการมีอยู่ของการสังเกต ยังคงมีการสืบทอด SSM แบบแยกt{tk}tkmtk
เราจะใช้ดัชนีสำหรับเวลาที่ไม่ต่อเนื่องเขียนสำหรับ
เป็นต้น SSM แบบไม่ต่อเนื่องใช้รูปแบบ
โดยที่เมทริกซ์และมาจาก (T1) และ (O2) ในขณะที่ความแปรปรวนของมอบให้โดย
ระบุว่าαkα(tk)αk+1yk=Tkαk+η⋆k=Zkαk+εk(DT)
TkQ⋆k:=Var(η⋆k)εkHk=H⋆dk+1ykTk=ประสบการณ์{δk}=[ 1 δ 1 kไม่ได้หายไป การใช้พีชคณิตเราสามารถหาเมทริกซ์การเปลี่ยนสำหรับ SSM
ที่สำหรับ<n ในทำนองเดียวกันเมทริกซ์ความแปรปรวนร่วมสำหรับ SSM แบบไม่ต่อเนื่องสามารถให้เป็น
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
ที่ดัชนีและอยู่ระหว่างและม.ij1m
ตอนนี้เพื่อดำเนินการคำนวณใน R เราต้องการแพ็คเกจที่อุทิศให้กับ KF และยอมรับโมเดลที่เปลี่ยนแปลงตามเวลา แพคเกจ CRAN KFASดูเหมือนว่าตัวเลือกที่ดี เราสามารถเขียนฟังก์ชัน R เพื่อคำนวณเมทริกซ์
และจากเวกเตอร์ของเวลา
เพื่อเข้ารหัส SSM (DT) ในสัญกรณ์ที่ใช้โดยแพ็คเกจเมทริกซ์จะทวีคูณเสียงรบกวน
ในสมการการเปลี่ยนภาพของ (DT): เราใช้ที่นี่เพื่อเป็นตัวตนI} โปรดทราบว่าจะต้องใช้ความแปรปรวนเริ่มต้นแบบกระจายที่นี่TkQ⋆ktkRkη⋆kIm
แก้ไขตามที่เขียนไว้ในตอนแรกเป็นเรื่องที่ผิด คงที่ (เช่นในรหัส R และภาพ)Q⋆
CF Ansley และ R. Kohn (1986) "ในความเท่าเทียมกันของสองวิธี Stochastic เพื่อ Spline Smoothing" J. Appl. Probab , 23, pp. 391–405
R. Kohn และ CF Ansley (1987) "อัลกอริธึมใหม่สำหรับการปรับให้เรียบของ Spline โดยใช้กระบวนการ Stochastic ที่ทำให้เรียบ" SIAM J. Sci และสถิติ คอมพิวเต , 8 (1), pp. 33–48
J. Helske (2017) "KFAS: โมเดลสภาวะพื้นที่ครอบครัวแบบเอ็กซ์โพเนนเชียลใน R" J. Stat อ่อนนุ่ม. , 78 (10), pp. 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
สามารถคำนวณอนุพันธ์และสันนิษฐานว่าคุณสามารถใช้สิ่งนี้เป็นจุดเริ่มต้นเพื่อให้พอดีกับข้อมูลโดยใช้วิธีการผกผัน? ฉันสนใจที่จะเรียนรู้วิธีแก้ปัญหานี้