Làm cách nào tôi có thể khớp một spline với dữ liệu có chứa các giá trị và các đạo hàm 1/2?


13

Tôi có một bộ dữ liệu có chứa, giả sử, một số phép đo cho vị trí, tốc độ và gia tốc. Tất cả đều đến từ cùng một "cuộc chạy". Tôi có thể xây dựng một hệ thống tuyến tính và phù hợp với đa thức cho tất cả các phép đo đó.

Nhưng tôi có thể làm tương tự với splines không? Cách 'R' để làm điều này là gì?

Đây là một số dữ liệu mô phỏng tôi muốn phù hợp:

f <- function(x) 2+x-0.5*x^2+rnorm(length(x), mean=0, sd=0.1)
df <- function(x) 1-x+rnorm(length(x), mean=0, sd=0.3)
ddf <- function(x) -1+rnorm(length(x), mean=0, sd=0.6)

x_f <- runif(5, 0, 5)
x_df <- runif(8, 3, 8)
x_ddf <- runif(10, 4, 9)

data <- data.frame(type=rep('f'), x=x_f, y=f(x_f))
data <- rbind(data, data.frame(type=rep('df'), x=x_df, y=df(x_df)))
data <- rbind(data, data.frame(type=rep('ddf'), x=x_ddf, y=ddf(x_ddf)))

library(ggplot2)
ggplot(data, aes(x, y, color=type)) + geom_point()


library(splines)
m <- lm(data$y ~ bs(data$x, degree=6)) # but I want to fit on f, df, ddf. possible?

enter image description here


Tôi không biết câu trả lời cho câu hỏi của bạn nhưng splinefuncó 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.
David LeBauer

1
Vấn đề này đã được Maurice Cox giải quyết trong bài viết năm 1972 của ông. Tôi không biết nếu R hỗ trợ nó, nhưng thuật ngữ tìm kiếm là "Hermite splines".
user14717

@DavidLeBauer đây là những gì tôi đang làm. Tôi đã chính thức hóa một vấn đề tối ưu hóa phù hợp với một số điểm sao cho spline và các dẫn xuất của nó xấp xỉ dữ liệu. Nhưng một phương pháp trực tiếp hơn sẽ là tuyệt vời.
dani

3
Một cách tiếp cận khá chuẩn là thông qua lọc Kalman. Trạng thái (không quan sát được) chứa các dẫn xuất chính xác và các quan sát là các phiên bản ồn ào của chúng. Ví dụ, mô hình cho một spline hình khối cho biết rằng đạo hàm bậc hai là một nhiễu trắng (thời gian liên tục), nhưng cũng có thể sử dụng mô hình bậc cao hơn. Bạn sẽ phải mô tả tiếng ồn đo tùy thuộc vào thứ tự đạo hàm cho quan sát hiện tại. Ba phương sai nhiễu (được ước tính) có thể là đủ trong cách tiếp cận đầu tiên.
Yves

2
lỗi đo lường trên dẫn xuất là gì? nó có cao hơn nhiều so với vị trí không? cũng trong cốt truyện của bạn tại sao điểm arent phù hợp? trục x là gì?
Aksakal

Câu trả lời:


8

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ư

(O1)y(tk)=f[dk](tk)+ε(tk)
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
(T1)ddtα(t)=Aα(t)+η(t)
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[m1](t)]
[f[1](t)f[2](t)f[m1](t)f[m](t)]=[010001100][f(t)f[1](t)f[m2](t)f[m1](t)]+[000η(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,2m2m1m=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ự
(O2)y(tk)=Z(tk)α(tk)+ε(tk),
Z(tk)α(tk)H(tk)ε(tk)dkZ(tk)=Zdk+1Z1:=[1,0,,0]Z2:=[0,1,0]Z3:=[0,0,1,0,]H(tk)=Hdk+1 H 1 H 2 H 3cho ba phương sai , và . H1H2H3

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)

(DT)αk+1=Tkαk+ηkyk=Zkαk+εk
TkQk:=Var(ηk)εkHk=Hdk+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}=[1δk11!δk22!δkm1(m1)!01δk11!δk11!01],

δk:=tk+1tkk<nQk=Var(ηk)
Qk=ση2[δk2mij+1(mi)!(mj)!(2mij+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.TkQktkRkη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

làm mịn bằng dẫn xuất

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)
}

Cảm ơn về câu trả lời của bạn. Tôi rất thích nó. Hiện tại, bạn không cho phép có giá trị fvà đạo hàm của nó được sử dụng ở một số nhất định t. Là làm thế nào có thể sử dụng tất cả các thông tin? Một lần nữa, merci cho câu trả lời của bạn.
dani

