Splines periodik agar sesuai dengan data periodik

10

Dalam komentar untuk pertanyaan ini , pengguna @whuber mengutip kemungkinan menggunakan versi splines periodik agar sesuai dengan data periodik. Saya ingin tahu lebih banyak tentang metode ini, khususnya persamaan yang mendefinisikan splines, dan bagaimana menerapkannya dalam praktik (saya sebagian besar Rpengguna, tetapi saya bisa puas dengan MATLAB atau Python, jika perlu). Juga, tetapi ini adalah "baik untuk memiliki", akan lebih baik untuk mengetahui tentang kemungkinan keuntungan / kerugian sehubungan dengan pemasangan polinomial trigonometrik, yang merupakan cara saya biasanya menangani data semacam ini (kecuali jika responsnya tidak terlalu lancar, dalam hal ini saya beralih ke Proses Gaussian dengan kernel periodik).

DeltaIV
sumber
2
periksa jawaban dari pertanyaan saya yang lain. stats.stackexchange.com/questions/225729/…
Haitao Du
@ hxd1011 terima kasih, saya menghargai tipnya. Pada akhirnya saya memutuskan untuk menggandakan data dua kali, sehingga memiliki tiga set data identik yang berurutan, dan menyesuaikan spline ke sepertiga tengah. Jawaban yang Anda rujuk, juga menunjukkan ini sebagai solusi alternatif.
DeltaIV
1
@DeltaIV jika Anda dapat mengonversi komentar Anda menjadi jawaban, dan memberikan lebih banyak detail, saya pikir ini adalah jawaban yang bagus dan pertanyaan yang bagus untuk mendapatkan beberapa resolusi.
AdamO
@ Adamo terima kasih atas sarannya, tetapi selama tahun ini saya agak kewalahan :-) Saya akan mencoba. Pertama-tama saya harus mengambil kode itu ...
DeltaIV

Jawaban:

5

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 splinespaket, ada fungsi periodicSplineyang 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+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
}

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
AdamO
sumber