Получение формул для smooth.splines в R

#r #spline #cubic-spline

#r #сплайн #кубический сплайн

Вопрос:

Я использовал функцию stats::smooth.spline для подгонки набора данных из 60 пар (x, y), и теперь мне нужно получить доступ к формуле, которая может генерировать прогнозы для меня, пока у меня есть доступ к модели. К сожалению, документация здесь не помогает мне разобраться в этом (а также выглядит немного устаревшей).

Я понимаю, что smooth.spline предоставляет единственную функцию g: Reals -> Reals , где g удовлетворяет кубический многочлен g = argmin(g) spar * SUM(MSE) lambda * Integral [g''(x)]^2 dx . Если это так, я бы хотел увидеть результат g (x) = x ^ 3 5x ^ 2 10x 15 (хотя результирующий объект, похоже, содержит только spar и lambda).

Также возможно, что smooth.spline формирует несколько сплайнов вдоль разных частей данных, и в этом случае мой желаемый результат будет чем-то похожим на:

  • При x = 0 до x= 2 предсказать y = 3x ^ 3 2x ^ 2 x
  • При x = 2 до x = 3.5 предсказать y = x ^ 3 2x ^ 2 3x 12
  • ……

Вот несколько примеров кода:

 dataset <- data.frame(x = c(1,2,3,4,5,6,7), y = c(10,8,4,6,8,11,15))
spline_result <- smooth.spline(dataset$x, y = dataset$y)
# Plotting the spline looks like a parabola centered near x=3.5 y=5
# so I'd expect something like g(x) = k *(x - 3.5) ^ 2   5
# where k is some constant
 

Дополнительная информация: я использую R версии 4.1.2 2021-11-01 Bird Hippie с packageVersion («статистика») 4.1.2

Спасибо за помощь!

Комментарии:

1. smooth.spline использует другой кубический многочлен между каждым уникальным значением x и является линейным вне диапазона значений x. Чтобы найти коэффициенты, вы могли бы сделать 4 прогноза для каждого интервала и использовать полиномиальную регрессию для подгонки значений, но это вряд ли будет полезным упражнением.

Ответ №1:

smooth.spline Функция создает «естественный сплайн» с узлами при каждом x значении. Это означает, что это линейная функция вне диапазона x и является кубическим многочленом между каждым значением. Итак, в вашем случае у вас будет 2 линейных уравнения и 6 кубических уравнений. Обычно это не самый полезный способ работы с такой функцией, потому что часто коэффициенты почти компенсируют друг друга, поэтому при попытке ее оценки может быть много ошибок округления.

Если вас просто интересует оценка сплайна в разных точках, которых не было в вашем исходном x векторе, используйте predict() функцию, например

 dataset <- data.frame(x = c(1,2,3,4,5,6,7), y = c(10,8,4,6,8,11,15))
spline_result <- smooth.spline(dataset$x, y = dataset$y)

newx <- seq(0, 10, len = 100)
newvals <- predict(spline_result, x = newx)
plot(newvals, type = 'l')
points(dataset)
 

Создано 2021-12-09 пакетом reprex (v2.0.1)

predict() Функция позволяет избежать ошибки округления, избегая степенного базиса для многочленов.

Если вам действительно нужны полиномиальные коэффициенты, один из способов их получения — использовать полиномиальную регрессию для прогнозов. Например, чтобы найти коэффициенты для сегмента между 3 и 4, вы могли бы использовать

 lm(y ~ poly(x, degree = 3, raw = TRUE), data = predict(spline_result, x = seq(3, 4, len = 10)))
#> 
#> Call:
#> lm(formula = y ~ poly(x, degree = 3, raw = TRUE), data = predict(spline_result, 
#>     x = seq(3, 4, len = 10)))
#> 
#> Coefficients:
#>                      (Intercept)  poly(x, degree = 3, raw = TRUE)1  
#>                          26.3378                          -14.9943  
#> poly(x, degree = 3, raw = TRUE)2  poly(x, degree = 3, raw = TRUE)3  
#>                           3.2874                           -0.2059
 

Создано 2021-12-09 пакетом reprex (v2.0.1)

Это дает многочлен 26.3378 -14.9943 x 3.2874 x ^ 2 -0.2059 x ^ 3.