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.

David LeBauer
sumber
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
Tony Ladson
sumber
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)
Alex
sumber
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
0

f(X)rpartearth

F. Tusell
sumber
1
f(X)