ฉันจะใส่ข้อมูลที่มีค่าและอนุพันธ์อันดับที่ 1/2 ได้อย่างไร


14

ฉันมีชุดข้อมูลที่ประกอบด้วยกล่าวคือการวัดตำแหน่งความเร็วและความเร่ง ทั้งหมดมาจาก "การทำงาน" ที่เหมือนกัน ฉันสามารถสร้างระบบเชิงเส้นและพอดีกับพหุนามกับการวัดทั้งหมด

แต่ฉันสามารถทำเช่นเดียวกันกับเส้นโค้ง? วิธี 'R' ในการทำเช่นนี้คืออะไร?

นี่คือข้อมูลจำลองที่ฉันต้องการให้มี:

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?

ป้อนคำอธิบายรูปภาพที่นี่


ฉันไม่ทราบคำตอบสำหรับคำถามของคุณ แต่splinefunสามารถคำนวณอนุพันธ์และสันนิษฐานว่าคุณสามารถใช้สิ่งนี้เป็นจุดเริ่มต้นเพื่อให้พอดีกับข้อมูลโดยใช้วิธีการผกผัน? ฉันสนใจที่จะเรียนรู้วิธีแก้ปัญหานี้
David LeBauer

1
ปัญหานี้ได้รับการแก้ไขโดย Maurice Cox ในกระดาษ 1972 ของเขา ฉันไม่รู้ว่า R รองรับหรือไม่ แต่คำค้นหาคือ "Hermite splines"
user14717

@DavidLeBauer นี่คือสิ่งที่ฉันกำลังทำอยู่ ฉันทำให้ปัญหาการหาค่าเหมาะที่สุดที่เหมาะกับจุดต่าง ๆ เป็นจำนวนมากอย่างอิสระ แต่วิธีการที่ตรงกว่านั้นก็ดี
dani

3
วิธีการมาตรฐานค่อนข้างผ่านการกรองคาลมาน สถานะ (ไม่สามารถสังเกตเห็นได้) มีอนุพันธ์ที่แน่นอนและการสังเกตเป็นสิ่งที่มีเสียงดังของสิ่งเหล่านี้ ยกตัวอย่างเช่นตัวแบบสำหรับลูกบาศก์อิสระบอกว่าลำดับที่สองคืออนุพันธ์ (เวลาต่อเนื่อง) เสียงสีขาว แต่แบบจำลองลำดับสูงกว่าก็สามารถใช้ได้เช่นกัน คุณจะต้องอธิบายเสียงการวัดขึ้นอยู่กับลำดับของการได้มาสำหรับการสังเกตในปัจจุบัน ความแปรปรวนของเสียงที่สาม (ที่ประมาณ) อาจเพียงพอในแนวทางแรก
Yves

2
ข้อผิดพลาดการวัดในอนุพันธ์คืออะไร? มันสูงกว่าตำแหน่งหรือไม่ ทำไมคุณถึงปรับจุด arent ให้ตรงกันด้วย แกน x คืออะไร
Aksakal

คำตอบ:


9

เราจะอธิบายถึงวิธีใช้ 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}

