हम यह वर्णन करेंगे कि एक स्टेट-स्पेस मॉडल (SSM) के संबंध में कलमन फ़िल्टरिंग (KF) तकनीकों के माध्यम से एक तख़्ता कैसे इस्तेमाल किया जा सकता है। तथ्य यह है कि कुछ तटरेखा मॉडल का प्रतिनिधित्व एसएसएम द्वारा किया जा सकता है और केएफ के साथ गणना सीएफ अंसले और आर। कोहन द्वारा 1980-1990 के वर्षों में की गई थी। अनुमानित कार्य और इसके व्युत्पन्न अवलोकनों पर राज्य की सशर्त अपेक्षाएं हैं। इन अनुमानों को एक एसएसएम का उपयोग करते समय एक निश्चित अंतराल चौरसाई , एक नियमित कार्य का उपयोग करके गणना की जाती है ।
सादगी के लिए, मान लेते हैं कि टिप्पणियों समय पर किया जाता है और उस अवलोकन संख्या में
केवल शामिल एक आदेश के साथ व्युत्पन्न में
। के रूप में मॉडल राईट के अवलोकन के भाग
जहां अप्रत्यक्ष अर्थ है सच समारोह और व्युत्पत्ति क्रम आधार पर
विचरण साथ एक गाऊसी त्रुटि है । (निरंतर समय) संक्रमण समीकरण सामान्य रूप लेता है
t1<t2<⋯<tnktkघ कश्मीर { 0 ,dk{0,1,2}y(tk)=f[dk](tk)+ε(tk)(O1)
f(t)ε ( टी कश्मीर ) एच ( टी कश्मीर ) घ कश्मीरε(tk)H(tk)dkddtα(t)=Aα(t)+η(t)(T1)
α(टी)η(टी)क्यूε(टीकश्मीर)मीटरα(टी):=[च(टी),
जहाँ बिना स्टेट वेक्टर है और
एक गौसियन व्हाइट शोर है जिसमें सहसंयोजक , जिसे स्वतंत्र माना जाता है अवलोकन शोर r.vs । एक का वर्णन करने के लिए, हम
पहला व्युत्पत्ति, यानी को स्टैक करके प्राप्त की गई स्थिति पर विचार करते हैं । संक्रमण है
α(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)⎤⎦⎥⎥⎥⎥⎥⎥⎥
2मीटर2मीटर-1m=2>1 y ( t k )
और फिर हमें ऑर्डर (और डिग्री
) के साथ एक बहुपद का पता । जबकि सामान्य घन रेखा से मेल खाता है,2m2m−1m=2>1। एक शास्त्रीय SSM औपचारिकता से चिपके रहने के लिए हम (O1) को
जहां अवलोकन मैट्रिक्स में उपयुक्त व्युत्पन्न उठाता और विचरण की
के आधार पर चुना जाता है । So जहां ,
और । इसी तरह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 एच ⋆ 1 एच ⋆ 2 एच ⋆ 3तीन ,
, और । H⋆1H⋆2H⋆3
हालांकि संक्रमण निरंतर समय में है, केएफ वास्तव में एक मानक असतत समय है। वास्तव में, हम अभ्यास में समय पर ध्यान केंद्रित करेंगे जहां हमारे पास एक अवलोकन है, या जहां हम डेरिवेटिव का अनुमान लगाना चाहते हैं। हम सेट ले जा सकते हैं बार के इन दो सेटों के मिलन हो सकता है और लगता है कि कम से अवलोकन करने के लिए लापता जा सकता है: इस अनुमान लगाने के लिए अनुमति देता है किसी भी समय डेरिवेटिव
एक अवलोकन के अस्तित्व की परवाह किए बिना। असतत एसएसएम प्राप्त करने के लिए बनी हुई है।t{tk}tkmtk
हम असतत समय के लिए सूचकांकों का उपयोग करेंगे, लिए
और इतने पर । असतत-समय एसएसएम फॉर्म
जहां मैट्रिक्स और से व्युत्पन्न (T1) और (O2) हैं, जबकि का विचरण द्वारा दिया जाता है
ने उस प्रदान कियाαkα(tk)αk+1yk=Tkαk+η⋆k=Zkαk+εk(DT)
TkQ⋆k:=Var(η⋆k)εkHk=H⋆dk+1ykटीकश्मीर=exp{δकश्मीरएक}=[ 1 δ 1 कश्मीरगायब नहीं है। कुछ बीजगणित का उपयोग करके हम असतत-समय SSM लिए संक्रमण मैट्रिक्स पा सकते हैं
जहां के लिए । इसी तरह covariance मैट्रिक्स असतत समय के लिए 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
अब आर में गणना करने के लिए हमें केएफ को समर्पित पैकेज और समय-भिन्न मॉडल को स्वीकार करने की आवश्यकता है; CRAN पैकेज KFAS एक अच्छा विकल्प लगता है। हम
SSM (DT) को एनकोड करने के लिए के वेक्टर से matrices और गणना करने के लिए R फ़ंक्शन लिख सकते हैं
। पैकेज द्वारा उपयोग किए जाने वाले नोटेशन में, एक मैट्रिक्स शोर को (DT) के संक्रमण समीकरण में गुणा करने के लिए आता है
: हम इसे पहचान । यह भी ध्यान दें कि एक फैलाना प्रारंभिक सहसंयोजक का उपयोग यहां किया जाना चाहिए।TkQ⋆ktkRkη⋆kIm
संपादित करें शुरू में लिखा के रूप में गलत था। फिक्स्ड (आर कोड और छवि में भी)।Q⋆
सीएफ अंसले और आर। कोहन (1986) "टू स्टोचस्टिक एप्रोच टू द स्पलाइन स्मूथिंग" जे। एपल। Probab। , 23, पीपी 391-405
आर। कोह्न और सीएफ अंसले (1987) "एक नया एल्गोरिथ्म स्पलाइन स्मूथिंग फॉर स्मूथिंग अ स्टोचैस्टिक प्रोसेस" सियाम जे। साइंस। और स्टेट। कंप्यूटर। , 8 (1), पीपी। 33-48
जे। हेल्स्के (2017)। "KFAS: एक्सपोनेंशियल फैमिली स्टेट स्पेस मॉडल इन आर" जे स्टेट। मुलायम। , 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
डेरिवेटिव की गणना कर सकते हैं और संभवत: आप इसे कुछ उलटा तरीकों का उपयोग करके डेटा को फिट करने के लिए एक शुरुआती बिंदु के रूप में उपयोग कर सकते हैं? मुझे इसका हल सीखने में दिलचस्पी है।