Wie werden Funktionsdaten simuliert?

12

Ich versuche verschiedene Ansätze zur Funktionsdatenanalyse zu testen. Idealerweise möchte ich das Panel meiner Ansätze an simulierten Funktionsdaten testen. Ich habe versucht, eine simulierte FD mithilfe eines Ansatzes zu generieren, der auf einer Summierung von Gaußschen Rauschen basiert (Code unten), aber die resultierenden Kurven sehen im Vergleich zur Realität viel zu rau aus .

Ich fragte mich, ob jemand einen Zeiger auf Funktionen / Ideen hatte, um realistisch aussehende simulierte Funktionsdaten zu generieren. Insbesondere sollten diese glatt sein. Ich bin völlig neu in diesem Bereich, daher sind Ratschläge willkommen.

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)
user603
quelle
1
Können Sie nicht einfach Daten simulieren, deren Mittelwert eine bekannte glatte Funktion ist, und zufälliges Rauschen hinzufügen? Zum Beispielx=seq(0,2*pi,length=1000); plot(sin(x)+rnorm(1000)/10,type="l");
Makro
@Macro: Nein, wenn Sie in Ihre Zeichnung hineinzoomen, werden Sie feststellen, dass die von ihr erzeugten Funktionen nicht flüssig sind. Vergleichen Sie sie mit einigen Kurven auf diesen Folien: bscb.cornell.edu/~hooker/FDA2007/Lecture1.pdf . Ein geglätteter Spline Ihres X könnte den Trick tun, aber ich suche nach einem direkten Weg, um die Daten zu generieren.
user603
Immer wenn Sie Rauschen einbeziehen (was ein notwendiger Bestandteil jedes stochastischen Modells ist), sind die Rohdaten von Natur aus nicht glatt. Die Spline-Anpassung, auf die Sie sich beziehen, basiert auf der Annahme, dass das Signal glatt ist - nicht auf den tatsächlich beobachteten Daten (die eine Kombination aus Signal und Rauschen darstellen).
Makro
@Macro: Vergleichen Sie Ihre simulierten Prozesse mit denen auf Seite 16 dieses Dokuments: inference.phy.cam.ac.uk/mackay/gpB.pdf
user603
1
Verwenden Sie Polynome höherer Ordnung. Ein Polynom des 20. Grades mit zufälligen Koeffizienten (mit der richtigen Verteilung) kann die Richtungen (glatt) ziemlich viel ändern. Wenn Sie eine Antwort auf Ihre Frage gefunden haben, können Sie diese vielleicht als Antwort posten?
Makro

Antworten:

8

Sehen Sie sich an, wie Sie Realisierungen eines Gaußschen Prozesses (GP) simulieren können. Die Glätte der Realisierungen hängt von den analytischen Eigenschaften der Kovarianzfunktion des GP ab. Dieses Online-Buch enthält viele Informationen: http://uncertainty.stat.cmu.edu/

Dieses Video gibt eine schöne Einführung in die Hausärzte : http://videolectures.net/gpip06_mackay_gpb/

PS In Bezug auf Ihren Kommentar kann dieser Code Ihnen einen Anfang geben.

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
quelle
Haben Sie einen Link, der sich speziell mit der Frage befasst, wie Realisierungen eines Gaußschen Prozesses simuliert werden können? Dies wird im Buch nicht angesprochen (siehe Index).
user603
Die Simulation eines GP erfolgt über die endlichen Dimensionsverteilungen. Grundsätzlich wählen Sie so viele Punkte der Domäne aus, wie Sie möchten, und aus der Mittelwert- und Kovarianzfunktion des GP erhalten Sie eine multivariate Norm. Das Abtasten von dieser multivariaten Norm gibt Ihnen den Wert der Realisierungen des GP an den ausgewählten Punkten. Wie gesagt, diese Werte entsprechen ungefähr einer glatten Funktion, solange die Kovarianzfunktion des GP die erforderlichen analytischen Bedingungen erfüllt. Eine quadratische exponentielle Kovarianzfunktion (mit einem "Jitter" -Term) ist ein guter Anfang.
Zen
4

Ok, hier ist die Antwort, die ich mir ausgedacht habe (sie stammt im Wesentlichen von hier und hier ). Die Idee ist, einige zufällige Paare zu projizieren{xich,yich}

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)

Ein Versuch.  Reibungslose Funktionen

user603
quelle
Das sieht gut aus!
Zen