Montagem estriada cúbica natural e multivariada

17

nota: sem respostas corretas após um mês, reenviei para SO

fundo

Eu tenho um modelo, , onde Y = f ( X )fY=f(X)

é umamatrizde amostras deparâmetroseé ovetordas saídas do modelo.Xn×mmYn×1

f é computacionalmente intensivo, então eu gostaria de aproximar usando um spline cúbico multivariado através de pontos , para que eu possa avaliar em um número maior de pontos.f(X,Y)Y

Questão

Existe uma função R que calcule uma relação arbitrária entre X e Y?

Especificamente, estou procurando uma versão multivariada da splinefunfunção, que gera uma função spline para o caso univariado.

por exemplo, é assim que splinefunfunciona para o caso univariado

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

O que eu tentei

Eu revi o pacote mda e parece que o seguinte deve funcionar:

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

mas não consegui encontrar nenhuma maneira de implementar um spline cúbico no mars

atualização desde a oferta da recompensa, alterei o título - Se não houver função R, aceitaria, em ordem de preferência: uma função R que produz uma função de processo gaussiana ou outra função de interpolação multivariada que passa pelos pontos de design, de preferência em R, mais Matlab.

David LeBauer
fonte
tente gam (função), ele permite que qualquer dimensão de splines cúbicos
user5563

Respostas:

11

Este artigo foi apresentado na UseR! 2009 parece abordar um problema semelhante

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

Ele sugere o pacote DiceKriging http://cran.r-project.org/web/packages/DiceKriging/index.html

Em particular, verifique as funções km e preveja.

Aqui está um exemplo de interpolação tridimensional. Parece ser fácil generalizar.

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
fonte
6

Você precisa de mais dados para um ajuste de spline. mgcv é realmente uma boa escolha. Para sua solicitação específica, você precisa definir o spline cúbico como a função básica bs = 'cr' e também não ser penalizado com fx = TRUE. Ambas as opções são definidas para um termo suave definido com s (). Prever funciona como esperado.

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
fonte
Obrigado por sua ajuda, mas se esse fosse um spline cúbico, não devo esperar predict(foo,x)retornar y?
David LeBauer
Desculpe, você não percebeu que deseja uma aproximação perfeita. Então, aparentemente, o mgcv não ajuda muito: stop ("A base só lida com suavizações 1D") (de svn.r-project.org/R-packages/trunk/mgcv/R/smooth.r )
Alex