Spline định kỳ để phù hợp với dữ liệu định kỳ


10

Trong một bình luận cho câu hỏi này , người dùng @whuber đã trích dẫn khả năng sử dụng một phiên bản spline định kỳ để phù hợp với dữ liệu định kỳ. Tôi muốn biết thêm về phương pháp này, đặc biệt là các phương trình xác định các spline và cách triển khai chúng trong thực tế (Tôi chủ yếu là Rngười dùng, nhưng tôi có thể thực hiện với MATLAB hoặc Python, nếu có nhu cầu). Ngoài ra, nhưng đây là một "điều tốt đẹp để có", thật tuyệt khi biết về những lợi thế / bất lợi có thể có liên quan đến đa thức lượng giác, đó là cách tôi thường xử lý với loại dữ liệu này (trừ khi phản hồi không được mượt mà, trong trường hợp đó tôi chuyển sang Quá trình Gaussian với kernel định kỳ).


2
kiểm tra câu trả lời của tôi stats.stackexchange.com/questions/225729/ Cách
Haitao Du

@ hxd1011 cảm ơn, tôi đánh giá cao tiền boa. Cuối cùng, tôi quyết định chỉ nhân đôi dữ liệu hai lần, do đó có ba bộ dữ liệu giống hệt nhau liên tiếp và khớp với spline vào trung tâm thứ ba. Câu trả lời mà bạn đề cập đến, cũng chỉ ra đây là một giải pháp thay thế.
DeltaIV

1
@DeltaIV nếu bạn có thể chuyển đổi nhận xét của mình thành câu trả lời và cung cấp thêm một số chi tiết, tôi nghĩ đó là một câu trả lời tốt và một câu hỏi hay để có một số giải pháp.
AdamO

@AdamO cảm ơn vì lời đề nghị, nhưng trong thời gian này của năm tôi hơi bị lúng túng :-) Tôi sẽ cố gắng. Trước hết tôi nên lấy mã đó ...
DeltaIV

Câu trả lời:


5

Splines được sử dụng trong mô hình hồi quy để mô hình các dạng chức năng phi tuyến tính phức tạp. Một xu hướng làm mịn spline bao gồm các đa thức liên tục của piecewise có hệ số dẫn thay đổi tại mỗi điểm dừng hoặc nút thắt. Spline có thể được chỉ định theo mức độ đa thức của xu hướng cũng như các điểm dừng. Một biểu diễn spline của một hiệp phương sẽ mở rộng một vectơ các giá trị quan sát thành một ma trận có thứ nguyên là mức độ đa thức cộng với số lượng nút thắt.

Một phiên bản định kỳ của splines chỉ là một phiên bản định kỳ của bất kỳ hồi quy nào: dữ liệu được cắt thành các bản sao của độ dài của thời kỳ. Vì vậy, ví dụ, mô hình hóa xu hướng ban đầu trong một thử nghiệm thứ sáu trên chuột sẽ yêu cầu thời gian mã hóa lại của thử nghiệm thành số gia 24 giờ, vì vậy giờ thứ 154 sẽ là giá trị modulo 24 là 10 (154 = 6 * 24 + 10). Nếu bạn phù hợp với hồi quy tuyến tính trên dữ liệu cắt, nó sẽ ước tính dạng sóng răng cưa cho xu hướng. Nếu bạn phù hợp với một chức năng bước ở đâu đó trong giai đoạn, nó sẽ là một dạng sóng vuông phù hợp với chuỗi. Spline có khả năng thể hiện một wavelet tinh vi hơn nhiều. Đối với những gì nó có giá trị, trong splinesgói, có một chức năng periodicSplinethực hiện chính xác điều này.

pnkpp+iinkSp+i=(Xki)pI(X<ki)k

myspline <- function(x, degree, knots) {
  knots <- sort(knots)
  val <- cbind(x, outer(x, knots, `-`))
  val[val < 0] <- 0
  val <- val^degree
  if(degree > 1)
    val <- cbind(outer(x, 1:{degree-1}, `^`), val)
  colnames(val) <- c(
    paste0('spline', 1:{degree-1}, '.1'),
    paste0('spline', degree, '.', seq(length(knots)+1))
  )
  val
}

2πτ

x <- seq(0, 2*pi, by=pi/2^8)
y <- sin(x)
plot(x,y, type='l')
s <- myspline(x, 2, pi)
fit <- lm(y ~ s)
yhat <- predict(fit)
lines(x,yhat)

Bạn sẽ thấy họ khá phù hợp. Hơn nữa, quy ước đặt tên cho phép giải thích. Trong đầu ra hồi quy bạn thấy:

> summary(fit)

Call:
lm(formula = y ~ s)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.04564 -0.02050  0.00000  0.02050  0.04564 

Coefficients:
             Estimate Std. Error  t value Pr(>|t|)    
(Intercept) -0.033116   0.003978   -8.326 7.78e-16 ***
sspline1.1   1.268812   0.004456  284.721  < 2e-16 ***
sspline2.1  -0.400520   0.001031 -388.463  < 2e-16 ***
sspline2.2   0.801040   0.001931  414.878  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.02422 on 509 degrees of freedom
Multiple R-squared:  0.9988,    Adjusted R-squared:  0.9988 
F-statistic: 1.453e+05 on 3 and 509 DF,  p-value: < 2.2e-16

π/2

Tôi sẽ giả định rằng bạn biết tính chu kỳ của dữ liệu trong tay. Nếu dữ liệu thiếu thành phần trung bình tăng trưởng hoặc di chuyển, bạn có thể chuyển đổi một chuỗi thời gian dài thành các bản sao của một chuỗi ngắn có thời lượng 1 kỳ. Bây giờ bạn có bản sao và có thể sử dụng phân tích dữ liệu để ước tính xu hướng lặp lại.

Giả sử tôi tạo ra một số noisey sau đây, chuỗi thời gian rất dài:

x <- seq(1, 100, by=0.01)
y <- sin(x) + rnorm(length(x), 0, 10)
xp <- x %% (2*pi)
s <- myspline(xp, degree=2, knots=pi)
lm(y ~ s)

Kết quả đầu ra cho thấy hiệu suất hợp lý.

> summary(fit)

Call:
lm(formula = y ~ s)

Residuals:
    Min      1Q  Median      3Q     Max 
-39.585  -6.736   0.013   6.750  37.389 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.48266    0.38155  -1.265 0.205894    
sspline1.1   1.52798    0.42237   3.618 0.000299 ***
sspline2.1  -0.44380    0.09725  -4.564 5.09e-06 ***
sspline2.2   0.76553    0.18198   4.207 2.61e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9.949 on 9897 degrees of freedom
Multiple R-squared:  0.006406,  Adjusted R-squared:  0.006105 
F-statistic: 21.27 on 3 and 9897 DF,  p-value: 9.959e-14
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.