(O1)y(tk)=f[dk](tk)+ε(tk)
f(t)ε(tk)H(tk)dkε(tk)H(tk)dk
(T1)ddtα(t)=Aα(t)+η(t)
โดยที่เป็นสถานะเวกเตอร์ที่ไม่มีผู้ควบคุมและ เป็นเสียงเกาส์สีขาวที่มีความแปรปรวนร่วมกับซึ่งสันนิษฐานว่าเป็นอิสระจาก สังเกตเสียง r.vs(t_k) เพื่อที่จะอธิบายเส้นโค้งเราพิจารณาสถานะที่ได้จากการซ้อน อนุพันธ์แรกคือ F การเปลี่ยนแปลงคือ α(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 ) 2m2m1m=2>1. เพื่อที่จะยึดมั่นในพิธีการ SSM แบบดั้งเดิมเราสามารถเขียน (O1) เป็น ที่สังเกตเมทริกซ์หยิบอนุพันธ์ที่เหมาะสมในและความแปรปรวนของ ได้รับการแต่งตั้งขึ้นอยู่กับd_kดังนั้นโดยที่ , และdots] ในทำนองเดียวกัน
(O2)y(tk)=Z(tk)α(tk)+ε(tk),
Z(tk)α(tk)H(tk)k(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 3สามแปรปรวน , และH H1H2H3

แม้ว่าช่วงการเปลี่ยนภาพจะอยู่ในช่วงเวลาต่อเนื่อง แต่แท้จริงแล้ว KF เป็นช่วงเวลาไม่ต่อเนื่องมาตรฐานหนึ่งช่วงเวลา อันที่จริงเราจะมุ่งเน้นในการปฏิบัติในครั้งที่เรามีการสังเกตหรือที่เราต้องการที่จะประเมินสัญญาซื้อขายล่วงหน้า เราสามารถใช้ setเป็นสหภาพของทั้งสองชุดและสมมติว่าการสังเกตที่อาจหายไป: สิ่งนี้ช่วยให้การประเมินอนุพันธ์ได้ทุกเวลา โดยไม่คำนึงถึงการมีอยู่ของการสังเกต ยังคงมีการสืบทอด SSM แบบแยกt{tk}tkmtk

เราจะใช้ดัชนีสำหรับเวลาที่ไม่ต่อเนื่องเขียนสำหรับ เป็นต้น SSM แบบไม่ต่อเนื่องใช้รูปแบบ โดยที่เมทริกซ์และมาจาก (T1) และ (O2) ในขณะที่ความแปรปรวนของมอบให้โดย ระบุว่าαkα(tk)

(DT)αk+1=Tkαk+ηkyk=Zkαk+εk
TkQk:=Var(ηk)εkHk=Hdk+1ykTk=ประสบการณ์{δk}=[ 1 δ 1 kไม่ได้หายไป การใช้พีชคณิตเราสามารถหาเมทริกซ์การเปลี่ยนสำหรับ SSM ที่สำหรับ<n ในทำนองเดียวกันเมทริกซ์ความแปรปรวนร่วมสำหรับ SSM แบบไม่ต่อเนื่องสามารถให้เป็น
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
ที่ดัชนีและอยู่ระหว่างและม.ij1m

ตอนนี้เพื่อดำเนินการคำนวณใน R เราต้องการแพ็คเกจที่อุทิศให้กับ KF และยอมรับโมเดลที่เปลี่ยนแปลงตามเวลา แพคเกจ CRAN KFASดูเหมือนว่าตัวเลือกที่ดี เราสามารถเขียนฟังก์ชัน R เพื่อคำนวณเมทริกซ์ และจากเวกเตอร์ของเวลา เพื่อเข้ารหัส SSM (DT) ในสัญกรณ์ที่ใช้โดยแพ็คเกจเมทริกซ์จะทวีคูณเสียงรบกวน ในสมการการเปลี่ยนภาพของ (DT): เราใช้ที่นี่เพื่อเป็นตัวตนI} โปรดทราบว่าจะต้องใช้ความแปรปรวนเริ่มต้นแบบกระจายที่นี่TkQktkRkη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)
}

ขอบคุณสำหรับคำตอบ. ฉันสนใจมันมาก ขณะนี้คุณไม่อนุญาตให้มีค่าของและอนุพันธ์ของมันถูกนำมาใช้ในบางบางf tเป็นไปได้อย่างไรที่จะใช้ข้อมูลทั้งหมด? อีกครั้งเมตตาสำหรับคำตอบของคุณ
dani

การอ่านของฉันคือทุกอย่างด้านล่าง T1 นั้นเกี่ยวกับการใช้อนุพันธ์หลายอย่างในขั้นตอนการอนุมานเดียวกัน อีฟว์สามารถยืนยันได้ว่า
eric_kernfeld

ที่จริงคุณสามารถใช้พูด อนุพันธ์สำหรับหนึ่ง : การสังเกตเป็นเวกเตอร์และ มีแถวเลือกอนุพันธ์ที่ต้องการ ผมแน่ใจว่ากันทำงานร่วมกับKFASแต่โดยใช้ NAS มันอาจจะเป็นไปได้ที่จะมีช่วงเวลาที่แตกต่างกันเช่นกัน ok>1tkykZkoko>1o
Yves

@Yves ฉันเข้าใจว่าคุณอย่างถูกต้อง: ถ้าผมมีอนุพันธ์เป็นครั้งแรกและครั้งที่สองที่จุดใน t_k แล้ว Z_k matrix(c(0,0,0, 0,1,0, 0,0,1), nrow=length(d_k), ncol=m, byrow = T)ลักษณะเช่นนี้: ดังนั้นโดยรวมแล้วมันจะเป็นลูกบาศก์ของมิติ 'อนุพันธ์สูงสุด' * 'spline degree' * '# ขั้นตอนเวลา'
dani

