2016-09-12 3 views
1

Я часто использую B-сплайны для регрессии. До сих пор мне никогда не приходилось разбираться в производительности bs: я бы просто выбрал интересующую меня модель и поместил ее с lm. Однако теперь мне нужно воспроизвести b-сплайн-модель во внешнем (не-R) коде. Итак, в чем смысл матрицы, созданной bs? Пример:интерпретация выхода функции R bs() (базовая матрица B-сплайна)

x <- c(0.0, 11.0, 17.9, 49.3, 77.4) 
bs(x, df = 3, degree = 1) # generate degree 1 (linear) B-splines with 2 internal knots 
#    1   2   3 
# [1,] 0.0000000 0.0000000 0.0000000  
# [2,] 0.8270677 0.0000000 0.0000000  
# [3,] 0.8198433 0.1801567 0.0000000  
# [4,] 0.0000000 0.7286085 0.2713915  
# [5,] 0.0000000 0.0000000 1.0000000 
# attr(,"degree") 
# [1] 1 
# attr(,"knots") 
# 33.33333% 66.66667% 
# 13.30000 38.83333 
# attr(,"Boundary.knots") 
# [1] 0.0 77.4 
# attr(,"intercept") 
# [1] FALSE 
# attr(,"class") 
# [1] "bs"  "basis" "matrix" 

Итак, degree 1, как я указано на входе. knots говорит мне, что два внутренних узла находятся в x = 13.3000 и x = 38.8333 соответственно. Был немного удивлен, увидев, что узлы находятся в фиксированных квантилях, я надеялся, что R найдет лучшие квантиля для моих данных, но, конечно, это сделает модель не линейной, а также не удастся, не зная данных ответа. intercept = FALSE означает, что в базу не было перехвата (это хорошая вещь? Меня всегда учат не подстраивать линейные модели без перехвата ... ну, думаю, lm просто добавляет одно в любом случае).

Однако, что относительно матрицы? Я не понимаю, как это интерпретировать. С тремя столбцами я бы подумал, что это означает, что базовые функции три. Это имеет смысл: если у меня есть два внутренних узлы K1 и K2, у меня будет сплайн между левой границей узлом B1 и K1, другой сплайном между K1 и K2, и окончательным один между K2 и B2, так что ... тремя базисными функциями , ОК. Но каковы основные функции? Например, что означает этот столбец?

#    1 
# [1,] 0.0000000 
# [2,] 0.8270677 
# [3,] 0.8198433 
# [4,] 0.0000000 
# [5,] 0.0000000 

EDIT: это похоже, но не точно такой же, как this question. Этот вопрос задает вопрос о интерпретации коэффициентов регрессии, но я на шаг впереди: я хотел бы понять значение коэффициентов матрицы модели. Если я пытаюсь сделать те же участки, как это было предложено в the first answer, я перепутались сюжет:

b <- bs(x, df = 3, degree = 1) 
b1 <- b[, 1] ## basis 1 
b2 <- b[, 2] ## basis 2 
b3 <- b[,3] 
par(mfrow = c(1, 3)) 
plot(x, b1, type = "l", main = "basis 1: b1") 
plot(x, b2, type = "l", main = "basis 2: b2") 
plot(x, b3, type = "l", main = "basis 3: b3") 

enter image description here

Они не могут быть базисные функции B-сплайн, потому что у них слишком много узлов (каждая функция должна иметь только одну).

The second answer фактически позволил бы мне восстановить мою модель за пределами R, поэтому, я думаю, я мог бы пойти с этим. Однако также этот ответ не совсем объясняет, каковы элементы матрицы b: он имеет дело с коэффициентами линейной регрессии, которые я еще не представил здесь. Это правда, что это моя конечная цель, но я хотел понять и этот промежуточный шаг.

+0

@ ZheyuanLi, ну, нет. Речь идет о коэффициенте 'lm', я спрашиваю о базовой функции. [Этот ответ] (http://stackoverflow.com/a/37364459/1711271) не объясняет, что представляют собой одиночные коэффициенты матрицы. Если я сделаю один и тот же сюжет, предложенный в первом ответе, я получаю мусор (определенно не функции B-сплайна, так как их max должно быть 1). [Другой ответ] (http://stackoverflow.com/a/37363943/1711271) лучше, но все же не совсем то, что я просил. Я отредактировал вопрос, чтобы показать, почему. – DeltaIV

+0

Ух, подождите! Я понял! Я собираюсь ответить на свой вопрос, теперь я понял, что это за матрица :) – DeltaIV

+0

Прежде всего, извинения, я не заметил, что вы были автором ответа, иначе я бы обратился к вам как таковой. Возможно, у нас есть другая терминология для базисных функций. Для меня основными функциями являются бесконечномерные объекты (функции), и ваш ответ показывает их. Но столбцы матрицы 'b' являются, IMO, а не базовыми функциями, а значениями, полученными с помощью базисных функций в точках выборки' x <- c (0.0, 11.0, 17.9, 49.3, 77.4) '. ctd .. – DeltaIV

ответ

2

Матрица b

#    1   2   3 
# [1,] 0.0000000 0.0000000 0.0000000  
# [2,] 0.8270677 0.0000000 0.0000000  
# [3,] 0.8198433 0.1801567 0.0000000  
# [4,] 0.0000000 0.7286085 0.2713915  
# [5,] 0.0000000 0.0000000 1.0000000 

на самом деле просто матрица значений трех базисных функций в каждой точке x, которые должны были очевидны для меня, так как он точно такой же интерпретации, как и для полинома линейная модель.В самом деле, поскольку граничные узлы

bknots <- attr(b,"Boundary.knots") 
# [1] 0.0 77.4 

и внутренние узлы

iknots <- attr(b,"knots") 
# 33.33333% 66.66667% 
# 13.30000 38.83333 

то три базисных функций, как показано here, являются:

knots <- c(bknots[1],iknots,bknots[2]) 
y1 <- c(0,1,0,0) 
y2 <- c(0,0,1,0) 
y3 <- c(0,0,0,1) 
par(mfrow = c(1, 3)) 
plot(knots, y1, type = "l", main = "basis 1: b1") 
plot(knots, y2, type = "l", main = "basis 2: b2") 
plot(knots, b3, type = "l", main = "basis 3: b3") 

enter image description here

Теперь рассмотрим b[,1]

#    1 
# [1,] 0.0000000 
# [2,] 0.8270677 
# [3,] 0.8198433 
# [4,] 0.0000000 
# [5,] 0.0000000 

Они должны быть значения b1 в x <- c(0.0, 11.0, 17.9, 49.3, 77.4). Фактически b1 является 0 в knots[1] = 0 и 1 в knots[2] = 13.3000, что означает, что в x[2] (11.0) значение должно быть 11/13.3 = 0.8270677, как и ожидалось. Аналогичным образом, поскольку b1 равен 0 для knots[3] = 38.83333, значение в x[3] (17.9) должно быть (38.83333-13.3)/17.9 = 0.8198433. С x[4], x[5] > knots[3] = 38.83333, b1 - 0. Аналогичная интерпретация может быть дана для двух других столбцов.

Смежные вопросы