Получить полиномиальные коэффициенты из интерполяционных сплайнов в R
У меня есть набор измеренных значений, которые я хотел бы интерполировать в R
используя кубические сплайны. Поскольку это всего лишь кусочно-полиномы, я впоследствии хотел бы интегрировать интерполяционную функцию алгебраически. Поэтому мне нужны коэффициенты. Есть ли способ получить это?
призвание splines::interpSpline(foo, bar)$coef
кажется, не возвращает фактические полиномиальные коэффициенты.
1 ответ
Выход из splines::interpSpline(x,y)$coef
дает полиномиальные коэффициенты части между x(i) и x(i+1) в терминах степеней (xx(i)), а не степеней x. Это имеет смысл, потому что результирующие коэффициенты имеют разумный размер и их легче интерпретировать: например, каждый постоянный член равен просто y(i), квадратичный коэффициент дает вогнутость в x(i) и так далее.
Например, этот вывод
> x <- c(1,3,6,9)
> y <- c(3,1,4,1)
> splines::interpSpline(x,y)$coef
[,1] [,2] [,3] [,4]
[1,] 3 -1.54054054 0.0000000 0.13513514
[2,] 1 0.08108108 0.8108108 -0.16816817
[3,] 4 0.40540541 -0.7027027 0.07807808
[4,] 1 -1.70270270 0.0000000 0.00000000
Значит это
- на отрезке [1,3] многочлен имеет вид
3 - 1.54054054*(x-1) + 0.13513514*(x-1)^3
- на отрезке [3,6] многочлен равен
1 + 0.08108108*(x-3) + 0.8108108*(x-3)^2 - 0.16816817*(x-3)^3
- на интервале [6,9] многочлен равен
4 + 0.40540541*(x-6) - 0.7027027*(x-6)^2 + 0.07807808*(x-6)^3
Я не вижу особого смысла в последней строке, которая описывает линейное продолжение сплайна за x=9, правой конечной точкой данных.
Интегрировать их не сложнее, чем интегрировать степени x, но, конечно, нужно выбрать константы интеграции, если целью является получение непрерывного антипроизводного. Выбор формы полиномов облегчает работу с константами интегрирования. Предполагая, что мы выбираем антипроизводное со значением 0 в левой конечной точке, остальное выглядит следующим образом:
- на интервале [1,3] антидериватив является
3*(x-1) - 1.54054054*(x-1)^2/2 + 0.13513514*(x-1)^4/4
- на интервале [3,6] антидеривативное
C1 + 1*(x-3) + 0.08108108*(x-3)^2/2 + 0.8108108*(x-3)^3/3 - 0.16816817*(x-3)^4/4
, Здесь C1 - значение предыдущего антидериватива при x=3. - на интервале [6,9] антидеривативное средство
C2 + 4*(x-6) + 0.40540541*(x-6)^2/2 - 0.7027027*(x-6)^3/3 + 0.07807808*(x-6)^4/4
, Здесь C2 - значение предыдущего антидериватива при x=6.