ใช่ @dani เกือบ: จำนวนแถวสำหรับเมทริกซ์คือนั่นคือในตัวอย่าง นี่คือคำสั่งอนุพันธ์ที่สูงที่สุดบวกหนึ่ง นอกจากนี้ระดับของเส้นโค้งเป็นไม่มในตัวอย่างของคุณเนื่องจากคุณไม่ได้สังเกตอนุพันธ์ของลำดับ (ฟังก์ชันเอง) มันควรถูกตั้งค่าเป็นในการสังเกตและคุณสามารถดร็อปแถวแรกได้เช่นกัน แต่ผมสงสัยว่าในกรณีนี้โดยเฉพาะปัญหาที่ไม่ดีถูกวาง SSM อาจจะไม่เป็นที่สังเกต Zkmaxk{dk+1}32m1m0NA
Yves

5

คุณสามารถทำได้อย่างยอดเยี่ยมด้วยชุดคำสั่งสี่เหลี่ยมจัตุรัสน้อยที่สุดที่มีมาตรฐานหากคุณมีความคิดที่สมเหตุสมผลเกี่ยวกับขนาดสัมพัทธ์ของข้อผิดพลาดแบบสุ่มที่เกิดขึ้นสำหรับอนุพันธ์แต่ละอัน ไม่มีข้อ จำกัด เกี่ยวกับจำนวนการวัดที่คุณทำกับค่าแต่ละค่า - คุณสามารถวัดอนุพันธ์ที่แตกต่างกันในแต่ละค่าได้พร้อมกัน ข้อ จำกัด เพียงอย่างเดียวในการใช้ Squares สามัญ (OLS) เป็นปกติ: คุณถือว่าการวัดมีความเป็นอิสระx

แนวคิดพื้นฐานสามารถแสดงได้อย่างชัดเจนที่สุดโดยการสรุปปัญหา แบบจำลองของคุณใช้ชุดของฟังก์ชั่น (เช่นพื้นฐาน spline ใด ๆ ) เป็นพื้นฐานในการทำนายค่าของฟังก์ชันที่ไม่รู้จักที่จุด ซึ่งหมายความว่าคุณพยายามประมาณค่าสัมประสิทธิ์ซึ่งแต่ละชุดค่าผสมเชิงเส้นยอมรับได้ใกล้เคียงกับ เรียกพื้นที่นี้ (เวกเตอร์) ของการผสมแบบเส้นตรงpfj:RR, j=1,2,,pyi=f(xi)f(x1,x2,,xn).βjjβjfj(xi)yi.F.

สิ่งที่พิเศษเกี่ยวกับปัญหานี้คือคุณไม่จำเป็นต้องสังเกตyi. มีชุดฟังก์ชันเชิงเส้น เชื่อมโยงกับข้อมูลแทน จำได้ว่าการทำงานเป็น "ฟังก์ชั่นของฟังก์ชั่น:" แต่ละ กำหนดหมายเลขให้กับฟังก์ชั่นใด ๆ แบบจำลอง posits ที่LiLiLi[f]fF.

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

ที่จะได้รับ functionals,เป็นที่รู้จักกันในระดับปัจจัยและมีความเป็นอิสระและกระจายตัวแปรสุ่มเหมือนกันLiσi>0εi

สมมติฐานเพิ่มเติมสองข้อที่ทำให้ OLS สามารถใช้งานได้และมีความหมายทางสถิติ:

  1. การกระจายทั่วไปของมีความแปรปรวนแน่นอนεi

  2. ทุกคนเป็นฟังก์ชันเชิงเส้น การทำงานเป็นเส้นตรงสำหรับองค์ประกอบใด ๆและหมายเลขที่เกี่ยวข้องLiLfjFαj,

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

(2) อนุญาตให้โมเดลแสดงอย่างชัดเจนมากขึ้นว่า(1)

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

จุดรวมของการลดนี้คือเนื่องจากคุณได้กำหนด functionalsทั้งหมดฟังก์ชันพื้นฐานทั้งหมดและส่วนเบี่ยงเบนมาตรฐานค่าเป็นตัวเลขทั้งหมด- - เหล่านี้เป็นเพียง "ตัวแปร" หรือ "คุณสมบัติ" ตามปกติของปัญหาการถดถอย - และเป็นเพียงน้ำหนัก (สัมพัทธ์) ดังนั้นในความหมายที่ดีที่สุดของทฤษฎีบทเกาส์ - มาร์คอฟ OLS จึงเป็นขั้นตอนที่ยอดเยี่ยมในการใช้งานLi,fj,σi,Li[fj]σi

