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 splines
gói, có một chức năng periodicSpline
thực hiện chính xác điều này.
pnkpp+ii≤nkSp+i=(X−ki)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