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


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.