在R中的自然立方样条曲线中设置结


23

我的数据具有许多相关的功能,在运行LDA之前,我想先使用平滑基函数来简化这些功能。我正在尝试使用splines带有ns功能的程序包中的自然三次样条。 如何分配结点?

这是基本的R代码:

library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))

但是我不知道该如何选择结ns。


3
您是在问如何在指定结点(即通过ns的参数),还是在询问确定将结点放置在何处的策略?[R
— 主教

1
请参见Harrell,《回归策略》(Regression Strategies 2015),该节对放置结的位置进行了很好的讨论(这无关紧要,所以分位数与其他任何东西一样好-如果您有充分的理由相信某个时候的行为会发生变化,则例外)。结数(3、4或5,取决于N)
— statsguy

Answers:


40

如何在R中指定结

给定输入向量,该ns函数将生成自然回归样条曲线基础。可以通过df采用整数的自由度参数或通过knots采用向量给出所需结位置的结参数来指定结。请注意,在您编写的代码中

library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))

您没有要求5个结,而是在位置 5 要求了一个(内部)结。

如果使用自df变量,则将基于vector的分位数选择内部结x。例如,如果您拨打电话

ns(x, df=5)

然后,基础将包括两个边界结和4个内部结,分别位于的第20、40、60和80分位数x。默认情况下,边界结位于的最小值和最大值处x。

这是指定结点位置的示例

x <- 0:100
ns(x, knots=c(20,35,50))

如果要呼叫ns(x, df=4),则最终将在25、50和75处分别出现3个内部结。

您还可以指定是否需要截取项。通常不指定此名称,因为ns它最常与结合使用lm,其中包含隐式的拦截(除非强制不这样做)。如果intercept=TRUE在调用中使用,请ns确保知道为什么这样做,因为如果您这样做然后又lm天真地调用,则设计矩阵最终将排名不足。

打结的策略

结最常见于分位数,例如的默认行为ns。直觉是,如果您有大量聚集在一起的数据,那么您可能希望在那里更多的节点来建模该区域中的任何潜在非线性。但是,这并不意味着这不是(a)唯一选择,还是(b)最佳选择。

显然可以做出其他选择,并且它们是特定于域的。查看直方图和预测变量的密度估计值可能会提供有关需要打结的线索,除非为您的数据提供一些“规范”的选择。

在解释回归方面,我要指出的是,虽然您当然可以“打结”放置节点,但您应该意识到,为此您会招致模型选择惩罚,因此您应谨慎评估,并应将所有推论调整为结果。


给定x <- 0:100,定义断点的“正确”方法是do knots_x <- quantile(x, probs=c(.2, .35, .5)),然后将其用于ns(x, knots=knots_x)分别在位置25、50和75处定义3个内部结。让我感到困惑的是,我期望在knots参数中指定所需的分位数,而我需要从x向量中输入实际值...
— landroni 2015年

《健康调查分析》,爱德华·科恩(Edward L. Korn),巴里·I·格劳伯(Barry I. Graubard)第98页指出,都柏林(Durrleman and Simon)(1989)建议为自然花键(0.05,0.50,0.95)
— 克里斯(Chris)2007年
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.