多変量の自然な3次スプラインの近似


17

注: 1か月後に正しい答えが得られないため、SOに再投稿しました

バックグラウンド

モデルがあり、Y = f XfY=f(X)

n × m m Y n × 1Xはパラメーターからのサンプルの行列で、はモデル出力のベクトルです。n×mmYn×1

f X Y Yfは計算量が多いためポイントを通る多変量3次スプラインを使用してを近似し、より多くのポイントでを評価できるようにします。fバツYY

質問

XとYの間の任意の関係を計算するR関数はありますか?

具体的にはsplinefun、単変量の場合にスプライン関数を生成する関数の多変量バージョンを探しています。

たとえば、これはsplinefun単変量の場合にどのように機能するかです

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

私が試したこと

mdaパッケージを確認しましたが、次のように動作するはずです。

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

しかし、3次スプラインを実装する方法を見つけることができませんでした mars

バウンティを提供してから更新し、タイトルを変更しました-R関数がない場合、優先順に受け入れます:ガウスプロセス関数を出力するR関数、またはデザインポイントを通過する別の多変量補間関数、できればR、それ以外はMatlab。


gam()関数を試してください。3次スプラインの任意の次元を許可します
-user5563

回答:


11

この論文はUseRで発表されました!2009年も同様の問題に対処しているようです

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

DiceKrigingパッケージhttp://cran.r-project.org/web/packages/DiceKriging/index.htmlを推奨します

特に、関数kmを確認して予測します。

3次元補間の例を次に示します。一般化するのは簡単なようです。

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

スプライン近似にはより多くのデータが必要です。確かにmgcvは良い選択です。特定の要求に対して、キュービックスプラインを基底関数bs = 'cr'として設定し、fx = TRUEでペナルティを課さないようにする必要があります。両方のオプションは、s()で設定されるスムーズな用語に対して設定されます。予測どおりに動作します。

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)

ご協力いただきありがとうございますが、これは次スプラインであれば、私は期待すべきではありませんpredict(foo,x)返すようにy
デビッドルバウアー

申し訳ありませんが、完全な近似値が必要なことに気付きませんでした。それから明らかにmgcvはあまり役に立ちません:stop( "ベースは1Dスムースのみを処理します")(svn.r-project.org/R-packages/trunk/mgcv/R/smooth.rから)
アレックス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.