Приміщення багатофакторного, натурального кубічного сплайну


17

зауважте: не маючи правильних відповідей через місяць, я відправив повідомлення в ТА

Фон

У мене є модель, , де Y = f ( X )fY=f(Х)

Х - матриця зразків з параметрів, а - вектор модельних виходів.н×ммYн×1

f обчислювально інтенсивно, тому я хотів би наблизити використовуючи багатоваріантний кубічний сплайн через точок, щоб я міг оцінити за більшою кількістю балів.f(Х,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, інакше Матлаб.


спробуйте функцію 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

Зокрема, перевірити функції км та передбачити.

Ось приклад тривимірної інтерполяції. Здається, узагальнення просто.

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?
David LeBauer

Вибачте, не помітили, що ви хочете ідеального наближення. Тоді, очевидно, mgcv не дуже допомагає: стоп ("Основа лише обробляє 1D гладкі ") (від svn.r-project.org/R-packages/trunk/mgcv/R/smooth.r )
Алекс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.