Splines digunakan dalam pemodelan regresi untuk memodelkan bentuk fungsional yang kompleks dan mungkin non-linear. Tren smoothed spline terdiri dari polinomial kontinu piecewise yang koefisien utamanya berubah pada setiap breakpoint atau simpul. Spline dapat ditentukan dalam hal tingkat polinomial tren serta breakpoints. Representasi spline dari kovariat memperluas vektor tunggal dari nilai yang diamati ke dalam matriks yang dimensinya adalah derajat polinom ditambah jumlah simpul.
Versi berkala splines hanyalah versi periodik dari setiap regresi: data dipotong menjadi ulangan panjang periode. Jadi misalnya, memodelkan tren diurnal dalam percobaan multiday pada tikus akan membutuhkan pengodean ulang waktu percobaan menjadi peningkatan 24 jam, sehingga jam ke-154 akan menjadi nilai modulo 24 dari 10 (154 = 6 * 24 + 10). Jika Anda cocok dengan regresi linier pada data yang dipotong, itu akan memperkirakan bentuk gelombang gigi gergaji untuk tren tersebut. Jika Anda memasukkan fungsi langkah di suatu tempat dalam periode tersebut, itu akan menjadi bentuk gelombang persegi yang cocok dengan seri. Spline mampu mengekspresikan wavelet yang jauh lebih canggih. Untuk apa nilainya, dalam splines
paket, ada fungsi periodicSpline
yang melakukan hal ini.
Saya tidak menemukan implementasi spline default "bs" R bermanfaat untuk interpretasi. Jadi saya menulis skrip saya sendiri di bawah ini. Untuk spline derajat dengan simpul , representasi ini memberikan kolom pertama representasi polinomial standar, kolom -th ( ) dievaluasi sebagai di mana adalah vektor yang sebenarnya knot.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
}
Untuk studi kasus kecil, sisipkan tren sinusoidal pada domain 0 hingga (atau ) seperti: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)
Anda akan melihat mereka cukup sesuai. Selanjutnya, konvensi penamaan memungkinkan interpretasi. Dalam hasil regresi Anda melihat:
> 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
Set kovariat pertama untuk derajat spline1.1 saya adalah tren polinomial untuk domain pertama di belakang breakpoint pertama. Istilah linear adalah kemiringan garis singgung pada titik asal, X = 0. Ini hampir 1 yang akan ditunjukkan oleh turunan dari kurva sinusoidal (cos (0) = 1), tetapi kita harus ingat bahwa ini adalah perkiraan, dan kesalahan mengekstrapolasi tren kuadrat keluar cenderung kesalahan. Istilah kuadrat menunjukkan bentuk cekung yang negatif. Istilah spline2.2 menunjukkan perbedaan dari kemiringan kuadratik pertama, yang mengarah ke koefisien memimpin positif 0,4 yang menunjukkan bentuk cembung ke atas. Jadi kami sekarang memiliki interpretasi yang tersedia untuk output spline dan dapat menilai inferensi dan estimasi yang sesuai.π/2
Saya akan berasumsi bahwa Anda tahu periodisitas data yang ada. Jika data tidak memiliki komponen pertumbuhan atau rata-rata bergerak, Anda dapat mengubah deret waktu yang lama menjadi ulangan dari deret pendek dengan durasi 1 periode. Anda sekarang memiliki ulangan dan dapat menggunakan analisis data untuk memperkirakan tren berulang.
Misalkan saya membuat seri waktu yang agak noisey, sangat lama:
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)
Output yang dihasilkan menunjukkan kinerja yang wajar.
> 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