Tôi đọc được rằng mọi thứ bên dưới T1 là về việc sử dụng nhiều dẫn xuất trong cùng một quy trình suy luận. Yves có thể xác nhận mặc dù.
eric_kernfeld

Thật vậy, bạn có thể sử dụng các dẫn xuất nói cho một : quan sát sau đó là một vectơ và có các hàng chọn các đạo hàm mong muốn. Tôi chắc chắn rằng một hoạt động với KFAS , nhưng bằng cách sử dụng NA, có thể có thời gian thay đổi là tốt. t k y k Z k o k o > 1 ook>1tkykZkoko>1o
Yves

@Yves Tôi có hiểu đúng về bạn không: Nếu tôi có đạo hàm thứ nhất và thứ hai tại điểm trong t_k, thì Z_k trông như thế này : matrix(c(0,0,0, 0,1,0, 0,0,1), nrow=length(d_k), ncol=m, byrow = T). Vì vậy, về tổng thể, nó sẽ là một khối có kích thước 'đạo hàm cao nhất' * 'độ spline' * '# của các bước thời gian'
dani

Có @dani, gần: số lượng hàng cho tất cả các ma trận là tức là trong ví dụ. Đây là thứ tự phái sinh cao nhất cộng với một. Ngoài ra, mức độ của spline là , không phải . Trong ví dụ của bạn vì bạn không quan sát đạo hàm của lệnh (chính hàm) nên nó được đặt thành trong các quan sát và bạn cũng có thể thả hàng đầu tiên. Tuy nhiên, tôi nghi ngờ rằng trong trường hợp cụ thể này, vấn đề không được đặt ra, SSM có thể không quan sát được . max k { d k +1}32m-1m0Zkmaxk{dk+1}32m1m0NA
Yves

4

Bạn có thể làm tốt một cách ngoạn mục với thói quen bình phương tối thiểu tiêu chuẩn, miễn là bạn có ý tưởng hợp lý về kích thước tương đối của các lỗi ngẫu nhiên được thực hiện cho mỗi đạo hàm. Không có giới hạn về số lượng phép đo bạn thực hiện cho mỗi giá trị - thậm chí bạn có thể đo đồng thời các dẫn xuất khác nhau ở mỗi giá trị. Giới hạn duy nhất trong việc sử dụng Bình phương tối thiểu thông thường (OLS) là thông thường: bạn cho rằng các phép đo là độc lập.x

Ý tưởng cơ bản có thể được thể hiện rõ nhất bằng cách trừu tượng hóa vấn đề. Mô hình của bạn sử dụng một tập hợp các hàm (chẳng hạn như bất kỳ cơ sở spline nào) làm cơ sở để dự đoán các giá trị của một hàm chưa biết tại các điểm Điều này có nghĩa là bạn tìm cách ước tính các hệ số mà mỗi kết hợp tuyến tính xấp xỉ chấp nhận được Chúng ta hãy gọi không gian (vectơ) này của các kết hợp tuyến tínhpfj:RR, j=1,2,,pyi=f(xi)f(x1,x2,,xn).βjjβjfj(xi)yi.F.

Điều đặc biệt về vấn đề này là bạn không nhất thiết phải quan sátyi. Thay vào đó, có một tập hợp các hàm tuyến tính được xác định liên kết với dữ liệu. Hãy nhớ rằng một hàm là một "hàm của hàm:" mỗi gán một số cho bất kỳ hàm Mô hình đặt ra rằngLiLiLi[f]fF.

(1)yi=Li[f]+σiεi

Trong đó là các hàm đã cho, là các yếu tố tỷ lệ đã biết và là các biến ngẫu nhiên độc lập và phân phối giống hệt nhau.Liσi>0εi

Hai giả định bổ sung làm cho OLS có thể áp dụng và có ý nghĩa thống kê:

  1. Phân phối chung của có phương sai hữu hạn.εi

  2. Mỗi là một hàm tuyến tính . Hàm là tuyến tính khi cho bất kỳ phần tử nào và các số tương ứngLiLfjFαj,

    L[jαjfj]=jαjL[fj].

(2) cho phép mô hình được thể hiện rõ ràng hơn như(1)

yi=β1Li[f1]++βpLi[fp]+σiεi.

