我的问题:我最近遇到了一位统计学家,他告诉我样条线仅对探索数据有用,并且过度拟合,因此对预测没有用。他更喜欢使用简单的多项式进行探索...由于我是样条曲线的忠实拥护者,因此与我的直觉相违背,我有兴趣了解这些论证的有效性,以及是否存在大量的反样条曲线,维权人士在那里?
背景:创建模型时,我尝试遵循回归建模策略(1)的Frank Harrell。他认为受限三次样条是探索连续变量的有效工具。他还认为,多项式在建模某些关系(例如阈值,对数(2))方面很差。为了测试模型的线性,他建议对样条曲线进行ANOVA测试:
我用谷歌搜索样条曲线的过度拟合,但没有发现太多用处(除了关于不使用过多结的一般警告之外)。在这个论坛上,似乎更喜欢样条线建模,Kolassa,Harrell和gung。
我找到了一篇有关多项式的博文,这是有关预测多项式的过拟合的魔鬼。该帖子以以下评论结尾:
在某种程度上,这里提供的示例是作弊的-多项式回归是高度不稳健的。在实践中,更好的方法是使用样条线而不是多项式。
现在,这提示我检查样条的效果如何:
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"))
给出以下图像:
总之,我发现没有什么可以说服我重新考虑花键的,我还缺少什么?
- FE Harrell,回归建模策略:随着线性模型,逻辑回归和生存分析的应用,精装第一版的精装本再版。2001年。施普林格,2010年。
- FE Harrell,KL Lee和BG Pollock,“临床研究中的回归模型:确定预测因素与反应之间的关系”,JNCI J Natl癌症研究所,第1卷。80号 1988年10月,第15卷,第1198–1202页。
更新资料
这些注释使我想知道数据范围内发生了什么,但曲线却不舒服。在大多数情况下,我都不会超出数据边界,如上面的示例所示。我不确定这是否符合预言...
无论如何,这是一个示例,其中我创建了一个更复杂的行,无法将其转换为多项式。由于大多数观察都位于数据的中心,因此我也尝试进行模拟:
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)
这给出了以下图: