У меня есть данные со многими взаимосвязанными функциями, и я хочу начать с сокращения функций с помощью функции плавного базирования перед запуском LDA. Я пытаюсь использовать естественные кубические сплайны в splines
пакете с ns
функцией. Как мне назначить узлы?
Вот основной код R:
library(splines)
lda.pred <- lda(y ~ ns(x, knots=5))
Но я понятия не имею о том, как выбрать узлы в ns
.
Ответы:
Как указать узлы в R
ns
Функция генерирует естественный регрессионный сплайн базис заданной входной вектор. Узлы могут быть определены либо с помощью аргумента степени свободы,df
который принимает целое число, либо с помощью аргумента узла,knots
который принимает вектор, дающий желаемое расположение узлов. Обратите внимание, что в коде вы написалиВы не запросили пять узлов, а запросили один (внутренний) узел в точке 5.
Если вы используете
df
аргумент, то внутренние узлы будут выбираться на основе квантилей вектораx
. Например, если вы делаете звонокТогда основа будет включать два граничных узла и 4 внутренних узла, размещенных в 20-м, 40-м, 60-м и 80-м квантилях
x
соответственно. Граничные узлы, по умолчанию, размещаются в мин. И максx
.Вот пример, чтобы указать расположение узлов
Если бы вы вместо этого позвонили
ns(x, df=4)
, вы бы получили 3 внутренних узла в точках 25, 50 и 75 соответственно.Вы также можете указать, хотите ли вы перехватить термин. Обычно это не указывается, так
ns
как чаще всего используется в сочетании сlm
, который включает в себя перехват неявно (если не принужден к этому). Если вы используетеintercept=TRUE
в своем вызовеns
, убедитесь, что знаете, почему вы это делаете, поскольку, если вы сделаете это, а затемlm
наивно позвоните , матрица дизайна в итоге окажется с недостатком ранга.Стратегии размещения узлов
Узлы чаще всего размещаются в квантилях, как и поведение по умолчанию
ns
. Интуиция заключается в том, что если у вас много данных, сгруппированных близко друг к другу, то вам может понадобиться больше узлов для моделирования любых потенциальных нелинейностей в этом регионе. Но это не означает, что это либо (а) единственный выбор, либо (б) лучший выбор.Другие варианты, очевидно, могут быть сделаны и зависят от конкретной области. Просмотр гистограмм и оценок плотности ваших предикторов может дать подсказки относительно того, где нужны узлы, если только не существует какого-то «канонического» выбора с учетом ваших данных.
С точки зрения интерпретации регрессий, я хотел бы отметить, что, хотя вы, безусловно, можете «поиграть» с размещением узлов, вы должны понимать, что за это вы понесете штраф за выбор модели, что вы должны быть осторожны в оценке и должны корректировать любые выводы как результат.
источник
x <- 0:100
, что «правильный» способ определить точки останова - это сделатьknots_x <- quantile(x, probs=c(.2, .35, .5))
, который затем будет использованns(x, knots=knots_x)
для определения 3 внутренних узлов в точках 25, 50 и 75 соответственно. Что смутило меня в ответе, так это то, что я ожидал, что мне нужно будет указать желаемые квантили вknots
аргументе, тогда как мне нужно ввести фактические значения изx
вектора ...