如何模拟功能数据?


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

@Macro:不,如果您放大绘图,将会看到它生成的功能不平滑。将它们与这些幻灯片上的某些曲线进行比较:bscb.cornell.edu/~hooker/FDA2007/Lecture1.pdf。x的平滑样条可以解决问题,但我正在寻找一种直接的方法来生成数据。
user603 2012年

每当您包含噪声(这是任何随机模型的必要组成部分)时,原始数据本来就不会很平滑。您所指的样条拟合假设信号是平滑的-而不是实际观察到的数据(信号和噪声的组合)。
Macro

@Macro:将您模拟的过程与本文档第16页的过程进行比较:inference.phy.cam.ac.uk/mackay/gpB.pdf
user603 2012年

1
使用高阶多项式。具有随机系数(具有正确的分布)的20度多项式可以相当(平滑地)改变方向。如果找到问题的答案,也许可以将其发布为答案?
2012年

Answers:


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 2012年

GP的仿真是通过有限的尺寸分布进行的。基本上,您可以选择任意数量的域点,然后从GP的均值和协方差函数中获得多元法线。从该多元法线采样可以为您提供选定点处GP的实现值。正如我已经说过的,只要GP的协方差函数满足必要的分析条件,这些值就近似为平滑函数。二次指数协方差函数(带有“抖动”项)是一个很好的开始。
2012年

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)

试用。 功能流畅


看起来不错!
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.