Установка узлов в натуральных кубических сплайнах в R

23

У меня есть данные со многими взаимосвязанными функциями, и я хочу начать с сокращения функций с помощью функции плавного базирования перед запуском LDA. Я пытаюсь использовать естественные кубические сплайны в splinesпакете с nsфункцией. Как мне назначить узлы?

Вот основной код R:

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

Но я понятия не имею о том, как выбрать узлы в ns.

Belmont
источник
3
Вы спрашиваете о том, как указать узлы в (т. е. через аргументы для ns ), или вы спрашиваете о стратегиях принятия решения о том, где разместить узлы? р
кардинал
1
См. Harrell, Regression Strategies 2015, для хорошего обсуждения того, где размещать узлы (это не имеет значения, так что квантили так же хороши, как и все остальное - исключения, если у вас есть веские основания полагать, что в какой-то момент поведение меняется) и количество узлов (3, 4 или 5 в зависимости от N)
statsguy

Ответы:

40

Как указать узлы в 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), вы бы получили 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вектора ...
landroni
Анализ обзоров здоровья, Эдвард Л. Корн, Барри И. Граубард, стр.98, утверждают, что Даррлман и Саймон (1989) рекомендуют (0,05,0.50,0,95) для естественных сплайнов
Крис