Fonksiyonel veriler nasıl simüle edilir?


12

Çeşitli fonksiyonel veri analizi yaklaşımlarını test etmeye çalışıyorum. İdeal olarak, simüle edilmiş fonksiyonel veriler üzerinde sahip olduğum yaklaşımlar panelini test etmek istiyorum. Bir Gauss gürültüsü (aşağıdaki kod) toplayan bir yaklaşım kullanarak simüle edilmiş FD oluşturmaya çalıştım, ancak ortaya çıkan eğriler gerçek şeye kıyasla çok sağlam görünüyor .

Birisinin daha gerçekçi görünümlü simüle edilmiş fonksiyonel veriler üretmek için işlevlere / fikirlere bir işaretçi olup olmadığını merak ediyordum. Özellikle, bunlar düzgün olmalıdır. Bu alanda tamamen yeniyim, bu yüzden herhangi bir tavsiye memnuniyetle karşılanır.

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
Sadece ortalaması bilinen düzgün bir işlev olan verileri taklit edip rastgele gürültü ekleyemez misiniz? Örneğin,x=seq(0,2*pi,length=1000); plot(sin(x)+rnorm(1000)/10,type="l");
Makro

@Macro: nop, eğer yakınlaştırırsanız çizdiğiniz fonksiyonların düzgün olmadığını görürsünüz. Bunları bu slaytlardaki bazı eğrilerle karşılaştırın: bscb.cornell.edu/~hooker/FDA2007/Lecture1.pdf . X'inizin düzgünleştirilmiş bir spini hile yapabilir, ancak verileri oluşturmak için doğrudan bir yol arıyorum.
user603

gürültüyü dahil ettiğinizde (herhangi bir stokastik modelin gerekli bir parçasıdır), ham veriler doğal olarak pürüzsüz olmayacaktır. Bahsettiğiniz spline uyumu, sinyalin pürüzsüz olduğunu varsayıyor - gözlemlenen gerçek veriler değil (sinyal ve gürültünün bir kombinasyonu).
Makro

@Macro: Bu belgenin 16. sayfasında bu şekilde simüle süreçleri karşılaştırmak: inference.phy.cam.ac.uk/mackay/gpB.pdf
user603

1
daha yüksek mertebeden polinomlar kullanın. Rastgele katsayıları olan (doğru dağılımlı) 20. dereceden bir polinom yönleri (düzgün bir şekilde) oldukça değiştirebilir. Sorunuza bir cevap bulduysanız, belki de cevap olarak gönderebilirsiniz?
Makro

Yanıtlar:


8

Gauss Süreci'nin (GP) gerçekleşmelerini nasıl simüle edeceğine bir göz atın. Gerçekleştirmelerin düzgünlüğü, GP'nin kovaryans fonksiyonunun analitik özelliklerine bağlıdır. Bu çevrimiçi kitabın birçok bilgisi var: http://uncertainty.stat.cmu.edu/

Bu video GP'lere güzel bir giriş sunuyor: http://videolectures.net/gpip06_mackay_gpb/

Not Yorumunuzla ilgili olarak, bu kod size bir başlangıç ​​verebilir.

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)

Özellikle Gauss sürecinin gerçekleşmelerini nasıl simüle edeceği sorusunu yanıtlayan bir bağlantınız var mı? Bu kitapta yer almıyor (dizine bakıldığında).
user603

Bir GP'nin simülasyonu sonlu boyutlu dağılımlar yoluyla yapılır. Temel olarak, alanın istediğiniz kadar noktasını seçersiniz ve GP'nin ortalama ve kovaryans fonksiyonundan çok değişkenli bir normal elde edersiniz. Bu çok değişkenli normalden örnekleme size GP'nin seçilen noktalardaki gerçekleşmelerinin değerini verir. Söylediğim gibi, GP'nin kovaryans işlevi gerekli analitik koşulları karşıladığı sürece bu değerler düzgün bir işleve yaklaşır. Karesel üstel kovaryans fonksiyonu ("titreşim" terimi ile) iyi bir başlangıçtır.
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)

Bir deneme.  Yumuşak fonksiyonlar


Bu iyi görünüyor!
Zen
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.