Çok değişkenli, doğal kübik spline montajı


17

Not: Bir ay sonra hiçbir doğru cevapları, ben reposted var SO

Arka fon

Bir modelim var, f , buradaY=f(X)

X , parametrelerinden örnek matrisidir ve Y , model çıktılarının n \ times 1 vektörüdür.n×mmYn×1

f hesaplama açısından yoğundur, bu nedenle f'yi (X, Y) noktaları füzerinden çok değişkenli bir kübik spline kullanarak f'ye yakınlaştırmak istiyorum , böylece Y'yi daha fazla sayıda noktada değerlendirebilirim.(X,Y)Y

Soru

X ve Y arasında rastgele bir ilişki hesaplayacak bir R işlevi var mı?

Özellikle, splinefuntek değişkenli durum için bir spline işlevi üreten işlevin çok değişkenli bir sürümünü arıyorum .

örneğin splinefun, tek değişkenli durum için böyle çalışır

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

Ne denedim

Ben inceledim mda paketi ve şu çalışması gerektiğini görünüyor:

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

ama kübik spline uygulamak için herhangi bir yol bulamadım mars

ödül teklifinden bu yana güncelleme , başlığı değiştirdim - R işlevi yoksa, tercih sırasına göre kabul ediyorum: bir gauss işlem fonksiyonu çıkaran bir R fonksiyonu veya tasarım noktalarından geçen başka bir çok değişkenli enterpolasyon fonksiyonu, tercihen R, başka Matlab.


gam () işlevini deneyin, kübik spline'ların herhangi bir boyutuna izin verir
user5563 27:11

Yanıtlar:


11

Bu makale UseR! 2009 benzer bir sorunu ele alıyor gibi görünüyor

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

DiceKriging paketini http://cran.r-project.org/web/packages/DiceKriging/index.html önerir.

Özellikle km ve tahmin fonksiyonlarını kontrol edin.

İşte üç boyutlu enterpolasyon örneği. Genellemek basit görünüyor.

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

Spline oturması için daha fazla veriye ihtiyacınız var. mgcv gerçekten iyi bir seçimdir. Özel isteğiniz için kübik spline'ı bs = 'cr' temel işlevi olarak ayarlamanız ve ayrıca fx = TRUE ile cezalandırılmamış olmanız gerekir. Her iki seçenek de s () ile ayarlanmış yumuşak bir terim için ayarlanır. Tahmin beklendiği gibi çalışır.

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)

Yardımın için teşekkür ederim, ama bu kübik bir spline olsaydı, predict(foo,x)geri dönmeyi beklememeliydim y?
David LeBauer

Üzgünüz, mükemmel bir yaklaşım istediğinizi fark etmedim. Görünüşe göre mgcv çok yardımcı değil: stop ("Basis sadece 1D pürüzsüzlükleri işliyor ") (from svn.r-project.org/R-packages/trunk/mgcv/R/smooth.r )
Alex

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.