¿Cómo simular datos funcionales?

12

Estoy tratando de probar varios enfoques de análisis de datos funcionales. Idealmente, me gustaría probar el panel de enfoques que tengo sobre datos funcionales simulados. Intenté generar FD simulada utilizando un enfoque basado en un ruido gaussiano sumador (código a continuación), pero las curvas resultantes se ven demasiado resistentes en comparación con las reales .

Me preguntaba si alguien tenía un puntero a funciones / ideas para generar datos funcionales simulados de aspecto más realista. En particular, estos deben ser suaves. Soy completamente nuevo en este campo, por lo que cualquier consejo es bienvenido.

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)
usuario603
fuente
1
¿No puede simplemente simular datos cuya media es una función suave conocida y agregar ruido aleatorio? Por ejemplo,x=seq(0,2*pi,length=1000); plot(sin(x)+rnorm(1000)/10,type="l");
Macro
@Macro: nop, si amplías tu trama verás que las funciones que genera no son suaves. Compárelos con algunas de las curvas en estas diapositivas: bscb.cornell.edu/~hooker/FDA2007/Lecture1.pdf . Una spline suavizada de sus x podría hacer el truco, pero estoy buscando una forma directa de generar los datos.
user603
cada vez que incluya ruido (que es una parte necesaria de cualquier modelo estocástico), los datos sin procesar serán, inherentemente, no uniformes. El ajuste de spline al que te refieres es asumir que la señal es suave, no los datos observados reales (que es una combinación de señal y ruido).
Macro
@Macro: compare sus procesos simulados con los de la página 16 de este documento: inference.phy.cam.ac.uk/mackay/gpB.pdf
user603
1
usa polinomios de orden superior. Un polinomio de 20º grado con coeficientes aleatorios (con la distribución correcta) puede cambiar de dirección (sin problemas) bastante. Si ha encontrado una respuesta a su pregunta, ¿puede publicarla como respuesta?
Macro

Respuestas:

8

Eche un vistazo a cómo simular realizaciones de un Proceso Gaussiano (GP). La suavidad de las realizaciones depende de las propiedades analíticas de la función de covarianza del GP. Este libro en línea tiene mucha información: http://uncertainty.stat.cmu.edu/

Este video ofrece una buena introducción a los médicos de cabecera: http://videolectures.net/gpip06_mackay_gpb/

PD: Con respecto a tu comentario, este código puede darte un comienzo.

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
fuente
¿Tiene un enlace que aborde la cuestión de cómo simular concretamente las realizaciones de un proceso gaussiano? Esto no se menciona en el libro (mirando el índice).
user603
La simulación de un GP se realiza a través de distribuciones dimensionales finitas. Básicamente, usted elige tantos puntos del dominio como desee, y de la función de media y covarianza del GP obtiene una normal multivariada. El muestreo de esta normalidad multivariante le da el valor de las realizaciones del GP en los puntos elegidos. Como he dicho, estos valores se aproximan a una función suave, siempre que la función de covarianza del GP satisfaga las condiciones analíticas necesarias. Una buena función de covarianza exponencial cuadrática (con un término "jitter") es un buen comienzo.
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)

Un juicio  Funciones suaves

usuario603
fuente
¡Esto luce bien!
Zen