我的数据具有许多相关的功能,在运行LDA之前,我想先使用平滑基函数来简化这些功能。我正在尝试使用splines
带有ns
功能的程序包中的自然三次样条。 如何分配结点?
这是基本的R代码:
library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))
但是我不知道该如何选择结ns
。
我的数据具有许多相关的功能,在运行LDA之前,我想先使用平滑基函数来简化这些功能。我正在尝试使用splines
带有ns
功能的程序包中的自然三次样条。 如何分配结点?
这是基本的R代码:
library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))
但是我不知道该如何选择结ns
。
Answers:
如何在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
向量中输入实际值...