Bagaimana cara mensimulasikan data fungsional?

12

Saya mencoba menguji berbagai pendekatan analisis data fungsional. Idealnya, saya ingin menguji panel pendekatan yang saya miliki pada data fungsional yang disimulasikan. Saya sudah mencoba untuk menghasilkan FD simulasi menggunakan pendekatan berdasarkan pada penjumlahan Gaussian noise (kode di bawah), tetapi kurva yang dihasilkan terlihat terlalu kasar dibandingkan dengan yang asli .

Saya bertanya-tanya apakah seseorang memiliki pointer ke fungsi / ide untuk menghasilkan data fungsional yang disimulasikan lebih realistis. Secara khusus, ini harus mulus. Saya benar-benar baru di bidang ini sehingga semua saran disambut

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)
pengguna603
sumber
1
Tidak bisakah Anda mensimulasikan data yang rata-rata merupakan fungsi halus yang dikenal dan menambahkan noise acak? Misalnya,x=seq(0,2*pi,length=1000); plot(sin(x)+rnorm(1000)/10,type="l");
Makro
@ Macro: tidak, jika Anda memperbesar alur Anda akan melihat bahwa fungsi yang dihasilkannya tidak mulus. Bandingkan mereka dengan beberapa kurva pada slide ini: bscb.cornell.edu/~hooker/FDA2007/Lecture1.pdf . Spline smoothed dari x Anda dapat melakukan triknya, tetapi saya sedang mencari cara langsung untuk menghasilkan data.
user603
kapan saja Anda memasukkan noise (yang merupakan bagian penting dari model stokastik apa pun), data mentah akan, pada dasarnya, tidak mulus. Kecocokan spline yang Anda maksudkan adalah mengasumsikan sinyalnya halus - bukan data aktual yang diamati (yang merupakan kombinasi dari sinyal dan derau).
Makro
@ Macro: bandingkan proses simulasi Anda dengan yang ada di halaman 16 dokumen ini: inference.phy.cam.ac.uk/mackay/gpB.pdf
user603
1
gunakan polinomial orde tinggi. Polinomial derajat 20 dengan koefisien acak (dengan distribusi yang tepat) dapat mengubah arah (lancar) cukup banyak. Jika Anda menemukan jawaban untuk pertanyaan Anda, mungkin Anda dapat mempostingnya sebagai jawaban?
Makro

Jawaban:

8

Lihatlah bagaimana mensimulasikan realisasi Gaussian Process (GP). Kelancaran realisasi tergantung pada sifat analitik fungsi kovarians GP. Buku online ini memiliki banyak informasi: http://uncertainty.stat.cmu.edu/

Video ini memberikan pengantar yang bagus untuk GP: http://videolectures.net/gpip06_mackay_gpb/

PS Mengenai komentar Anda, kode ini dapat memberi Anda awal.

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)
Zen
sumber
Apakah Anda memiliki tautan yang menjawab pertanyaan tentang bagaimana mensimulasikan realisasi proses Gaussian, khususnya? Ini tidak dibahas dalam buku (melihat indeks).
user603
Simulasi GP dilakukan melalui distribusi dimensi hingga. Pada dasarnya, Anda memilih poin sebanyak mungkin dari domain yang Anda inginkan, dan dari fungsi rata-rata dan kovarian GP Anda memperoleh multivarian normal. Pengambilan sampel dari normal multivarian ini memberi Anda nilai realisasi GP pada titik-titik yang dipilih. Seperti yang saya katakan, nilai-nilai ini mendekati fungsi yang halus, selama fungsi kovarians dari GP memenuhi kondisi analitik yang diperlukan. Fungsi kovarians eksponensial kuadratik (dengan istilah "jitter") adalah awal yang baik.
Zen
4

{xi,yi}

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)

Uji coba.  Fungsi halus

pengguna603
sumber
Ini terlihat bagus!
Zen