Фиттинг многомерный, натуральный кубический сплайн


17

примечание: без правильных ответов через месяц я разместил сообщение на SO

Фон

У меня есть модель, f , где Y=f(X)

X -матрица выборок изпараметров размером а-векторвыходных данных модели.n×mmYn×1

f требует большого объема вычислений, поэтому я хотел бы аппроксимировать f используя многовариантный кубический сплайн через (X,Y) точек, чтобы я мог оценить Y в большем количестве точек.

Вопрос

Есть ли функция R, которая будет вычислять произвольные отношения между X и Y?

В частности, я ищу многовариантную версию splinefunфункции, которая генерирует сплайн-функцию для одномерного случая.

например, это то, как splinefunработает для одномерного случая

x <- 1:10
y <- runif(10)
foo <- splinefun(x,y)
foo(1:10) #returns y, as example
all(y == foo(1:10))
## TRUE

Что я пробовал

Я рассмотрел пакет mda , и кажется, что должно работать следующее:

library(mda)
x   <- data.frame(a = 1:10, b = 1:10/2, c = 1:10*2)
y   <- runif(10)
foo <- mars(x,y)
predict(foo, x) #all the same value
all(y == predict(foo,x))
## FALSE

но я не мог найти способ реализовать кубический сплайн в mars

обновить, поскольку предлагая щедрость, я изменил название. Если функции R нет, я бы принял в порядке предпочтения: функцию R, которая выводит функцию процесса Гаусса, или другую многомерную интерполяционную функцию, которая проходит через точки проектирования, предпочтительно в R, иначе Matlab.


попробуйте функцию gam (), она разрешает любое измерение кубических сплайнов
— user5563

Ответы:


11

Этот документ представлен на UseR! 2009 год, похоже, решает аналогичную проблему

http://www.r-project.org/conferences/useR-2009/slides/Roustant+Ginsbourger+Deville.pdf

Он предлагает пакет DiceKriging http://cran.r-project.org/web/packages/DiceKriging/index.html

В частности, проверьте функции km и прогнозируйте.

Вот пример трехмерной интерполяции. Это выглядит просто обобщать.

x <- c(0, 0.4, 0.6, 0.8, 1)
y <- c(0, 0.2, 0.3, 0.4, 0.5)
z <- c(0, 0.3, 0.4, 0.6, 0.8)

model <- function(param){
2*param[1] + 3*param[2] +4*param[3]
}


model.in <- expand.grid(x,y,z)
names(model.in) <- c('x','y','z')

model.out <- apply(model.in, 1, model)

# fit a kriging model 
m.1 <- km(design=model.in, response=model.out, covtype="matern5_2")

# estimate a response 
interp <- predict(m.1, newdata=data.frame(x=0.5, y=0.5, z=0.5), type="UK",    se.compute=FALSE)
# check against model output
interp$mean
# [1]  4.498902
model(c(0.5,0.5,0.5))
# [1] 4.5

# check we get back what we put in
interp <- predict(m.1, newdata=model.in, type="UK", se.compute=FALSE)
all.equal(model.out, interp$mean)
# TRUE

6

Вам нужно больше данных для подгонки сплайна. mgcv действительно хороший выбор. Для вашего конкретного запроса вам нужно установить кубический сплайн в качестве базовой функции bs = 'cr', а также не применять его к fx = TRUE. Обе опции установлены для гладкого члена, который устанавливается с помощью s (). Прогноз работает, как ожидалось.

library(mgcv)
x <- data.frame(a = 1:100, b = 1:100/2, c = 1:100*2)
y <- runif(100)
foo <- gam(y~a+b+s(c,bs="cr",fx=TRUE),data=x)
plot(foo)
predict(foo,x)

Спасибо за вашу помощь, но если бы это был кубический сплайн, разве мне не ожидать predict(foo,x)возвращения y?
— Дэвид Лебауэр

Извините, не заметил, что вы хотите идеальное приближение. Тогда, очевидно, mgcv не очень помогает: остановка («Базис обрабатывает только 1D-сглаживания») (от svn.r-project.org/R-packages/trunk/mgcv/R/smooth.r )
— Алекс

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.