Điểm chung của việc giảm này là do bạn đã quy định tất cả các hàm tất cả các hàm cơ bản và độ lệch chuẩn các giá trị đều là các số - -these chỉ là "biến" hoặc "tính năng" thông thường của vấn đề hồi quy - và chỉ là trọng số (tương đối). Do đó, theo nghĩa tối ưu của Định lý Gauss-Markov, OLS là một thủ tục tuyệt vời để sử dụng.Li,fj,σi,Li[fj]σi

Các chức năng liên quan đến câu hỏi như sau:

  • Đánh giá tại một điểm xác định Đây là những gì chúng ta thường làm. Đây là tuyến tính bởi vì, theo định nghĩa, các tổ hợp tuyến tính của các hàm được đánh giá theo điểm.fx: L[f]=f(x).

  • Đánh giá đạo hàm tại một điểm xác định Đây là tuyến tính vì sự khác biệt là tuyến tính.fx: L[f]=f(x).

  • Đánh giá đạo hàm thứ hai tại một điểm được chỉ địnhfx: L[f]=f(x).


Được rồi, cách tiếp cận này hoạt động tốt như thế nào? Như thường lệ, chúng tôi sẽ nghiên cứu phần dư so sánh các giá trị được trang bị với các giá trị quan sát được. Vì các vị trí, vận tốc và gia tốc đều ở các đơn vị khác nhau, nên chúng phải được vẽ trên các trục riêng biệt.y^iyiy^i

Nhân vật

Hàng trên cùng sử dụng các đường cong để vẽ đồ thị và hai đạo hàm đầu tiên của nó. Các điểm dữ liệu có liên quan được vẽ trên các đường cong: các giá trị quan sát ở bên trái, các đạo hàm quan sát ở giữa và quan sát các đạo hàm thứ hai ở bên phải.y^

Hàng dưới cùng vẽ các phần dư tương ứng. Như thường lệ, chúng tôi đang tìm kiếm sự thiếu vắng bất kỳ mối quan hệ đáng giá nào: chúng tôi hy vọng các giá trị còn lại (tọa độ y của chúng) thay đổi ngẫu nhiên từ trái sang phải, thể hiện sự độc lập và không có xu hướng.

Các giá trị dữ liệu được tạo chính xác như trong câu hỏi (sau khi đặt hạt giống số ngẫu nhiên thành 17 bằng cách sử dụng cho độ tái lập). Tôi đã khám phá sự phù hợp bằng cách sử dụng khoảng trắng B-spline được tạo bởi hàm , cũng như trong câu hỏi, từ độ 1 đến 6. Hình này cho thấy kết quả cho mức độ 2, là mức độ thấp nhất (đó là mô hình đơn giản nhất) thể hiện AIC thấp và hành vi dư tốt, cũng như mô hình được biểu thị bằng ANOVA của tất cả sáu mô hình (lồng nhau).n=23set.seed(17)FRbs

Phù hợp là

y^=27.48993+2.54078f1+2.97679f2

trong đó và là các hàm cơ sở B-spline được tạo bởi .f1f2bs

Những người còn lại cư xử tốt. Các phù hợp là tốt. Hơn nữa, cách tiếp cận này tìm thấy mô hình chính xác : dữ liệu thực sự được tạo ra từ một hàm bậc hai (độ 2). Hơn nữa, độ lệch chuẩn của phần dư là về kích thước phù hợp: 0,11, 0,20 và 0,61 so với 0,1, 0,3 và 0,6 được sử dụng để tạo ra các lỗi ban đầu. Điều đó khá tuyệt vời khi những đường cong này rõ ràng ngoại suy các quan sát (không vượt quá ) và sử dụng một tập dữ liệu nhỏ như vậy ( ).x=5n=23

Cuối cùng, phần dư cho phù hợp cho các spline mức độ cao hơn là giống nhau về chất; họ chỉ thực hiện những cải tiến nhỏ với chi phí sử dụng các mô hình ít hợp lý hơn. Đối với các mức độ đủ cao, chẳng hạn, chúng bắt đầu dao động dữ dội cho các giá trị nhỏ của giữa các giá trị được quan sát, ví dụ. Để minh họa hành vi (xấu) này, đây là mức độ 9 phù hợp:x

Hình 2

Cuối cùng, đây là một ví dụ trong đó nhiều quan sát về các chức năng tuyến tính khác nhau của cơ sở đã được thực hiện. Mã để tạo ra các quan sát này đã được thay đổi từ đó trong câu hỏi thành