ฟังก์ชันที่เกี่ยวข้องกับคำถามมีดังต่อไปนี้:

  • หาค่าที่จุดที่ระบุ นี่คือสิ่งที่เรามักจะทำ นี่คือเส้นตรงเนื่องจากตามคำจำกัดความการรวมกันแบบเส้นตรงของฟังก์ชันจะถูกประเมินค่าเป็นจุดfx: L[f]=f(x).

  • ประเมินผลอนุพันธ์ที่จุดที่ระบุ นี่คือเส้นตรงเนื่องจากความแตกต่างเป็นเส้นตรงfx: L[f]=f(x).

  • ประเมินอนุพันธ์อันดับที่สองที่จุดที่ระบุfx: L[f]=f(x).


โอเควิธีนี้ใช้งานได้ดีอย่างไร ตามปกติเราจะศึกษาส่วนที่เหลือเปรียบเทียบค่าติดตั้งกับค่าที่สังเกตได้ เนื่องจากตำแหน่งความเร็วและความเร่งทั้งหมดอยู่ในหน่วยต่าง ๆ จึงควรพล็อตตามแกนแยกy^iyiy^i

รูป

แถวบนสุดใช้เส้นโค้งเพื่อกราฟและอนุพันธ์สองตัวแรก จุดข้อมูลที่เกี่ยวข้องถูกพล็อตเหนือเส้นโค้ง: ค่าที่สังเกตได้ที่ด้านซ้าย, อนุพันธ์ที่สังเกตได้ที่อยู่ตรงกลาง, และสังเกตอนุพันธ์อันดับสองทางด้านขวาy^

แถวด้านล่างพล็อตส่วนที่เหลือที่สอดคล้องกัน ตามปกติเรากำลังมองหาการขาดความสัมพันธ์ที่ชื่นชมได้: เราหวังว่าค่าที่เหลือ (พิกัด y ของพวกเขา) จะแตกต่างกันแบบสุ่มจากซ้ายไปขวาแสดงความเป็นอิสระและไม่มีแนวโน้ม

ค่าข้อมูลถูกสร้างขึ้นตรงตามที่ในคำถาม (หลังจากการตั้งค่าเมล็ดสุ่มหมายเลขที่ 17 ใช้สำหรับการทำสำเนา) ฉันสำรวจพอดีกับการใช้พื้นที่ B-splineสร้างโดยฟังก์ชั่นเช่นเดียวกับในคำถามสำหรับองศา 1 ถึง 6 รูปนี้แสดงผลลัพธ์สำหรับระดับ 2 ซึ่งเป็นระดับต่ำสุด (นั่นคือแบบจำลองที่ง่ายที่สุด) แสดง AIC ต่ำและพฤติกรรมตกค้างที่ดีเช่นเดียวกับแบบจำลองที่ระบุโดย ANOVA ของแบบจำลองทั้งหก (ซ้อนกัน)n=23set.seed(17)FRbs

ความพอดีคือ

y^=27.48993+2.54078f1+2.97679f2

ที่และเป็น B-เส้นโค้งฟังก์ชั่นพื้นฐานที่สร้างขึ้นโดยf1f2bs

ส่วนที่เหลือจะทำงานได้ดี พอดีเป็นสิ่งที่ดี นอกจากนี้วิธีการนี้ยังพบรูปแบบที่ถูกต้อง : ข้อมูลถูกสร้างขึ้นจริงจากฟังก์ชันสมการกำลังสอง (ระดับ 2) นอกจากนี้ค่าเบี่ยงเบนมาตรฐานของส่วนที่เหลือมีขนาดที่เหมาะสม: 0.11, 0.20 และ 0.61 เมื่อเทียบกับ 0.1, 0.3 และ 0.6 ที่ใช้ในการสร้างข้อผิดพลาดดั้งเดิม เป็นเรื่องที่น่าอัศจรรย์มากเนื่องจากเส้นโค้งเหล่านี้คาดการณ์การสังเกตการณ์ (ซึ่งไม่เกิน ) และใช้ชุดข้อมูลขนาดเล็ก ( )x=5n=23

