#Ligne 83 dans epclust/R/computeWerDists.R : # TODO: # [X,period,scale,coix] = #wavelet(x(:,2),dt,Args.Pad,Args.Dj,Args.S0,Args.J1,Args.Mother);%#ok #[Y,period,scale,coiy] = wavelet(y(:,2),dt,Args.Pad,Args.Dj,Args.S0,Args.J1,Args.Mother); # #%Smooth X and Y before truncating! (minimize coi) #%sinv=1./(scale'); #% #% #%sX=smoothwavelet(sinv(:,ones(1,nx)).*(abs(X).^2),dt,period,Args.Dj,scale); #%sY=smoothwavelet(sinv(:,ones(1,ny)).*(abs(Y).^2),dt,period,Args.Dj,scale); #% #%Wxy=X.*conj(Y); #% #%% ----------------------- Wavelet coherence --------------------------------- #%sWxy=smoothwavelet(sinv(:,ones(1,n)).*Wxy,dt,period,Args.Dj,scale); #%Rsq=abs(sWxy).^2./(sX.*sY); # #https://github.com/grinsted/wavelet-coherence/blob/master/wtc.m library(Rwave) # CWT library(cluster) # pam #library(flexclust) # kcca toCWT <- function(X, sw= 0, tw= 0, swabs= 0, nvoice= 12, noctave= 5, s0= 2, w0= 2*pi, lt= 24, dt= 0.5, spectra = FALSE, smooth = TRUE, scaled = FALSE, scalevector) { noctave <- adjust.noctave(lt, dt, s0, tw, noctave) if(missing(scalevector)) scalevector <- 2^(0:(noctave * nvoice) / nvoice) * s0 res <- lapply(1:nrow(X), function(n) { tsX <- ts( X[n,] ) tsCent <- tsX - mean(tsX) if(scaled) tsCent <- ts(scale(tsCent)) tsCent.cwt <- cwt.ts(tsCent, s0, noctave, nvoice, w0) tsCent.cwt } ) if( spectra ) res <- lapply(res, function(l) Mod(l)^2 ) if( smooth ) res <- lapply(res, smCWT, swabs = swabs, tw = tw, dt = dt, scalevector = scalevector) resArray <- array(NA, c(nrow(res[[1]]), ncol(res[[1]]), length(res))) for( l in 1:length(res) ) resArray[ , , l] <- res[[l]] resArray } # =============================================================== smCWT <- function(CWT, sw= 0, tw= 0, swabs= 0, nvoice= 12, noctave= 2, s0= 2, w0= 2*pi, lt= 24, dt= 0.5, scalevector ) { # noctave <- adjust.noctave(lt, dt, s0, tw, noctave) # scalevector <- 2^(0:(noctave * nvoice) / nvoice) * s0 wsp <- Mod(CWT) smwsp <- smooth.matrix(wsp, swabs) smsmwsp <- smooth.time(smwsp, tw, dt, scalevector) smsmwsp } # =============================================================== toDWT <- function(x, filter.number = 6, family = "DaubLeAsymm") { x2 <- spline(x, n = 2^ceiling( log(length(x), 2) ), method = 'natural')$y Dx2 <- wd(x2, family = family, filter.number = filter.number)$D Dx2 } # =============================================================== contrib <- function(x) { J <- log( length(x)+1, 2) nrj <- numeric(J) t0 <- 1 t1 <- 0 for( j in 1:J ) { t1 <- t1 + 2^(J-j) nrj[j] <- sqrt( sum( x[t0:t1]^2 ) ) t0 <- t1 + 1 } return(nrj) } # ========================================= distance for coh === coherence <- function( x, y) { J <- log(length(x) + 1, 2) t0 <- 1 sg2_x <- 0 sg2_y <- 0 sg_xy <- 0 for(j in 0:(J - 1)) { t1 <- t0 + 2^(J - j)/2 - 1 tt <- t0:t1 sg2_x <- sg2_x + mean(x[t0:t1]^2) sg2_y <- sg2_y + mean(y[t0:t1]^2) sg_xy <- sg_xy + mean(x[t0:t1] * y[t0:t1]) t0 <- t1 + 1 } res <- sg_xy^2 / sg2_x / sg2_y res } vect2mat <- function(vect){ vect <- as.vector(vect) matrix(vect[-(1:2)], delta, lscvect) } # ========================================= # myimg for graphics jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000")) myimg <- function(MAT, x = 1:nrow(MAT), y = 1:col(MAT), ... ) filled.contour( x = x, y = y, z = MAT, xlab= 'Time', ylab= 'scale', color.palette = jet.colors, ... ) #TODO: [plus tard] alternative à sowa (package disparu) : cwt.. #source("sowas-superseded.r") # auxiliary CWT functions cwt.ts <- function(ts,s0,noctave=5,nvoice=10,w0=2*pi){ if (class(ts)!="ts"){ cat("# This function needs a time series object as input. You may construct this by using the function ts(data,start,deltat). Try '?ts' for help.\n") } else{ t=time(ts) dt=t[2]-t[1] s0unit=s0/dt*w0/(2*pi) s0log=as.integer((log2(s0unit)-1)*nvoice+1.5) if (s0log<1){ cat(paste("# s0unit = ",s0unit,"\n",sep="")) cat(paste("# s0log = ",s0log,"\n",sep="")) cat("# s0 too small for w0! \n") } totnoct=noctave+as.integer(s0log/nvoice)+1 totts.cwt=cwt(ts,totnoct,nvoice,w0,plot=0) ts.cwt=totts.cwt[,s0log:(s0log+noctave*nvoice)] #Normalization sqs <- sqrt(2^(0:(noctave*nvoice)/nvoice)*s0) smat <- matrix(rep(sqs,length(t)),nrow=length(t),byrow=TRUE) ts.cwt*smat } } ##################################### # WSP ##################################### wsp <- function(ts,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,siglevel=0.95,critval=NULL,nreal=1000,arealsiglevel=0.9,kernel=0,markt=-999,marks=-999,logscale=FALSE,plot=TRUE,units="",device="screen",file="wsp",color=TRUE,pwidth=10,pheight=7,labsc=1,labtext="",sigplot=3){ if (class(ts)!="ts"){ cat("# This function needs a time series object as input. You may construct this by using the function ts(data,start,deltat). Try '?ts' for help.\n") } else{ if (sw!=0 & swabs==0) swabs <- as.integer(sw*nvoice) if (swabs!=0 & sw==0) sw <- swabs/nvoice sllist <- checkarealsiglevel(sw,tw,w0,arealsiglevel,siglevel,0) arealsiglevel <- sllist$arealsiglevel siglevel <- sllist$siglevel at <- NULL t <- time(ts) dt <- deltat(ts) s0rem <- s0 s0 <- adjust.s0(s0,dt) dnoctave <- as.integer(log(s0/s0rem-0.000000000001)/log(2))+1 noctave <- adjust.noctave(length(ts),dt,s0,tw,noctave) scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 tsanom <- ts-mean(ts) #WAVELET TRANSFORMATION ts.cwt <- cwt.ts(tsanom,s0,noctave,nvoice,w0) #SMOOTHING wsp <- smooth.matrix(Mod(ts.cwt)^2,swabs) smwsp <- smooth.time(wsp,tw,dt,scalevector) #POINTWISE SIGNIFICANCE TEST if (is.null(critval)==FALSE){ # is critval empty? if (dim(critval)[2]!=dim(smwsp)[2]){ # is critval of the wrong dimension? if (siglevel[1]!=0 & nreal!=0) critval <- criticalvaluesWSP(tsanom,s0,noctave,nvoice,w0,swabs,tw,siglevel,nreal) #critval is of wrong dimension and siglevel and nreal are given else { critval <- NULL # no test possible arealsiglevel <- 0 cat("# dimension of critval is wrong \n") cat("# areawise test only possible with pointwise test \n") } } } else{ # critval is empty, but nreal or siglevel is given if (siglevel[1]!=0 & nreal!=0) critval <- criticalvaluesWSP(tsanom,s0,noctave,nvoice,w0,swabs,tw,siglevel,nreal) else { critval <- NULL arealsiglevel <- 0 cat("# areawise test only possible with pointwise test \n") } } #AREAL SIGNIFICANCE TEST if (arealsiglevel!=0){ v <- critval[1,] v[v==0] <- 9999 cvmat <- matrix(rep(v,length(t)),nrow=length(t),byrow=TRUE) atest <- arealtest(smwsp/cvmat,dt,s0,noctave,nvoice,w0,swabs,tw,siglevel,arealsiglevel,kernel,0) at <- atest$at kernel <- atest$kernel } if (s0rem1) cv[i] <- 1 cat(paste("# significance testing, cv=",cv[i]," \n",sep="")) } cv } ############################# # AREAWISE SIGNIFICANCE TEST ############################# slide <- function(data,kernellist,s0,noctave,nvoice,cv){ # slides kernel over data set #---------------------------- # data: matrix containing data # kernellist: matrix containing kernel # s0: lowest scale # noctave: number of octaves # nvoice: number of voices per octave # cv: critical value, all values higher are set to one #Time: (rows) n,i the kernel is to be scaled in this direction #Scale: (cols) m,j data[data1){ linewidth <- 1 if (sigplot==3) linewidth <- 5 contour(x=t,z=at,levels=0.5,add=TRUE,drawlabels=FALSE,axes=FALSE,lwd=linewidth,col="black") } } plotcv <- function(t,wt,cv){ if (length(dim(cv))==0) contour(x=t,z=wt,levels=c(cv),drawlabels=FALSE,axes=FALSE,add=TRUE,col="black",lwd=1) else{ for(i in 1:nrow(cv)){ v <- cv[i,] v[v==0] <- 9999 m <- matrix(rep(v,length(t)),nrow=length(t),byrow=TRUE) contour(x=t,z=wt/m,levels=1,drawlabels=FALSE,axes=FALSE,add=TRUE,col="black",lwd=1) } } } plotcoi <- function(t,s0,noctave,w0){ tv <- as.vector(t) tvl <- tv[tv-tv[1]<(tv[length(tv)]-tv[1])/2] tvr <- tv[tv-tv[1]>=(tv[length(tv)]-tv[1])/2] lines(tvl,log2(((tvl-tv[1])*4*pi/((w0+sqrt(2+w0*w0))*sqrt(2)))/s0)/noctave,col="black") lines(tvr,log2(((tv[length(tv)]-tvr)*4*pi/((w0+sqrt(2+w0*w0))*sqrt(2)))/s0)/noctave,col="black") } plotmarks <- function(t,s0,noctave,markt,marks){ if (markt[1]!=-999){ for (i in 1:length(markt)){ lines(c(markt[i],markt[i]),c(0,1),lty="dotted") } } if (marks[1]!=-999){ for (i in 1:length(marks)){ lines(c(t[1],t[length(t)]),c(log2(marks[i]/s0)/noctave,log2(marks[i]/s0)/noctave),lty="dotted") } } } ##################### # PLOT.WT ##################### plot.wt <- function(wt,markt=-999,marks=-999,t1=NULL,t2=NULL,logscale=FALSE,phase=FALSE,units="",plottitle="",device="screen",file="wt",split=FALSE,color=TRUE,pwidth=10,pheight=5,labsc=1.5,labtext="",sigplot=3,xax=NULL,xlab=NULL,yax=NULL,ylab=NULL){ plotwt(wt$modulus,wt$phase,wt$time,wt$s0,wt$noctave,wt$w0,wt$critval,wt$at,markt,marks,t1,t2,logscale,phase,units,plottitle,device,file,split,color,pwidth,pheight,labsc,labtext,sigplot,xax,xlab,yax,ylab) } plotwt <- function(wt,phs,t,s0,noctave,w0,cv=NULL,at=NULL,markt=-999,marks=-999,t1=NULL,t2=NULL,logscale=FALSE,phase=FALSE,units="",plottitle="Wavelet Plot",device="screen",file="wavelet",split=FALSE,color=TRUE,pwidth=10,pheight=7,labsc=1,labtext="",sigplot=1,xax=NULL,xlab=NULL,yax=NULL,ylab=NULL){ if (is.null(phs)) phase <- FALSE mgpv <- c(3,1,0) if (labsc>1) mgpv[1] <- 3-(labsc-1.5) ncolors <- 64 colors <- wtcolors(ncolors) if (color==FALSE) colors <- gray((0:ncolors)/ncolors*0.7+0.3) rangev <- (0:(ncolors-1))/(ncolors-1) rangebar <- matrix(rangev,nrow=2,ncol=64,byrow=TRUE) s <- 2^(0:(noctave))*s0 sn <- (0:(noctave))/noctave deltat <- (t[length(t)]-t[1])/(length(t)-1) cut <- FALSE if ((!is.null(t1)) | (!is.null(t2))){ if (t1=t[1] & t2<=t[length(t)]){ cut <- TRUE i1 <- (t1-t[1])/deltat+1 i2 <- (t2-t[1])/deltat+1 t <- t[t>=t1 & t<=t2] wt <- wt[i1:i2,] if (phase) phs <- phs[i1:i2,] if (length(at)>1) at <- at[i1:i2,] } } #---------------- # Setting layout #---------------- if (device=="ps" && split==FALSE){ file <- paste(file,".eps",sep="") postscript(file,onefile=TRUE,horizontal=TRUE,paper="special",width=pwidth,height=pheight) cat(paste("# writing",file," \n")) } if (device=="ps" && split==TRUE){ file1 <- paste(file,".mod.eps",sep="") postscript(file1,onefile=TRUE,horizontal=TRUE,paper="special",width=pwidth,height=pheight) cat(paste("# writing",file1," \n")) } if (phase==TRUE && split==FALSE) nlo <- layout(matrix(c(1,2,3,4),2,2,byrow=TRUE),widths=c(4,1)) else nlo <- layout(matrix(c(1,2),ncol=2,byrow=TRUE),widths=c(4,1)) #----------------- # Plotting modulus #----------------- if (logscale){ if (units=="") image(x=t,z=log10(wt),col = colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) else image(x=t,z=log10(wt),col = colors,axes=FALSE,xlab=paste("Time ","[",units,"]",sep=""),ylab=paste("Scale ","[",units,"]",sep=""),frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) } else{ if (units=="") image(x=t,z=wt,col = colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) else image(x=t,z=wt,col = colors,axes=FALSE,xlab=paste("Time ","[",units,"]",sep=""),ylab=paste("Scale ","[",units,"]",sep=""),frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) } text(t[1+as.integer(length(t)*0.1)],0.8,labtext,cex=2) if (sigplot==1 | sigplot==3){ if (is.null(cv)==FALSE){ #Critical values if (cv[1]!=0 & cv[1]!=-1) plotcv(t,wt,cv) } } if (sigplot>1) plotat(t,wt,at,sigplot) if (!cut) plotcoi(t,s0,noctave,w0) #cone of influence plotmarks(t,s0,noctave,markt,marks) #additional guiding lines if (is.null(xax)) axis(side=1,at=axTicks(1),cex.axis=labsc) else if (is.null(xlab)) axis(side=1,xax,labels=as.character(xax),cex.axis=labsc) else axis(side=1,xax,labels=xlab,cex.axis=labsc) if (is.null(yax)) axis(side=2,sn,labels=as.character(s),cex.axis=labsc) else if (is.null(ylab)) axis(side=2,yax,labels=as.character(yax),cex.axis=labsc) else axis(side=2,yax,labels=ylab,cex.axis=labsc) title(main=plottitle,cex=labsc) image(z=rangebar,axes=FALSE,col=colors,frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) if (is.null(cv)==FALSE){ if (length(dim(cv))==0){ for (i in 1:length(cv)) if (cv[i]!=0) lines(c(-1,2),c(cv[i],cv[i])) } } if (!logscale) axis(side=2,(0:5)/5,labels=c("0","","","","","1"),cex.axis=labsc) else{ labelv <- substr(as.character(c(0:5)*(max(log10(wt),na.rm=TRUE)-min(log10(wt),na.rm=TRUE))/5),1,4) axis(side=2,(0:5)/5,labels=labelv,cex.axis=labsc) } #----------------- # Plotting phase #----------------- if (phase==TRUE){ if (device=="ps" && split==TRUE){ dev.off() file2 <- paste(file,".phs.eps",sep="") postscript(file2,onefile=TRUE,horizontal=TRUE,paper="special",width=10,height=5) cat(paste("# writing",file2," \n")) } colors <- rainbow(ncolors) if (color==FALSE){ dummy <- gray((0:ncolors)/ncolors) colors[1:(ncolors/2)] <- dummy[(ncolors/2+1):ncolors] colors[(ncolors/2+1):ncolors] <- dummy[1:(ncolors/2)] } if (units=="") image(x=t,z=phs,col=colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) else image(x=t,z=phs,col=colors,axes=FALSE,xlab=paste("Time ","[",units,"]",sep=""),ylab=paste("Scale ","[",units,"]",sep=""),frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) if (is.null(cv)==FALSE) plotcv(t,wt,cv) if (sigplot>1) plotat(t,wt,at,sigplot) if (!cut) plotcoi(t,s0,noctave,w0) plotmarks(t,s0,noctave,markt,marks) if (is.null(xax)) axis(side=1,at=axTicks(1),cex.axis=labsc) else if (is.null(xlab)) axis(side=1,xax,labels=as.character(xax),cex.axis=labsc) else axis(side=1,xax,labels=xlab,cex.axis=labsc) if (is.null(yax)) axis(side=2,sn,labels=as.character(s),cex.axis=labsc) else if (is.null(ylab)) axis(side=2,yax,labels=as.character(yax),cex.axis=labsc) else axis(side=2,yax,labels=ylab,cex.axis=labsc) title(main="Phase") image(z=rangebar,axes=FALSE,col=colors,frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) axis(side=2,(0:4)/4,labels=c("-PI","","0","","PI"),cex.axis=labsc) } if (device=="ps") dev.off() } ############################## # Surrogates ############################## createwavesurrogates <- function(nsurr=1,wt=1,n,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi){ surrmat <- matrix(rep(0,n*nsurr),ncol=nsurr) for (i in 1:nsurr){ cat(paste("# Creating realization ",i,"\n",sep="")) x <- rnorm(n) xts <- ts(x,start=0,deltat=dt) xwt <- cwt.ts(xts,s0,noctave,nvoice,w0) wtsurr <- wt*xwt surri <- as.vector(invmorlet(wtsurr,0,dt,s0,noctave,nvoice,w0)) surrmat[,i] <- Re(surri) } surrmat } surrwave <- function(x,...) UseMethod("surrwave") surrwave.wt <- function(wt,nsurr=1,spec=TRUE){ n <- length(wt$time) t0 <- wt$time[1] dt <- (wt$time[13]-t0)/12 s0 <- wt$s0 noctave <- wt$noctave nvoice <- wt$nvoice w0 <- wt$w0 wt <- wt$modulus if (spec==TRUE) wt <- sqrt(wt) surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0) surrts <- ts(surrmat,start=t0,deltat=dt) surrts } surrwave.matrix <- function(mat,nsurr=1,t0=0,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,spec=FALSE){ if (sw!=0 & swabs==0) swabs <- as.integer(sw*nvoice) scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 if ((noctave*nvoice+1)!=dim(mat)[2]) cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n") n <- dim(mat)[1] if (spec==FALSE) mat <- Mod(mat) else mat <- sqrt(Mod(mat)) wtsm <- smooth.matrix(mat,swabs) wt <- smooth.time(wtsm,tw,dt,scalevector) surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0) surrts <- ts(surrmat,start=t0,deltat=dt) surrts } surrwave.character <- function(file,nsurr=1,t0=0,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,transpose=TRUE,spec=FALSE){ if (sw!=0 & swabs==0) swabs <- as.integer(sw*nvoice) scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 if (transpose==FALSE) mat <- matrix(scan(file,comment.char="#"),ncol=nvoice*noctave+1,byrow=TRUE) else mat <- matrix(scan(file,comment.char="#"),ncol=nvoice*noctave+1,byrow=FALSE) if ((noctave*nvoice+1)!=dim(mat)[2]) cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n") n <- dim(mat)[1] if (spec==FALSE) mat <- Mod(mat) else mat <- sqrt(Mod(mat)) wtsm <- smooth.matrix(mat,swabs) wt <- smooth.time(wtsm,tw,dt,scalevector) surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0) surrts <- ts(surrmat,start=t0,deltat=dt) surrts } surrwave.ts <- function(ts,nsurr=1,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0){ n <- length(ts) t0 <- time(ts)[1] dt <- deltat(ts) if (sw!=0 & swabs==0) swabs <- as.integer(sw*nvoice) scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 wt <- Mod(cwt.ts(ts,s0,noctave,nvoice,w0)) wtsm <- smooth.matrix(wt,swabs) wt <- smooth.time(wtsm,tw,dt,scalevector) surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0) surrts <- ts(surrmat,start=t0,deltat=dt) surrts } invmorlet <- function(wt,t0=0,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi){ if ((noctave*nvoice+1)!=dim(wt)[2]) cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n") n <- dim(wt)[1] wt[is.na(wt)] <- 0 tsRe <- rep(0,n) tsIm <- rep(0,n) wtRe <- t(Re(wt)) wtIm <- t(Im(wt)) z <- .C("invmorlet", as.double(as.vector(wtRe)), as.double(as.vector(wtIm)), as.integer(n), as.double(dt), as.double(s0), as.integer(noctave), as.integer(nvoice), as.double(w0), tsRetmp = as.double(tsRe), tsImtmp = as.double(tsIm), PACKAGE="sowas") invvec=complex(real=z$tsRetmp,imaginary=z$tsImtmp) invts <- ts(data=invvec,start=t0,deltat=dt) invts } ################################# # INPUT / OUTPUT ################################# readmatrix <- function(file,M){ A <- matrix(scan(file,comment.char="#"),ncol=M,byrow=TRUE) A } readts <- function(file){ A <- matrix(scan(file,comment.char="#"),ncol=2,byrow=TRUE) Adum <- A Adum[is.na(Adum)] <- 0 t <- Adum %*% c(1,0) x <- A %*% c(0,1) N=length(t) f=1/(t[13]-t[1])*12 if ((f>11) && (f<13)) f <- 12 timeseries<-ts(data=x,start=t[1],frequency=f) timeseries } writematrix <- function(file,data,header="# R Matrix"){ write(header,file) write(t(data),file,ncol(data),append=TRUE) } ############################ # HELP FUNCTIONS ############################ smooth.matrix <- function(wt,swabs){ if (swabs != 0) smwt <- t(filter(t(wt),rep(1,2*swabs+1)/(2*swabs+1))) else smwt <- wt smwt } smooth.time <- function(wt,tw,dt,scalevector){ smwt <- wt if (tw != 0){ for (i in 1:length(scalevector)){ twi <- as.integer(scalevector[i]*tw/dt) smwt[,i] <- filter(wt[,i],rep(1,2*twi+1)/(2*twi+1)) } } smwt } adjust.noctave <- function(N,dt,s0,tw,noctave){ if (tw>0){ dumno <- as.integer((log(N*dt)-log(2*tw*s0))/log(2)) if (dumno=c] <- 1 is1 <- 1 is2 <- nvoice*(noctave+1) it1 <- 1 it2 <- 2*t+1 L <- F[1:(2*t+1),is1] while (length(L[L!=0])==0) { is1 <- is1+1 L <- F[1:(2*t+1),is1] } L <- F[1:(2*t+1),is2] while (length(L[L!=0])==0) { is2 <- is2-1 L <- F[1:(2*t+1),is2] } L <- F[it1,1:(nvoice*(noctave+2))] while (length(L[L!=0])==0) { it1 <- it1+1 L <- F[it1,1:(nvoice*(noctave+2))] } L <- F[it2,1:(nvoice*(noctave+2))] while (length(L[L!=0])==0) { it2 <- it2-1 L <- F[it2,1:(nvoice*(noctave+2))] } kernel <- list(bitmap=F[(it1-1):(it2+1),(is1-1):(is2+1)],is=is-is1) kernel } kernelRoot <- function(s0=1,w0=6,a=0,noctave=6,nvoice=20,swabs=0,tw=0,dt=1){ tol <- 0.005 cmin <- 0 cmax <- 1 cntr <- 0.5 da <- a while (abs(da/a)>tol){ da <- kernelArea(cntr,s0,w0,a,noctave,nvoice,swabs,tw,dt) if (da>0){ cmin <- cntr cntr <- mean(c(cntr,cmax)) } if (da<0){ cmax <- cntr cntr <- mean(c(cntr,cmin)) } } cntr } kernelArea <- function(cntr,s0=1,w0=6,a=0,noctave=6,nvoice=20,swabs=0,tw=0,dt=1){ # calulates area of reproducing kernel for smoothed data at scale s0*2^noctave # cntr: height of contour line to define kernel area. This # parameter is to be estimated! # s0: lowest scale # w0: parameter of Morlet Wavelet # a: area offset (only needed, when finding root. Is set to # desired area # noctave: number of octaves # nvoice: number of voices per octave # swabs: smoothing window width in scale direction # dt: sampling time s <- s0*2^noctave x <- s0*2^(((1:(nvoice*(noctave+2)))-1)/nvoice) t <- max(2000,max(x)*tw*2/dt*1.1) y <- ((0:(2*t))-t)/2*dt X <- matrix(x,ncol=nvoice*(noctave+2),nrow=2*t+1,byrow=T) Y <- matrix(y,ncol=nvoice*(noctave+2),nrow=2*t+1) F <- sqrt(2*s*X/(s*s+X*X))*exp(-0.5*(Y*Y+w0*w0*(X-s)*(X-s))/(s*s+X*X)) F <- foldKernel(F,swabs,tw,x,dt) F[F>=cntr] <- 1 F[F6m) #### # nvoice <- 4 # # noctave4 = 2^13 = 8192 half hours ~ 180 days # noctave4 <- adjust.noctave(N = delta, dt = 1, s0 = 2, # tw = 0, noctave = 13) # # 4 here represent 2^5 = 32 half-hours ~ 1 day # scalevector4 <- 2^(4:(noctave4 * nvoice) / nvoice) * 2 # lscvect4 <- length(scalevector4) # lscvect <- lscvect4 # i should clean my code: werFam demands a lscvect #17000 colonnes coeff 1, puis 17000 coeff 2... [non : dans chaque tranche du cube] #TODO: une fonction qui fait lignes 59 à 91 #cube: # Xcwt4 <- toCWT(conso, noctave = noctave4, dt = 1, # scalevector = scalevector4, # lt = delta, smooth = FALSE, # nvoice = nvoice) # observations node with CWT # # #matrix: # ############Xcwt2 <- matrix(0.0, nrow= n, ncol= 2 + delta * lscvect) # #Xcwt2 <- matrix(NA_complex_, nrow= n, ncol= 2 + length((c(Xcwt4[,,1])))) # # #NOTE: delta et lscvect pourraient etre gardés à part (communs) # for(i in 1:n) # Xcwt2[i,] <- c(delta, lscvect, Xcwt4[,,i] / max(Mod(Xcwt4[,,i])) ) # # #rm(conso, Xcwt4); gc() # # ## _.b WER^2 distances ######## # Xwer_dist <- matrix(0.0, n, n) # for(i in 1:(n - 1)){ # mat1 <- vect2mat(Xcwt2[i,]) # for(j in (i + 1):n){ # mat2 <- vect2mat(Xcwt2[j,]) # num <- Mod(mat1 * Conj(mat2)) # WX <- Mod(mat1 * Conj(mat1)) # WY <- Mod(mat2 * Conj(mat2)) # smsmnum <- smCWT(num, scalevector = scalevector4) # smsmWX <- smCWT(WX, scalevector = scalevector4) # smsmWY <- smCWT(WY, scalevector = scalevector4) # wer2 <- sum(colSums(smsmnum)^2) / # sum( sum(colSums(smsmWX) * colSums(smsmWY)) ) # Xwer_dist[i, j] <- sqrt(delta * lscvect * (1 - wer2)) # Xwer_dist[j, i] <- Xwer_dist[i, j] # } # } # diag(Xwer_dist) <- numeric(n) # # save(Xwer_dist, file = "../res/2009_synchros200WER.Rdata") # save(Xwer_dist, file = "../res/2009_synchros200-randomWER.Rdata") load("../res/2009_synchros200WER.Rdata") #load("../res/2009_synchros200-randomWER.Rdata") ## 3. Cluster using WER distance matrix #### #hc <- hclust(as.dist(Xwer_dist), method = "ward.D") #plot(hc) # # #clust <- cutree(hc, 2) # for(K in 2:30){ #K <- 3 #pamfit <- pam(tdata[-201, ci$selectv], k = K) pamfit <- pam(as.dist(Xwer_dist), k = K, diss = TRUE) #table(pamfit$clustering) SC <- matrix(0, ncol = p, nrow = K) clustfactor <- pamfit$clustering # for(k in 1:K){ # clustk <- which(clustfactor == k) # if(length(clustk) > 0) { # if(length(clustk) > 1) { # SCk <- colSums(synchros09[which(clustfactor == k), ]) # } else { # SCk <- synchros09[which(clustfactor == k), ] # } # SC[k, ] <- SC[k, ] + SCk # rm(SCk) # } #} #write.table(clustfactor, file = paste0("~/tmp/clustfactorRC", K, ".txt")) #write.table(clustfactor, file = "~/tmp/clustfactor3.txt") #write.table(clustfactor, file = paste0("~/tmp/clustfactorWER", K, ".txt")) write.table(clustfactor, file = paste0("~/tmp/clustfactor-randomWER", K, ".txt")) } # # # Plots # layout(1) # matplot(t(SC)[48*10 + 1:(48*30), ], type = 'l', ylab = '',col = 1:3, lty = 1) # matplot(t(SC)[48*100 + 1:(48*30), ], type = 'l', ylab = '', col = 1:3, lty = 1) # # #