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.