#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.