Як моделювати функціональні дані?


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: nop, якщо збільшити масштаб, ви побачите, що породжені ним функції не є гладкими. Порівняйте їх з деякими кривими на цих слайдах: bscb.cornell.edu/~hooker/FDA2007/Lecture1.pdf . Згладжений сплайс ваших x може зробити трюк, але я шукаю прямий спосіб для отримання даних.
user603

у будь-який час, коли ви включаєте шум (який є необхідною частиною будь-якої стохастичної моделі), вихідні дані будуть, по суті, негладкими. Шпагат, який ви маєте на увазі, передбачає, що сигнал є рівним - не фактично спостережувані дані (що є комбінацією сигналу та шуму).
Макрос

@Macro: порівняйте свої імітовані процеси з процесами на сторінці 16 цього документа: inference.phy.cam.ac.uk/mackay/gpB.pdf
user603

1
використовувати поліноми вищого порядку. Поліном 20-го ступеня з випадковими коефіцієнтами (при правильному розподілі) може досить сильно змінювати напрямки (плавно). Якщо ви знайшли відповідь на своє питання, можливо, можете опублікувати його як відповідь?
Макрос

Відповіді:


8

Погляньте, як імітувати реалізацію Гауссового процесу (GP). Плавність реалізацій залежить від аналітичних властивостей коваріаційної функції ГП. Ця онлайн-книга має багато інформації: http://ufetyty.stat.cmu.edu/

Це відео дає приємне вступ до лікарів загальної практики : 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

Моделювання GP здійснюється за допомогою кінцевих розмірних розподілів. В основному, ви вибираєте стільки точок домену, скільки хочете, і з середньої та коваріаційної функції GP ви отримуєте багатоваріантну норму. Відбір проб з цієї багатоваріантної норми дає значення значень реалізованої групи в обраних точках. Як я вже говорив, ці значення наближаються до плавної функції, доки коваріаційна функція GP задовольняє необхідним аналітичним умовам. Квадратична експоненціальна функція коваріації (з терміном "тремтіння") - хороший початок.
Дзен

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)

Випробування.  Плавні функції


Це добре виглядає!
Дзен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.