Получите полиномиальные коэффициенты из интерполяционных сплайнов в R

У меня есть набор измеренных значений, которые я хотел бы интерполировать в R с помощью кубических сплайнов. Поскольку это всего лишь кусочные полиномы, я впоследствии хотел бы интегрировать функцию интерполяции алгебраически. Поэтому мне нужны коэффициенты. Есть ли способ получить их?
Похоже, что вызов splines::interpSpline(foo, bar)$coef не возвращает действительные полиномиальные коэффициенты.


person Thomas Neitmann    schedule 29.01.2016    source источник


Ответы (1)


Результат splines::interpSpline(x,y)$coef дает полиномиальные коэффициенты части между x(i) и x(i+1) в терминах степеней (x-x(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.
person Community    schedule 31.01.2016