機能データをシミュレートする方法は?


12

さまざまな機能データ分析アプローチをテストしようとしています。理想的には、シミュレートされた機能データでのアプローチのパネルをテストしたいと思います。ガウスノイズの加算に基づくアプローチ(以下のコード)を使用してシミュレートされたFDを生成しようとしましたが、結果の曲線は実際のものと比較して非常に頑丈に見えます。

もっとリアルな見た目の機能データを生成するための関数/アイデアへのポインタがあるのか​​と思っていました。特に、これらは滑らかでなければなりません。私はこの分野に完全に慣れていないので、どんなアドバイスも歓迎します。

library("MASS")
library("caTools")
VCM<-function(cont,theta=0.99){
    Sigma<-matrix(rep(0,length(cont)^2),nrow=length(cont))
    for(i in 1:nrow(Sigma)){
        for (j in 1:ncol(Sigma)) Sigma[i,j]<-theta^(abs(cont[i]-cont[j]))
    }
    return(Sigma)
}


t1<-1:120
CVC<-runmean(cumsum(rnorm(length(t1))),k=10)
VMC<-VCM(cont=t1,theta=0.99)
sig<-runif(ncol(VMC))
VMC<-diag(sig)%*%VMC%*%diag(sig)
DTA<-mvrnorm(100,rep(0,ncol(VMC)),VMC)  

DTA<-sweep(DTA,2,CVC)
DTA<-apply(DTA,2,runmean,k=5)
matplot(t(DTA),type="l",col=1,lty=1)

1
平均が既知の滑らかな関数であるデータをシミュレートし、ランダムノイズを追加することはできませんか?たとえば、x=seq(0,2*pi,length=1000); plot(sin(x)+rnorm(1000)/10,type="l");
マクロ

@Macro:いいえ、プロットを拡大すると、プロットによって生成された関数が滑らかではないことがわかります。:これらのスライド上の曲線のいくつかにそれらを比較bscb.cornell.edu/~hooker/FDA2007/Lecture1.pdf。Xの平滑化されたスプラインでトリックを行うことができますが、データを生成する直接的な方法を探しています。
user603

ノイズ(確率モデルの必要な部分)を含めると、生データは本質的に滑らかではなくなります。参照しているスプライン適合は、信号が滑らかであると仮定しています-実際の観測データ(信号とノイズの組み合わせ)ではありません。
マクロ

@macro:本書の16ページのものにあなたのシミュレートされたプロセスを比較:inference.phy.cam.ac.uk/mackay/gpB.pdf
user603

1
高次の多項式を使用します。ランダム係数(正しい分布)を持つ20次の多項式は、方向を(滑らかに)かなり大きく変えることができます。質問への回答が見つかった場合は、回答として投稿できますか?
マクロ

回答:


8

ガウス過程(GP)の実現をシミュレートする方法を見てください。実現の滑らかさは、GPの共分散関数の分析特性に依存します。このオンラインブックには多くの情報があります。 http //uncertainty.stat.cmu.edu/

このビデオでは、GPの概要を説明しています。 http //videolectures.net/gpip06_mackay_gpb/

PSあなたのコメントに関して、このコードはあなたに出発点を与えるかもしれません。

library(MASS)
C <- function(x, y) 0.01 * exp(-10000 * (x - y)^2) # covariance function
M <- function(x) sin(x) # mean function
t <- seq(0, 1, by = 0.01) # will sample the GP at these points
k <- length(t)
m <- M(t)
S <- matrix(nrow = k, ncol = k)
for (i in 1:k) for (j in 1:k) S[i, j] = C(t[i], t[j])
z <- mvrnorm(1, m, S)
plot(t, z)

具体的には、ガウス過程の実現をシミュレートする方法の質問に対処するリンクがありますか?これは本では扱われていません(インデックスを見て)。
-user603

GPのシミュレーションは、有限次元分布を通じて行われます。基本的に、ドメインのポイントを必要な数だけ選択し、GPの平均および共分散関数から多変量正規を取得します。この多変量法線からのサンプリングにより、選択したポイントでのGPの実現値が得られます。前述したように、GPの共分散関数が必要な分析条件を満たす限り、これらの値は滑らかな関数に近似します。2次の指数共分散関数(「ジッタ」項を使用)は良い出発点です。

4

OK、ここに私が思いついた答えがあります(本質的にここここから取られてます)。アイデアは、いくつかのランダムなペアを投影することです{バツy}スプラインベースに。その後、(スムーズな)GPから引き分けを得ることが保証されます。

require("MASS")
calcSigma<-function(X1,X2,l=1){
    Sigma<-matrix(rep(0,length(X1)*length(X2)),nrow=length(X1))
    for(i in 1:nrow(Sigma)){
        for (j in 1:ncol(Sigma)) Sigma[i,j]<-exp(-1/2*(abs(X1[i]-X2[j])/l)^2)
    }
    return(Sigma)
}
# The standard deviation of the noise
n.samples<-50
n.draws<-50
x.star<-seq(-5,5,len=n.draws)
nval<-3
f<-data.frame(x=seq(-5,5,l=nval),y=rnorm(nval,0,10))
sigma.n<-0.2
# Recalculate the mean and covariance functions
k.xx<-calcSigma(f$x,f$x)
k.xxs<-calcSigma(f$x,x.star)
k.xsx<-calcSigma(x.star,f$x)
k.xsxs<-calcSigma(x.star,x.star)
f.bar.star<-k.xsx%*%solve(k.xx+sigma.n^2*diag(1,ncol(k.xx)))%*%f$y
cov.f.star<-k.xsxs-k.xsx%*%solve(k.xx+sigma.n^2*diag(1,ncol(k.xx)))%*%k.xxs
values<-matrix(rep(0,length(x.star)*n.samples),ncol=n.samples)
for (i in 1:n.samples)  values[,i]<-mvrnorm(1,f.bar.star,cov.f.star)
values<-cbind(x=x.star,as.data.frame(values))
matplot(x=values[,1],y=values[,-1],lty=1,type="l",col="black")
lines(x.star,f.bar.star,col="red",lwd=2)

トライアル。 スムーズな機能


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