Pas multivariat, spline kubik alami


17

catatan: tanpa jawaban yang benar setelah sebulan, saya telah memposting ulang ke SO

Latar Belakang

Saya punya model, f , di mana Y=f(X)

X adalahmatriksn×m sampel dariparameterm danY adalahvektorn×1 dari output model.

f adalah komputasi yang intensif, jadi saya ingin memperkirakanf menggunakan spline kubik multivariat melalui(X,Y) poin, sehingga saya dapat mengevaluasiY pada sejumlah besar poin.

Pertanyaan

Apakah ada fungsi R yang akan menghitung hubungan acak antara X dan Y?

Secara khusus, saya mencari versi multivarian dari splinefunfungsi, yang menghasilkan fungsi spline untuk kasus univariat.

misalnya ini cara splinefunkerjanya untuk kasus univariat

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

Apa yang saya coba

Saya telah meninjau paket mda , dan tampaknya yang berikut ini berfungsi:

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

tapi saya tidak bisa menemukan cara untuk mengimplementasikan kubik-spline di mars

pembaruan sejak menawarkan hadiah, saya mengubah judul - Jika tidak ada fungsi R, saya akan menerima, sesuai pilihan: fungsi R yang menampilkan fungsi proses gaussian, atau fungsi interpolasi multivarian lain yang melewati titik desain, lebih disukai di R, selain Matlab.


coba fungsi gam (), ini memungkinkan setiap dimensi splines kubik
— user5563

Jawaban:


11

Makalah ini disajikan pada UseR! 2009 tampaknya mengatasi masalah yang sama

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

Ini menyarankan paket DiceKriging http://cran.r-project.org/web/packages/DiceKriging/index.html

Secara khusus, periksa fungsi km dan prediksi.

Berikut adalah contoh interpolasi tiga dimensi. Tampaknya mudah untuk digeneralisasi.

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

Anda membutuhkan lebih banyak data untuk kecocokan spline. mgcv memang merupakan pilihan yang baik. Untuk permintaan spesifik Anda, Anda perlu mengatur spline kubik sebagai fungsi dasar bs = 'cr' dan juga tidak menghukumnya dengan fx = TRUE. Kedua opsi diatur untuk istilah halus yang diatur dengan s (). Prediksi berfungsi seperti yang diharapkan.

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)

Terima kasih atas bantuan Anda, tetapi jika ini adalah spline kubik, bukankah seharusnya saya berharap predict(foo,x)untuk kembali y?
— David LeBauer

Maaf, tidak memperhatikan bahwa Anda menginginkan perkiraan yang sempurna. Maka ternyata mgcv tidak banyak membantu: berhenti ("Dasar hanya menangani 1D smooths") (dari svn.r-project.org/R-packages/trunk/mgcv/R/smooth.r )
— Alex

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.