样条曲线是否适合数据?


47

我的问题:我最近遇到了一位统计学家,他告诉我样条线仅对探索数据有用,并且过度拟合,因此对预测没有用。他更喜欢使用简单的多项式进行探索...由于我是样条曲线的忠实拥护者,因此与我的直觉相违背,我有兴趣了解这些论证的有效性,以及是否存在大量的反样条曲线,维权人士在那里?

背景:创建模型时,我尝试遵循回归建模策略(1)的Frank Harrell。他认为受限三次样条是探索连续变量的有效工具。他还认为,多项式在建模某些关系(例如阈值,对数(2))方面很差。为了测试模型的线性,他建议对样条曲线进行ANOVA测试:

H0:β2=β3==βk1=0

我用谷歌搜索样条曲线的过度拟合,但没有发现太多用处(除了关于不使用过多结的一般警告之外)。在这个论坛上,似乎更喜欢样条线建模,KolassaHarrellgung

我找到了一篇有关多项式的博文,是有关预测多项式的过拟合的魔鬼。该帖子以以下评论结尾:

在某种程度上,这里提供的示例是作弊的-多项式回归是高度不稳健的。在实践中,更好的方法是使用样条线而不是多项式。

现在,这提示我检查样条的效果如何:

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"))

给出以下图像: 样条和多项式的比较

总之,我发现没有什么可以说服我重新考虑花键的,我还缺少什么?

  1. FE Harrell,回归建模策略:随着线性模型,逻辑回归和生存分析的应用,精装第一版的精装本再版。2001年。施普林格,2010年。
  2. 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)

这给出了以下图:

更复杂的非多项式折线图

更新2

从这篇文章开始,我发表了一篇文章,探讨了大型数据集上年龄的非线性。补编比较了不同的方法,我撰写了关于它的博客。


16
老实说,我真的不知道您的统计学家朋友来自哪里。多项式和样条曲线可以完全相同。过度拟合来自您的模型类别,它们的容量过大;各种模型的性能与众不同之处在于它们如何限制其容量。对于(自然)样条曲线,它是结位置和数量,对于多项式,它是度。
家伙

1
@guy:这也是我的信念,无论使用哪种方法,您总是可以对数据进行过拟合。在我的回归课上,我的教授告诉我,多项式会在大多数数据出现的地方弯曲,从而使极端情况变得不可靠。尽管我还没有发现任何文章支持这一说法。
Max Gordon

第一张图中的所有曲线都无法拟合最右端的数据。
埃米尔·弗里德曼

1
上图中的“ x”维度与时间相关吗?如果是这样,则这些方法都不适合,因为这两种方法都是“前瞻性”,因为它们都使用相邻点(在两侧)进行建模。
arielf

@arielf:不,x不能用作时间变量。我认为它是一些变量,我们在中心对最大观测值进行采样。在我的研究中,我们对未来的关注不多,我想它更多的是在推理领域而不是预测领域。该变量旨在为胆固醇,血压,BMI或其他一些常见的连续变量。
Max Gordon

Answers:


18

过度拟合来自允许过多的模型类别。对于具有连续参数的模型(例如样条曲线和多项式),这会有些棘手,但是如果将参数离散化为一定数量的不同值,则会发现增加结数/系数的数量将成倍增加可用模型的数量。对于每个数据集,只要您允许足够的系数/结数,就有一个样条和一个多项式可以精确拟合。可能是三个结的样条曲线比具有三个系数的多项式拟合得更多,但这并不是一个公平的比较。

如果参数数量少且数据集很大,则可以合理地确定没有过度拟合。如果您想尝试更多数量的参数,则可以尝试在测试集中进行交叉验证以找到最佳数量,或者可以使用“ 最小描述长度”之类的标准。

编辑:根据评论中的要求,提供了一个如何应用MDL的示例。首先,您必须处理以下事实:数据是连续的,因此无法用有限的代码表示。为了简单起见,我们将数据空间分成侧面框,而不是描述数据点,而是描述数据所属的框。这意味着我们失去了一些准确性,但是我们可以使任意小,所以没关系。εϵϵ