mult <- 2
x_f <- rep(runif(5, 0, 5), mult)       # Two observations per point
x_df <- rep(runif(8, 3, 8), mult)      # Two derivatives per point
x_ddf <- c(x_df, rep(runif(10, 4, 9))  # Derivative and acceleration per point

Hình 3


Các Rmã cho mang những tính toán này là khá chung. Cụ thể, nó sử dụng phân biệt số để tìm các đạo hàm sao cho nó không phụ thuộc vào loại spline được sử dụng. Nó xử lý các giá trị khác nhau của bằng cách cân trọng lượng các quan sát theo tỷ lệ Nó tự động xây dựng và phù hợp với một tập hợp các mô hình trong một vòng lặp. Các hàm tuyến tính và độ lệch chuẩn được mã hóa cứng. Có ba trong số đó, được chọn theo giá trị của biến trong bộ dữ liệu.σi1/σi2.Liσitype

Như các ví dụ về cách bạn có thể sử dụng phù hợp, coda in tóm tắt, danh sách AIC của họ và ANOVA của tất cả chúng.

#
# Estimate spline derivatives at points of `x`.
#
d <- function(x, s, order=1) {
  h <- diff(range(x, na.rm=TRUE))
  dh <- h * 1e-4
  lags <- seq(-order, order, length.out=order+1) * dh/2
  b <- choose(order, 0:order) * (-1)^(order:0)
  y <- b %*% matrix(predict(s, c(outer(lags, x, `+`))), nrow=length(lags))
  y <- matrix(y / (dh^order), nrow=length(x))
}
#
# Fit and plot models by degree.
#
data$order <- c(f=0, df=1, ddf=2)[data$type]
k <- max(data$order)
x <- data$x
w <- (c(0.1, 0.3, 0.6)^(-2))[data$order+1] # As specified in the question

fits <- lapply(1:6, function(deg) {
  #
  # Construct a model matrix.
  #
  s <- bs(x, degree=deg, intercept=TRUE)
  X.l <- lapply(seq.int(k+1)-1, function(i) {
    X <- subset(data, order==i)
    Y <- as.data.frame(d(X$x, s, order=i))
    cbind(X, Y)
  })
  X <- do.call("rbind", X.l)
  #
  # Fit WLS models.
  #
  f <- as.formula(paste("y ~ -1 +", paste0("V", 0:deg+1, collapse="+")))
  fit <- lm(f, X, weights=w)
  msr <- tapply(residuals(fit), data$order, function(r) {
    k <- length(r) - 1 - deg
    ifelse(k >= 1, sum(r^2) / k, 1)
  })
  #
  # Compute predicted values along the graphs.
  #
  X.new <- data.frame(x = seq(min(X$x), max(X$x), length.out=101))
  X.new$y.hat <- predict(s, X.new$x) %*% coefficients(fit)
  X.new$Dy.hat <- d(X.new$x, s, 1) %*% coefficients(fit)
  X.new$DDy.hat <- d(X.new$x, s, 2) %*% coefficients(fit)
  X$Residual <- residuals(fit)
  #
  # Return the model.
  #
  fit$msr <- msr
  fit
})
lapply(fits, function(f) sqrt(f$msr))
lapply(fits, summary)
lapply(fits, AIC)
do.call("anova", fits)

1

Trước hết, tôi muốn cảm ơn bạn đã đặt ra câu hỏi này. Đó là một câu hỏi thực sự thú vị. Tôi yêu splines và những điều tuyệt vời bạn có thể làm với chúng. Và điều này đã cho tôi một cái cớ để thực hiện một số nghiên cứu. :-)

BLUF: Câu trả lời ngắn gọn là không. Tôi không biết bất kỳ chức năng nào trong R sẽ tự động làm điều này cho bạn. Câu trả lời dài là ... phức tạp hơn nhiều. Việc các đạo hàm và giá trị hàm không được lấy mẫu ở cùng một nơi làm cho điều này trở nên khó khăn hơn. Và việc bạn không có giá trị hàm ở gần cuối bên phải của khoảng có thể làm cho điều đó là không thể.

Hãy bắt đầu với spline khối. Cho các điểm và các đạo hàm thứ hai tương ứng , spline hình khối đi qua chúng là:(xj,yj)zj

Sj(x)=Ayj+Byj+1+Czj+Dzj+1
trong đó Thật đơn giản để xác minh rằng , , và . Điều này đảm bảo rằng spline và đạo hàm thứ hai của nó là liên tục. Tuy nhiên, tại thời điểm này, chúng tôi không có đạo hàm đầu tiên liên tục . Để bắt buộc đạo hàm đầu tiên phải liên tục, chúng ta cần các ràng buộc sau:
hj=xj+1xjA=xj+1xhjB=1AC=16(A3A)hj2D=16(B3B)hj2
Sj(xj)=yjSj(xj+1)=yj+1Sj(xj)=zjSj(xj+1)=zj+1
(1)6hj1yj1(6hj1+6hj)yj+6hjyj+1=hj1zj1+2(hj1+hj)zj+hjzj+1
Trong thiết lập spline hình khối cổ điển, bạn giả sử bạn có các điểm và sử dụng phương trình (cùng với hai ràng buộc biên bổ sung) để giải quyết cho . Khi bạn biết , spline được chỉ định đầy đủ và bạn có thể sử dụng nó để nội suy tại bất kỳ điểm tùy ý nào. Là một phần thưởng bổ sung, phương trình chuyển sang ma trận ba cực có thể được giải trong thời gian tuyến tính!(xj,yj)(1)zjzj(1)

OK, bây giờ giả sử rằng, thay vì biết , bạn biết . Bạn có thể sử dụng phương trình để giải cho không? Từ quan điểm đại số thuần túy, có vẻ khả thi. Có phương trình và chưa biết, vậy ... tại sao không? Nhưng hóa ra bạn không thể; ma trận sẽ là số ít. Và điều đó sẽ không gây ngạc nhiên. Làm thế nào bạn có thể nội suy các giá trị hàm được đưa ra CHỈ các đạo hàm thứ hai? Ít nhất, bạn sẽ cần một giá trị ban đầu, giống như một phương trình vi phân.yjzj(1)yjNN

Còn tình hình của bạn thì sao? Một số điểm của bạn có giá trị hàm và một số điểm của bạn có đạo hàm. Hiện tại, chúng ta hãy bỏ qua các dẫn xuất đầu tiên (chúng là một mớ hỗn độn để giải quyết trong cơ sở spline hình khối). Chính thức, hãy để là tập hợp các điểm có giá trị hàm và là tập hợp các điểm có đạo hàm thứ hai. Chúng ta vẫn có phương trình với ẩn số. Chỉ là một số ẩn số là và một số là . Hóa ra bạn sẽ nhận được một giải pháp nếu 0, 1 hoặc 2 VÀ hoặc(xi,yi),iI(xj,zj),jJNNyjzjIN3,N2N1I. Nói cách khác, một trong ba điểm đầu tiên phải là giá trị hàm VÀ một trong ba điểm cuối phải là giá trị hàm. Khác với ràng buộc đó, bạn có thể tự do đưa ra nhiều công cụ phái sinh như bạn muốn.

Làm thế nào về những dẫn xuất đầu tiên? Chắc chắn có thể bao gồm các dẫn xuất đầu tiên trong spline của bạn. Nhưng, như tôi đã nói, nó trở nên rắc rối hơn rất nhiều. Đạo hàm đầu tiên của spline được cho bởi: Tất nhiên, chúng tôi chỉ thực sự quan tâm đến đạo hàm tại các nút thắt, vì vậy chúng tôi có thể đơn giản hóa điều này một chút bằng cách đánh giá nó tại : Bạn có thể thêm những thứ này các ràng buộc đối với ma trận bạn nhận được từ phương trình

Sj(x)=yj+1yjhj3A216hjzj+3B216hjzj+1
xj
Sj(xj)=yj+1yjhj13hjzj16hjzj+1
(1)và spline kết quả sẽ có các dẫn xuất đầu tiên được chỉ định. Ngoài ra, điều này sẽ giúp với vấn đề ma trận số ít. Bạn sẽ nhận được giải pháp nếu bạn có EITHER một giá trị hàm hoặc đạo hàm đầu tiên trong ba điểm đầu tiên và ba điểm cuối cùng.

Vì vậy, tôi kết hợp tất cả lại với nhau trong một số mã và đây là hình ảnh tôi có:

Spline đi sai lầm khủng khiếp.

Như bạn có thể thấy, kết quả không tuyệt vời. Đó là bởi vì đây là một spline thông thường phải tôn vinh TẤT CẢ dữ liệu. Vì dữ liệu là ngẫu nhiên, chúng tôi thực sự cần sử dụng một spline hồi quy. Đó là một chủ đề cho một bài viết khác. Nhưng nếu bạn làm việc thông qua toán học, cuối cùng bạn sẽ tối ưu hóa hàm mục tiêu bậc hai chịu các ràng buộc đẳng thức tuyến tính - và có một giải pháp dạng đóng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.