19 votos

Ajuste de splines cúbicos naturales multivariantes

nota: sin respuestas correctas después de un mes, he vuelto a publicar a SO

Fondo

Tengo un modelo, $f$ donde $Y=f(\textbf{X})$

$\textbf{X}$ es un $n \times m$ matriz de muestras de $m$ parámetros y $Y$ es el $n \times 1$ vector de resultados del modelo.

$f$ es computacionalmente intensivo, por lo que me gustaría aproximar $f$ utilizando un spline cúbico multivariante mediante $(X,Y)$ puntos, para poder evaluar $Y$ en un mayor número de puntos.

Pregunta

¿Existe una función R que calcule una relación arbitraria entre X e Y?

En concreto, estoy buscando una versión multivariante del splinefun que genera una función spline para el caso univariante.

Por ejemplo splinefun funciona para el caso univariante

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

Lo que he probado

He revisado el mda y parece que lo siguiente debería 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

pero no pude encontrar ninguna manera de implementar un cúbico-spline en mars

actualización desde que ofrecí la recompensa, cambié el título - Si no hay una función R, aceptaría, en orden de preferencia: una función R que produzca una función de proceso gaussiano, u otra función interpoladora multivariante que pase por los puntos de diseño, preferiblemente en R, si no Matlab.

12voto

Jimit Puntos 188

Este artículo presentado en UseR! 2009 parece abordar un problema similar

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

Sugiere el paquete DiceKriging http://cran.r-project.org/web/packages/DiceKriging/index.html

En particular, comprueba las funciones km y predict.

He aquí un ejemplo de interpolación tridimensional. Parece fácil de 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

6voto

Alex Puntos 844

Necesitas más datos para un ajuste spline. mgcv es sin duda una buena opción. Para su solicitud específica necesita establecer el spline cúbico como la función base bs='cr' y también no tenerlo penalizado con fx=TRUE. Ambas opciones se establecen para un término suave que se establece con s(). Predict funciona como se esperaba.

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)

0voto

Zolomon Puntos 250

No da detalles sobre la forma de la función $f(X)$ puede que una función constante a trozos sea una aproximación suficientemente buena, en cuyo caso puede que desee ajustar un árbol de regresión (con el paquete rpart por ejemplo). De lo contrario, puede que desee consultar el paquete earth Además de lo que ya se ha sugerido.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X