ในที่สุดเศษที่เหลือให้พอดีกับเส้นโค้งระดับสูงนั้นมีคุณภาพเหมือนกัน พวกเขาทำการปรับปรุงเพียงเล็กน้อยโดยเสียค่าใช้จ่ายในการใช้โมเดลที่มีความน่าเชื่อถือน้อยกว่า สำหรับองศาที่สูงพอพวกเขาเริ่มสั่นอย่างรุนแรงสำหรับค่าเล็ก ๆ ของระหว่างค่าที่สังเกตได้เช่น เพื่อแสดงพฤติกรรมนี้ (ไม่ดี) นี่คือระดับ -9 พอดี:x

รูปที่ 2

ในที่สุดนี่คือตัวอย่างที่มีการสังเกตหลายครั้งของฟังก์ชันเชิงเส้นต่างๆของพื้นฐาน รหัสสำหรับการสร้างการสังเกตเหล่านี้ถูกเปลี่ยนจากที่เป็นคำถาม

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

รูปที่ 3


Rรหัสสำหรับการดำเนินการคำนวณเหล่านี้ค่อนข้างทั่วไป โดยเฉพาะอย่างยิ่งมันใช้ความแตกต่างเชิงตัวเลขเพื่อค้นหาอนุพันธ์เพื่อไม่ให้ขึ้นอยู่กับประเภทของเส้นโค้งที่ใช้ มันจัดการกับค่าที่แตกต่างของโดยการถ่วงน้ำหนักการสังเกตตามสัดส่วนกับ มันสร้างโดยอัตโนมัติและเหมาะกับชุดของรูปแบบในวง ฟังก์ชั่นเชิงเส้นและส่วนเบี่ยงเบนมาตรฐานนั้นมีรหัสตายตัว มีสามตัวเลือกตามค่าของตัวแปรในชุดข้อมูลσi1/σi2.Liσitype

เป็นตัวอย่างของวิธีที่คุณสามารถใช้อุปกรณ์พอดี, coda พิมพ์สรุป, รายชื่อ AIC ของพวกเขา, และ ANOVA ของพวกเขาทั้งหมด

#
# 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

ก่อนอื่นฉันอยากจะขอบคุณสำหรับการโพสต์คำถามนี้ มันเป็นคำถามที่น่าสนใจจริงๆ ฉันรักเส้นโค้งและสิ่งดีๆที่คุณสามารถทำได้กับมัน และนี่เป็นข้อแก้ตัวในการทำวิจัย :-)

BLUF: คำตอบสั้น ๆ คือ ฉันไม่รู้การทำงานใน R ที่จะทำสิ่งนี้ให้คุณโดยอัตโนมัติ คำตอบที่ยาวนานคือ ... ซับซ้อนกว่านี้มาก ความจริงที่ว่าตราสารอนุพันธ์และค่าฟังก์ชั่นไม่ได้เก็บตัวอย่างไว้ที่เดียวกันทำให้ยากขึ้น และความจริงที่ว่าคุณไม่มีค่าฟังก์ชั่นใกล้ถึงจุดสิ้นสุดด้านขวาอาจทำให้เป็นไปไม่ได้

เริ่มต้นด้วยลูกบาศก์อิสระ คะแนนที่ได้รับและอนุพันธ์อันดับสองที่เกี่ยวข้อง , ลูกบาศก์อิสระที่ผ่านมาคือ:(xj,yj)zj

Sj(x)=Ayj+Byj+1+Czj+Dzj+1
โดยที่ มันค่อนข้างตรงไปตรงมาที่จะตรวจสอบว่า , ,และ1} สิ่งนี้รับประกันได้ว่าเส้นโค้งและอนุพันธ์อันดับสองนั้นต่อเนื่อง อย่างไรก็ตาม ณ จุดนี้เราไม่มีอนุพันธ์อันดับหนึ่งอย่างต่อเนื่อง เพื่อที่จะบังคับอนุพันธ์อันดับแรกให้ต่อเนื่องเราต้องมีข้อ จำกัด ดังต่อไปนี้
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
ในการตั้งค่าเส้นโค้งลูกบาศก์คลาสสิกที่คุณสมมติคุณมีจุดและการใช้สมการ (สองพร้อมด้วยข้อ จำกัด ขอบเขตเพิ่มเติม) เพื่อแก้ปัญหาสำหรับz_jเมื่อคุณรู้จักแล้วจะมีการระบุเส้นโค้งอย่างสมบูรณ์และคุณสามารถใช้เพื่อแก้ไขที่จุดใดก็ได้ เป็นโบนัสเพิ่มสมการจะเปลี่ยนเป็นเมทริกซ์สามมิติที่สามารถแก้ไขได้ในเวลาเชิงเส้น!(xj,yj)(1)zjzj(1)

