2013-05-15 7 views
2

Я хотел бы, чтобы соответствовать поверхности для некоторых значений:интерполировать в 3 размерных сплайна в R

x = 1:10 
y = 10:1 
z = sample(1:10,10) 

Я хотел бы весело что-то вроде spline_function(z ~ x + y). Фактические функции сплайнов в R, по-видимому, принимают только x и y, так что я не могу иметь двумерную координату x. Каков способ сделать это в R? Я знаю loess для локальных полиномов и т. Д., Но сплайны действительно то, что я ищу.

+0

Этот вопрос может ответить на ваши ...? http://stackoverflow.com/questions/7142180/is-there-an-r-library-that-estimates-a-multivariate-natural-cubic-spline-or-sim – Frank

ответ

9

Один хороший вариант является mgcv пакет, который поставляется со всеми версиями R. Он имеет изотропные наказываться регрессии шлицы двух или более переменных через s() и анизотропных нарушает регрессионных сплайнов двух или более переменных с помощью тензорных произведений и te().

Если вы не хотите оштрафованных сплайнов регрессии, вы можете использовать аргумент fx = TRUE для исправления известных степеней свободы сплайнов.

Вот пример из ?te

# following shows how tensor pruduct deals nicely with 
# badly scaled covariates (range of x 5% of range of z) 
require(mgcv) 
test1 <- function(x, z ,sx=0.3, sz=0.4) { 
    x <- x*20 
    (pi ** sx * sz) * (1.2 * exp(-(x - 0.2)^2/sx^2 - (z - 0.3)^2/sz^2) + 
    0.8 * exp(-(x - 0.7)^2/sx^2 -(z - 0.8)^2/sz^2)) 
} 
n <- 500 

old.par<-par(mfrow=c(2,2)) 
x <- runif(n)/20 
z<-runif(n) 
xs <- seq(0, 1, length=30)/20 
zs <- seq(0, 1, length=30) 
pr <- data.frame(x=rep(xs, 30), z=rep(zs, rep(30, 30))) 
truth <- matrix(test1(pr$x, pr$z), 30, 30) 
f <- test1(x, z) 
y <- f + rnorm(n) * 0.2 

## model 1 with s() smooths 
b1 <- gam(y ~ s(x,z)) 
persp(xs, zs, truth) 
title("truth") 
vis.gam(b1) 
title("t.p.r.s") 

## model 2 with te() smooths 
b2 <- gam(y ~ te(x, z)) 
vis.gam(b2) 
title("tensor product") 

## model 3 te() smooths specifying margin bases 
b3 <- gam(y ~ te(x, z, bs=c("tp", "tp"))) 
vis.gam(b3) 
title("tensor product") 
par(old.par) 

enter image description here

+0

awesome - спасибо. – Alex