现在,任务是借助一些多项式尽可能直观地描述数据集。首先我们描述多项式。如果它是n阶多项式,则只需要存储(n + 1)个系数。同样,我们需要离散化这些值。之后,我们需要先在无前缀编码中存储值(这样我们才能知道何时停止读取),然后再存储n + 1nn+1参数值。有了这些信息,我们的代码的接收者就可以恢复多项式。然后,我们添加存储数据集所需的其余信息。对于每个数据点,我们给出x值,然后该数据点上下多少个框位于多项式之外。我们将这两个值存储在无前缀编码中,以便短值仅需要很少的位,并且在点之间不需要定界符。(您可以通过仅存储值之间的增量来缩短x值的代码)

这里的基本点是权衡。如果我选择一阶多项式(如f(x)= 3.4),则该模型非常易于存储,但是对于y值,我实质上是在存储与均值的距离。系数越多,拟合多项式越好(因此y值的代码更短),但是我不得不花更多的时间描述模型。根据MDL准则,为您的数据提供最短代码的模型是最合适的。

(请注意,这被称为“原始MDL”,您可以进行一些改进以解决各种技术问题)。


谢谢彼得的回答。我试图把头放在MDL上,尤其是如何应用它。根据我的一个例子对它进行解释会很好。作为一个非统计学家,我喜欢在我能理解基础物流之前,先举例说明。Wiki文章中的硬币示例没有显示给我...
Max Gordon

我加了一个例子。
彼得

谢谢彼得提供的示例,现在对我而言,这更加清楚了。
Max Gordon

20

统计学家一直在争论年龄的多项式拟合,根据我的经验,归结为:

样条线基本上是由一系列不同的方程组成的,它们倾向于以无法投影到数据范围的能力为代价来提高内插值的精度。如果您知道自己的数据是纯净的并且来自一致的来源,并且试图描述值范围内不同值存在的可能性,那么这很好。但是,由于通常在旧样条停止准确描述数据时会启动新的样条,因此我们通常对了解数据驱动的理论基础了解不多。这使得我们无法预测数据之外的价值。

现在,样条线在这方面不是唯一的。如果我们只是拟合数据而不使用理论框架来选择变量,则多项式函数实际上会遇到相同的问题。那些具有良好结构理论的人会驱使允许更改哪些变量以及将变量改变多少,从而更相信复杂的多项式函数将预测值外推到数据之外的能力。

但是,许多统计学家在没有预先建立的理论框架帮助的情况下使用数据,这使一些人趋向于简单的多项式。他们认为,适应数据的灵活性较差的功能更有可能准确预测数据外部的值,因为该功能不太可能受到数据内异常的影响。虽然我曾与喜欢简单多项式的人进行过交谈,但我从未感到过反样条小组的感觉。感觉更像是简单的多项式,使一些统计学家对避免过度拟合感到更自在。

免责声明

就我个人而言,我不倾向于将样条曲线或简单多项式用于大多数数据,因为我在具有许多预先建立的理论框架的领域中工作。另外,我通常观察到数据的收集,并且可以很好地了解推动结果的因素。在那种情况下,我将构建更多的逻辑算法并测试算法的适用性,而不是测试多项式函数的适用性。您可以在我的答案中加些盐。


18
多项式是远远更为敏感的数据中的异常比样条曲线。数据集中的任何地方离群有一个巨大的全球性影响,而在花键的影响是局部的。
家伙

我理解您的观点,如果您使用的是完善的信息方法或没有足够的有关数据性质的信息,那是正确的。许多统计学家(包括我本人)假设信息不完善,并在尝试拟合数据之前尝试根据已知信息应用排除标准。从理论上讲,应该从拟合尝试中排除危险的异常值。如果您没有有关数据性质的已知信息(这是很常见的),那么您将无法解决异常值。
Dinre

5
我必须更好地相信,回归样条曲线比多项式更危险地推断。
Frank Harrell

1
这不是什么新鲜事。相反,这是在理解的早期阶段和后期的理解阶段之间进行的统计之间的差异。您对系统的了解越多,对拟合函数的依赖就越少,而对理论模型的依赖就越多。
Dinre

1
如何使用受限制的三次样条曲线,这些样条曲线将函数约束为在数据点外部呈线性(我正在阅读Harrell的书)。无论如何,外推总是可疑的。想想一个发现超导性或等离子体的实验。理论应该通过实验证明!我认为适合的功能与插值问题更相关。没有理论,我想即使您提供足够的数据,您也将无法仅选择一种具有预测误差(也未知分布)和y | x未知分布的模型。
KH Kim
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.