Vấn đề của tôi : Gần đây tôi đã gặp một nhà thống kê thông báo cho tôi rằng spline chỉ hữu ích cho việc khám phá dữ liệu và phải chịu quá nhiều, do đó không hữu ích trong dự đoán. Anh ấy thích khám phá với các đa thức đơn giản ... Vì tôi là một fan hâm mộ lớn của spline, và điều này đi ngược lại với trực giác của tôi, tôi quan tâm đến việc tìm hiểu các đối số này có giá trị như thế nào, và nếu có một nhóm lớn chống spline- Nhà hoạt động ngoài kia?
Bối cảnh : Tôi cố gắng theo Frank Harrell, Regression Modelling Strategies (1), khi tôi tạo các mô hình của mình. Ông lập luận rằng các khối vuông bị hạn chế là một công cụ hợp lệ để khám phá các biến liên tục. Ông cũng lập luận rằng các đa thức rất kém trong việc mô hình hóa các mối quan hệ nhất định như ngưỡng, logarit (2). Để kiểm tra tính tuyến tính của mô hình, ông đề xuất một thử nghiệm ANOVA cho spline:
Tôi đã googled vì quá nhiều với spline nhưng không thấy hữu ích lắm (ngoài những cảnh báo chung về việc không sử dụng quá nhiều nút thắt). Trong diễn đàn này dường như có một ưu tiên cho mô hình spline, Kolassa , Harrell , gung .
Tôi tìm thấy một bài viết trên blog về đa thức, ma quỷ của việc nói quá nhiều nói về việc dự đoán đa thức. Bài đăng kết thúc với những bình luận sau:
Trong một chừng mực nào đó, các ví dụ được trình bày ở đây là gian lận - hồi quy đa thức được biết là không mạnh mẽ. Trong thực tế tốt hơn là sử dụng spline chứ không phải đa thức.
Bây giờ điều này nhắc tôi kiểm tra xem splines sẽ thực hiện như thế nào với ví dụ:
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"))
Cho hình ảnh sau:
Để kết luận tôi đã không tìm thấy nhiều điều sẽ thuyết phục tôi về việc xem xét lại các spline, tôi còn thiếu gì?
- FE Harrell, Chiến lược mô hình hồi quy: Với các ứng dụng cho mô hình tuyến tính, hồi quy logistic và phân tích sinh tồn, tái bản bìa mềm bìa cứng lần thứ nhất. 2001. Mùa xuân, 2010.
- FE Harrell, KL Lee và BG Pollock, mô hình hồi quy của Hồi giáo trong nghiên cứu lâm sàng: Xác định mối quan hệ giữa các yếu tố dự đoán và phản ứng, Hồi JNCI J Natl Cancer Inst, vol. 80, không. 15, trang 1198 bia1202, tháng 10 năm 1988.
Cập nhật
Các bình luận khiến tôi tự hỏi điều gì xảy ra trong khoảng dữ liệu nhưng với những đường cong khó chịu. Trong hầu hết các tình huống tôi không đi ra ngoài ranh giới dữ liệu, như ví dụ trên chỉ ra. Tôi không chắc điều này đủ điều kiện dự đoán ...
Dù sao đây là một ví dụ nơi tôi tạo ra một dòng phức tạp hơn không thể dịch thành đa thức. Vì hầu hết các quan sát đều nằm ở trung tâm của dữ liệu, tôi cũng đã cố gắng mô phỏng điều đó:
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)
Điều này đưa ra cốt truyện sau:
Cập nhật 2
Vì bài đăng này tôi đã xuất bản một bài viết có vẻ phi tuyến tính theo tuổi trên một tập dữ liệu lớn. Phần bổ sung so sánh các phương pháp khác nhau và tôi đã viết một bài đăng trên blog về nó .