Masalah saya : Baru-baru ini saya bertemu dengan ahli statistik yang memberi tahu saya bahwa splines hanya berguna untuk mengeksplorasi data dan mengalami overfitting, sehingga tidak berguna dalam prediksi. Dia lebih suka menjelajahi dengan polinomial sederhana ... Karena saya penggemar berat spline, dan ini bertentangan dengan intuisi saya, saya tertarik untuk mengetahui seberapa valid argumen ini, dan jika ada kelompok besar anti-spline- aktivis di luar sana?
Latar Belakang : Saya mencoba mengikuti Frank Harrell, Regresi Modeling Strategies (1), ketika saya membuat model saya. Dia berpendapat bahwa splines kubik terbatas adalah alat yang valid untuk menjelajahi variabel kontinu. Dia juga berpendapat bahwa polinomial miskin dalam pemodelan hubungan tertentu seperti ambang batas, logaritmik (2). Untuk menguji linearitas model, ia menyarankan tes ANOVA untuk spline:
Saya sudah googled untuk overfitting dengan splines tetapi tidak menemukan banyak berguna (selain dari peringatan umum tentang tidak menggunakan knot terlalu banyak). Di forum ini tampaknya ada preferensi untuk pemodelan spline, Kolassa , Harrell , gung .
Saya menemukan satu posting blog tentang polinomial, setan overfitting yang berbicara tentang prediksi polinomial. Pos diakhiri dengan komentar ini:
Sampai taraf tertentu contoh yang disajikan di sini curang - regresi polinomial dikenal sangat tidak kuat. Jauh lebih baik dalam praktiknya adalah menggunakan splines daripada polinomial.
Sekarang ini mendorong saya untuk memeriksa bagaimana kinerja splines dengan contoh:
library(rms)
p4 <- poly(1:100, degree=4)
true4 <- p4 %*% c(1,2,-6,9)
days <- 1:70
set.seed(7987)
noise4 <- true4 + rnorm(100, sd=.5)
reg.n4.4 <- lm(noise4[1:70] ~ poly(days, 4))
reg.n4.4ns <- lm(noise4[1:70] ~ ns(days,4))
dd <- datadist(noise4[1:70], days)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4[1:70] ~ rcs(days,5))
plot(1:100, noise4)
nd <- data.frame(days=1:100)
lines(1:100, predict(reg.n4.4, newdata=nd), col="orange", lwd=3)
lines(1:100, predict(reg.n4.4ns, newdata=nd), col="red", lwd=3)
lines(1:100, predict(reg.n4.4rcs_ols, newdata=nd), col="darkblue", lwd=3)
legend("top", fill=c("orange", "red","darkblue"),
legend=c("Poly", "Natural splines", "RCS - ols"))
Memberikan gambar berikut:
Kesimpulannya saya belum menemukan banyak yang akan meyakinkan saya untuk mempertimbangkan kembali splines, apa yang saya lewatkan?
- FE Harrell, Strategi Pemodelan Regresi: Dengan Aplikasi pada Model Linier, Regresi Logistik, dan Analisis Kelangsungan Hidup, cetak ulang Softcover dari hardcover edisi pertama. 2001. Springer, 2010.
- FE Harrell, KL Lee, dan BG Pollock, "Model Regresi dalam Studi Klinis: Menentukan Hubungan Antara Prediktor dan Respon," JNCI J Natl Cancer Inst, vol. 80, tidak. 15, hlm. 1198–1202, Oktober 1988.
Memperbarui
Komentar membuat saya bertanya-tanya apa yang terjadi dalam rentang data tetapi dengan kurva yang tidak nyaman. Dalam sebagian besar situasi saya tidak akan keluar dari batas data, seperti contoh di atas menunjukkan. Saya tidak yakin ini memenuhi syarat sebagai prediksi ...
Bagaimanapun, ini adalah contoh di mana saya membuat garis yang lebih kompleks yang tidak dapat diterjemahkan ke dalam polinomial. Karena sebagian besar pengamatan berada di pusat data, saya mencoba mensimulasikannya juga:
library(rms)
cmplx_line <- 1:200/10
cmplx_line <- cmplx_line + 0.05*(cmplx_line - quantile(cmplx_line, .7))^2
cmplx_line <- cmplx_line - 0.06*(cmplx_line - quantile(cmplx_line, .3))^2
center <- (length(cmplx_line)/4*2):(length(cmplx_line)/4*3)
cmplx_line[center] <- cmplx_line[center] +
dnorm(6*(1:length(center)-length(center)/2)/length(center))*10
ds <- data.frame(cmplx_line, x=1:200)
days <- 1:140/2
set.seed(1234)
sample <- round(rnorm(600, mean=100, 60))
sample <- sample[sample <= max(ds$x) &
sample >= min(ds$x)]
sample_ds <- ds[sample, ]
sample_ds$noise4 <- sample_ds$cmplx_line + rnorm(nrow(sample_ds), sd=2)
reg.n4.4 <- lm(noise4 ~ poly(x, 6), data=sample_ds)
dd <- datadist(sample_ds)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4 ~ rcs(x, 7), data=sample_ds)
AIC(reg.n4.4)
plot(sample_ds$x, sample_ds$noise4, col="#AAAAAA")
lines(x=ds$x, y=ds$cmplx_line, lwd=3, col="black", lty=4)
nd <- data.frame(x=ds$x)
lines(ds$x, predict(reg.n4.4, newdata=ds), col="orange", lwd=3)
lines(ds$x, predict(reg.n4.4rcs_ols, newdata=ds), col="lightblue", lwd=3)
legend("bottomright", fill=c("black", "orange","lightblue"),
legend=c("True line", "Poly", "RCS - ols"), inset=.05)
Ini memberikan plot berikut:
Perbarui 2
Sejak posting ini saya telah menerbitkan sebuah artikel yang membahas usia non-linearitas pada dataset besar. Suplemen membandingkan berbagai metode dan saya sudah menulis posting blog tentang itu .