Raccordo multivariato, scanalatura cubica naturale


17

nota: senza risposte corrette dopo un mese, ho ripubblicato su SO

sfondo

Ho un modello, , dove Y = f ( X )fY=f(X)

è unamatrice n × m di campioni daiparametri m e Y è ilvettore n × 1 delle uscite del modello.Xn×mmYn×1

è intensivo dal punto di vista computazionale, quindi vorrei approssimare f usando una spline cubica multivariata attraverso punti ( X , Y ) , in modo da poter valutare Y in un numero maggiore di punti.ff(X,Y)Y

Domanda

Esiste una funzione R che calcolerà una relazione arbitraria tra X e Y?

In particolare, sto cercando una versione multivariata della splinefunfunzione, che genera una funzione spline per il caso univariato.

ad esempio, è così che splinefunfunziona per il caso univariato

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

Quello che ho provato

Ho esaminato il pacchetto mda e sembra che dovrebbe funzionare quanto segue:

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

ma non sono riuscito a trovare alcun modo per implementare una spline cubica in mars

aggiornamento da quando ho offerto la taglia, ho cambiato il titolo - Se non ci fosse la funzione R, accetterei, in ordine di preferenza: una funzione R che emette una funzione di processo gaussiana o un'altra funzione interpolante multivariata che passa attraverso i punti di progettazione, preferibilmente in R, altrimenti Matlab.


prova la funzione gam (), consente qualsiasi dimensione di spline cubiche
user5563

Risposte:


11

Questo documento presentato a UseR! Il 2009 sembra affrontare un problema simile

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

Suggerisce il pacchetto DiceKriging http://cran.r-project.org/web/packages/DiceKriging/index.html

In particolare, controllare le funzioni km e prevedere.

Ecco un esempio di interpolazione tridimensionale. Sembra essere semplice da generalizzare.

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

Sono necessari più dati per adattarsi alla spline. mgcv è davvero una buona scelta. Per la tua specifica richiesta devi impostare la spline cubica come funzione base bs = 'cr' e non farla penalizzare con fx = TRUE. Entrambe le opzioni sono impostate per un termine regolare impostato con s (). Predict funziona come previsto.

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)

Grazie per il vostro aiuto, ma se questa fosse una spline cubica, non dovrei aspettarmi predict(foo,x)di tornare y?
David LeBauer,

Spiacenti, non ho notato che desideri un'approssimazione perfetta. Quindi apparentemente mgcv non è di grande aiuto: stop ("La base gestisce solo i smooths 1D") (da svn.r-project.org/R-packages/trunk/mgcv/R/smooth.r )
Alex

0

Non si forniscono dettagli sulla forma della funzione f(X); potrebbe essere che una funzione costante a tratti sia un'approssimazione sufficientemente buona, nel qual caso potresti voler adattare un albero di regressione (con pacchetto rpartper esempio). Altrimenti, potresti voler esaminare il pacchetto earth, oltre a quello che è già stato suggerito.


1
la forma di f(X)va oltre lo scopo di questo problema, ma è un modello dinamico di vegetazione globale descritto nell'appendice di Medvigy et al 2009
David LeBauer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.