ตกลงตอนนี้คิดว่าแทนที่จะรู้คุณรู้z_jคุณสามารถใช้สมการเพื่อแก้ปัญหาสำหรับหรือไม่? จากมุมมองพีชคณิตบริสุทธิ์ดูเหมือนเป็นไปได้ นอกจากนี้สมการและราชวงศ์ดังนั้น ... ทำไมไม่? แต่มันกลับกลายเป็นว่าคุณทำไม่ได้ เมทริกซ์จะเป็นเอกพจน์ และนั่นไม่น่าแปลกใจเลย คุณจะแก้ไขค่าฟังก์ชันที่ได้รับเพียงแค่อนุพันธ์อันดับสองได้อย่างไร อย่างน้อยที่สุดคุณจะต้องมีค่าเริ่มต้นเช่นเดียวกับสมการเชิงอนุพันธ์yjzj(1)yjNN

แล้วสถานการณ์ของคุณล่ะ คะแนนบางส่วนของคุณมีค่าฟังก์ชันและคะแนนบางส่วนของคุณมีอนุพันธ์ ในตอนนี้เราจะเพิกเฉยต่ออนุพันธ์อันดับแรก (มันเป็นระเบียบที่จะจัดการกับลูกบาศก์พื้นฐาน) ทางการให้เป็นชุดของคะแนนที่มีค่าฟังก์ชันและเป็นชุดของคะแนนที่มีอนุพันธ์อันดับสอง เรายังคงมีสมกับราชวงศ์ มันเป็นเพียงแค่ว่าบางส่วนของราชวงศ์ที่มีและบางz_jปรากฎว่าคุณจะได้ทางออกถ้า 0, 1 หรือ 2และหรือ(xi,yi),iI(xj,zj),jJNNyjzjIN3,N2N1I. กล่าวอีกนัยหนึ่งหนึ่งในสามคะแนนแรกจะต้องเป็นค่าฟังก์ชันและหนึ่งในสามคะแนนสุดท้ายจะต้องเป็นค่าฟังก์ชัน นอกเหนือจากข้อ จำกัด ดังกล่าวคุณมีอิสระที่จะโยนตราสารอนุพันธ์มากเท่าที่คุณต้องการ

อนุพันธ์อันดับแรกเป็นอย่างไร? เป็นไปได้อย่างแน่นอนที่จะรวมอนุพันธ์อันดับหนึ่งในอิสระของคุณ แต่อย่างที่ฉันบอกไปมันทำให้ยุ่งมากขึ้น อนุพันธ์แรกของอิสระจะได้รับ: แน่นอนเราสนใจอนุพันธ์ที่ knots เท่านั้นดังนั้นเราสามารถทำให้มันง่ายขึ้นเล็กน้อยโดยการประเมินที่ : คุณสามารถเพิ่มสิ่งเหล่านี้ ข้อ จำกัด ของเมทริกซ์ที่คุณได้รับจากสมการ

Sj(x)=yj+1yjhj3A216hjzj+3B216hjzj+1
xj
Sj(xj)=yj+1yjhj13hjzj16hjzj+1
(1)และเส้นโค้งที่เกิดขึ้นจะมีอนุพันธ์แรกที่ระบุ นอกจากนี้สิ่งนี้จะช่วยแก้ไขปัญหาเอกพจน์เมทริกซ์ คุณจะได้คำตอบถ้าคุณมีค่าฟังก์ชันหรืออนุพันธ์อันดับหนึ่งในสามแต้มแรกและสามครั้งสุดท้าย

ดังนั้นฉันจึงใส่รหัสทั้งหมดเข้าด้วยกันและนี่คือภาพที่ฉันได้รับ:

Spline ผิดพลาดไปอย่างน่ากลัว

อย่างที่คุณเห็นผลลัพธ์ไม่ดีนัก นั่นเป็นเพราะนี่เป็นเส้นโค้งปกติที่ต้องให้เกียรติกับข้อมูลทั้งหมด เนื่องจากข้อมูลนั้นสุ่มเราจำเป็นต้องใช้เส้นโค้งการถดถอย นั่นเป็นหัวข้อสำหรับโพสต์อื่น แต่ถ้าคุณทำงานทางคณิตศาสตร์คุณจะได้รับการเพิ่มประสิทธิภาพของฟังก์ชั่นวัตถุประสงค์สมการกำลังสองภายใต้ข้อ จำกัด ของความเท่าเทียมกันเชิงเส้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.