我有许多相关特征的数据,我想在运行 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
.
如何在 R 中指定节点
该函数在给定输入向量的情况下ns
生成自然回归样条基。可以通过采用整数的自由度参数df
或通过采用给出所需节点位置的向量的节点参数knots
来指定节点。请注意,在您编写的代码中
library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))
您没有请求五个结,而是在位置5请求了一个(内部)结。
如果您使用df
参数,则将根据向量的分位数选择内部结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)最好的选择。
显然可以做出其他选择,并且是特定于域的。查看预测变量的直方图和密度估计值可能会提供有关在何处需要结的线索,除非根据您的数据存在一些“规范”选择。
在解释回归方面,我会注意到,虽然你当然可以“玩弄”结的位置,但你应该意识到你会为此招致模型选择惩罚,你应该小心评估并调整任何推论作为结果。