Pasuje do wielowymiarowego, naturalnego sześciennego splajnu

17

uwaga: bez poprawnych odpowiedzi po miesiącu, przeszedłem do SO

tło

Mam model, , gdzie Y = f ( X )faY=fa(X)

jestmacierzą n × m próbek z m parametrów, a Y jestwektorem n × 1 wyników modelu.Xn×mmYn×1

jest intensywne obliczeniowo, więc chciałbym aproksymować f za pomocą wielowymiarowego splajnu sześciennego przezpunkty ( X , Y ) , aby móc ocenić Y w większej liczbie punktów.fafa(X,Y)Y

Pytanie

Czy istnieje funkcja R, która obliczy dowolną zależność między X i Y?

W szczególności szukam wielowymiarowej wersji splinefunfunkcji, która generuje funkcję splajnu dla przypadku jednowymiarowego.

np. tak splinefundziała przypadek jednoczynnikowy

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

Co próbowałem

Sprawdziliśmy na MDA pakiet, a wydaje się, że powinien pracować co następuje:

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

ale nie mogłem znaleźć żadnego sposobu na implementację splajnu sześciennego mars

zaktualizuj od czasu zaoferowania nagrody, zmieniłem tytuł - Jeśli nie ma funkcji R, zaakceptowałbym, w kolejności preferencji: funkcję R, która wyprowadza funkcję procesu gaussowskiego, lub inną funkcję interpolacji wielowymiarowej, która przechodzi przez punkty projektowe, najlepiej w R, inaczej Matlab.

David LeBauer
źródło
wypróbuj funkcję gam (), pozwala na dowolny wymiar splajnów sześciennych
user5563

Odpowiedzi:

11

Artykuł zaprezentowany na UseR! Wydaje się, że rok 2009 rozwiązuje podobny problem

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

Sugeruje pakiet DiceKriging http://cran.r-project.org/web/packages/DiceKriging/index.html

W szczególności sprawdź funkcje km i przewiduj.

Oto przykład trójwymiarowej interpolacji. Uogólnienie wydaje się proste.

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
źródło
6

Potrzebujesz więcej danych do dopasowania splajnu. mgcv rzeczywiście jest dobrym wyborem. Dla konkretnego żądania musisz ustawić splajn sześcienny jako funkcję podstawową bs = 'cr', a także nie karać go za pomocą fx = TRUE. Obie opcje są ustawione na gładki termin, który jest ustawiany za pomocą s (). Prognozowanie działa zgodnie z oczekiwaniami.

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
źródło
Dziękuję za pomoc, ale jeśli to byłby sześcienny splajn, czy nie powinienem oczekiwać predict(foo,x)powrotu y?
David LeBauer,
Przepraszamy, nie zauważyłem, że chcesz uzyskać idealne przybliżenie. Zatem najwyraźniej mgcv nie jest zbyt pomocny: stop („Podstawa obsługuje tylko wygładzanie 1D”) (od svn.r-project.org/R-packages/trunk/mgcv/R/smooth.r )
Alex
0

Nie podajesz żadnych szczegółów co do formy funkcji fa(X); może być tak, że cząstkowa stała funkcja jest wystarczająco dobrym przybliżeniem, w którym to przypadku możesz chcieć dopasować drzewo regresji ( rpartna przykład z pakietem ). W przeciwnym razie możesz spojrzeć na pakiet earth, oprócz tego, co już zostało zasugerowane.

F. Tusell
źródło
1
forma fa(X)wykracza poza zakres tego problemu, ale jest to dynamiczny model globalnej wegetacji opisany w załączniku Medvigy i in. 2009
David LeBauer