| 1 | #Ligne 83 dans epclust/R/computeWerDists.R : |
| 2 | # TODO: |
| 3 | # [X,period,scale,coix] = |
| 4 | #wavelet(x(:,2),dt,Args.Pad,Args.Dj,Args.S0,Args.J1,Args.Mother);%#ok |
| 5 | #[Y,period,scale,coiy] = wavelet(y(:,2),dt,Args.Pad,Args.Dj,Args.S0,Args.J1,Args.Mother); |
| 6 | # |
| 7 | #%Smooth X and Y before truncating! (minimize coi) |
| 8 | #%sinv=1./(scale'); |
| 9 | #% |
| 10 | #% |
| 11 | #%sX=smoothwavelet(sinv(:,ones(1,nx)).*(abs(X).^2),dt,period,Args.Dj,scale); |
| 12 | #%sY=smoothwavelet(sinv(:,ones(1,ny)).*(abs(Y).^2),dt,period,Args.Dj,scale); |
| 13 | #% |
| 14 | #%Wxy=X.*conj(Y); |
| 15 | #% |
| 16 | #%% ----------------------- Wavelet coherence --------------------------------- |
| 17 | #%sWxy=smoothwavelet(sinv(:,ones(1,n)).*Wxy,dt,period,Args.Dj,scale); |
| 18 | #%Rsq=abs(sWxy).^2./(sX.*sY); |
| 19 | # |
| 20 | |
| 21 | |
| 22 | #https://github.com/grinsted/wavelet-coherence/blob/master/wtc.m |
| 23 | |
| 24 | |
| 25 | library(Rwave) # CWT |
| 26 | library(cluster) # pam |
| 27 | #library(flexclust) # kcca |
| 28 | |
| 29 | |
| 30 | toCWT <- function(X, sw= 0, tw= 0, swabs= 0, |
| 31 | nvoice= 12, noctave= 5, |
| 32 | s0= 2, w0= 2*pi, lt= 24, dt= 0.5, |
| 33 | spectra = FALSE, smooth = TRUE, |
| 34 | scaled = FALSE, |
| 35 | scalevector) |
| 36 | { noctave <- adjust.noctave(lt, dt, s0, tw, noctave) |
| 37 | if(missing(scalevector)) |
| 38 | scalevector <- 2^(0:(noctave * nvoice) / nvoice) * s0 |
| 39 | res <- lapply(1:nrow(X), function(n) |
| 40 | { tsX <- ts( X[n,] ) |
| 41 | tsCent <- tsX - mean(tsX) |
| 42 | if(scaled) tsCent <- ts(scale(tsCent)) |
| 43 | tsCent.cwt <- cwt.ts(tsCent, s0, noctave, nvoice, w0) |
| 44 | tsCent.cwt |
| 45 | } ) |
| 46 | if( spectra ) res <- lapply(res, function(l) Mod(l)^2 ) |
| 47 | if( smooth ) res <- lapply(res, smCWT, swabs = swabs, |
| 48 | tw = tw, dt = dt, |
| 49 | scalevector = scalevector) |
| 50 | resArray <- array(NA, c(nrow(res[[1]]), ncol(res[[1]]), |
| 51 | length(res))) |
| 52 | for( l in 1:length(res) ) resArray[ , , l] <- res[[l]] |
| 53 | resArray |
| 54 | } |
| 55 | |
| 56 | |
| 57 | # =============================================================== |
| 58 | |
| 59 | smCWT <- function(CWT, sw= 0, tw= 0, swabs= 0, |
| 60 | nvoice= 12, noctave= 2, s0= 2, w0= 2*pi, |
| 61 | lt= 24, dt= 0.5, scalevector ) |
| 62 | { |
| 63 | # noctave <- adjust.noctave(lt, dt, s0, tw, noctave) |
| 64 | # scalevector <- 2^(0:(noctave * nvoice) / nvoice) * s0 |
| 65 | wsp <- Mod(CWT) |
| 66 | smwsp <- smooth.matrix(wsp, swabs) |
| 67 | smsmwsp <- smooth.time(smwsp, tw, dt, scalevector) |
| 68 | smsmwsp |
| 69 | } |
| 70 | |
| 71 | |
| 72 | # =============================================================== |
| 73 | |
| 74 | toDWT <- function(x, filter.number = 6, family = "DaubLeAsymm") |
| 75 | { x2 <- spline(x, n = 2^ceiling( log(length(x), 2) ), |
| 76 | method = 'natural')$y |
| 77 | Dx2 <- wd(x2, family = family, filter.number = filter.number)$D |
| 78 | Dx2 |
| 79 | } |
| 80 | |
| 81 | # =============================================================== |
| 82 | |
| 83 | contrib <- function(x) |
| 84 | { J <- log( length(x)+1, 2) |
| 85 | nrj <- numeric(J) |
| 86 | t0 <- 1 |
| 87 | t1 <- 0 |
| 88 | for( j in 1:J ) { |
| 89 | t1 <- t1 + 2^(J-j) |
| 90 | nrj[j] <- sqrt( sum( x[t0:t1]^2 ) ) |
| 91 | t0 <- t1 + 1 |
| 92 | } |
| 93 | return(nrj) |
| 94 | } |
| 95 | |
| 96 | |
| 97 | # ========================================= distance for coh === |
| 98 | |
| 99 | coherence <- function( x, y) |
| 100 | { J <- log(length(x) + 1, 2) |
| 101 | t0 <- 1 |
| 102 | sg2_x <- 0 |
| 103 | sg2_y <- 0 |
| 104 | sg_xy <- 0 |
| 105 | for(j in 0:(J - 1)) |
| 106 | { t1 <- t0 + 2^(J - j)/2 - 1 |
| 107 | tt <- t0:t1 |
| 108 | sg2_x <- sg2_x + mean(x[t0:t1]^2) |
| 109 | sg2_y <- sg2_y + mean(y[t0:t1]^2) |
| 110 | sg_xy <- sg_xy + mean(x[t0:t1] * y[t0:t1]) |
| 111 | t0 <- t1 + 1 |
| 112 | } |
| 113 | res <- sg_xy^2 / sg2_x / sg2_y |
| 114 | res |
| 115 | } |
| 116 | |
| 117 | |
| 118 | vect2mat <- function(vect){ |
| 119 | vect <- as.vector(vect) |
| 120 | matrix(vect[-(1:2)], delta, lscvect) |
| 121 | } |
| 122 | |
| 123 | |
| 124 | # ========================================= # myimg for graphics |
| 125 | jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", |
| 126 | "cyan", "#7FFF7F", "yellow", |
| 127 | "#FF7F00", "red", "#7F0000")) |
| 128 | |
| 129 | myimg <- function(MAT, x = 1:nrow(MAT), y = 1:col(MAT), ... ) |
| 130 | filled.contour( x = x, y = y, z = MAT, |
| 131 | xlab= 'Time', ylab= 'scale', |
| 132 | color.palette = jet.colors, |
| 133 | ... ) |
| 134 | |
| 135 | |
| 136 | #TODO: [plus tard] alternative à sowa (package disparu) : cwt.. |
| 137 | #source("sowas-superseded.r") # auxiliary CWT functions |
| 138 | |
| 139 | |
| 140 | cwt.ts <- function(ts,s0,noctave=5,nvoice=10,w0=2*pi){ |
| 141 | |
| 142 | if (class(ts)!="ts"){ |
| 143 | |
| 144 | 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") |
| 145 | |
| 146 | } |
| 147 | else{ |
| 148 | |
| 149 | t=time(ts) |
| 150 | dt=t[2]-t[1] |
| 151 | |
| 152 | s0unit=s0/dt*w0/(2*pi) |
| 153 | s0log=as.integer((log2(s0unit)-1)*nvoice+1.5) |
| 154 | |
| 155 | if (s0log<1){ |
| 156 | cat(paste("# s0unit = ",s0unit,"\n",sep="")) |
| 157 | cat(paste("# s0log = ",s0log,"\n",sep="")) |
| 158 | cat("# s0 too small for w0! \n") |
| 159 | } |
| 160 | totnoct=noctave+as.integer(s0log/nvoice)+1 |
| 161 | |
| 162 | totts.cwt=cwt(ts,totnoct,nvoice,w0,plot=0) |
| 163 | |
| 164 | ts.cwt=totts.cwt[,s0log:(s0log+noctave*nvoice)] |
| 165 | |
| 166 | #Normalization |
| 167 | sqs <- sqrt(2^(0:(noctave*nvoice)/nvoice)*s0) |
| 168 | smat <- matrix(rep(sqs,length(t)),nrow=length(t),byrow=TRUE) |
| 169 | |
| 170 | ts.cwt*smat |
| 171 | |
| 172 | } |
| 173 | |
| 174 | } |
| 175 | |
| 176 | ##################################### |
| 177 | # WSP |
| 178 | ##################################### |
| 179 | |
| 180 | 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){ |
| 181 | |
| 182 | if (class(ts)!="ts"){ |
| 183 | |
| 184 | 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") |
| 185 | |
| 186 | } |
| 187 | else{ |
| 188 | |
| 189 | if (sw!=0 & swabs==0) |
| 190 | swabs <- as.integer(sw*nvoice) |
| 191 | if (swabs!=0 & sw==0) |
| 192 | sw <- swabs/nvoice |
| 193 | |
| 194 | sllist <- checkarealsiglevel(sw,tw,w0,arealsiglevel,siglevel,0) |
| 195 | arealsiglevel <- sllist$arealsiglevel |
| 196 | siglevel <- sllist$siglevel |
| 197 | |
| 198 | at <- NULL |
| 199 | |
| 200 | t <- time(ts) |
| 201 | dt <- deltat(ts) |
| 202 | s0rem <- s0 |
| 203 | s0 <- adjust.s0(s0,dt) |
| 204 | dnoctave <- as.integer(log(s0/s0rem-0.000000000001)/log(2))+1 |
| 205 | |
| 206 | noctave <- adjust.noctave(length(ts),dt,s0,tw,noctave) |
| 207 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 208 | tsanom <- ts-mean(ts) |
| 209 | |
| 210 | #WAVELET TRANSFORMATION |
| 211 | ts.cwt <- cwt.ts(tsanom,s0,noctave,nvoice,w0) |
| 212 | |
| 213 | #SMOOTHING |
| 214 | wsp <- smooth.matrix(Mod(ts.cwt)^2,swabs) |
| 215 | smwsp <- smooth.time(wsp,tw,dt,scalevector) |
| 216 | |
| 217 | #POINTWISE SIGNIFICANCE TEST |
| 218 | if (is.null(critval)==FALSE){ # is critval empty? |
| 219 | if (dim(critval)[2]!=dim(smwsp)[2]){ # is critval of the wrong dimension? |
| 220 | if (siglevel[1]!=0 & nreal!=0) critval <- |
| 221 | criticalvaluesWSP(tsanom,s0,noctave,nvoice,w0,swabs,tw,siglevel,nreal) |
| 222 | #critval is of wrong dimension and siglevel and nreal are given |
| 223 | else { |
| 224 | critval <- NULL # no test possible |
| 225 | arealsiglevel <- 0 |
| 226 | cat("# dimension of critval is wrong \n") |
| 227 | cat("# areawise test only possible with pointwise test \n") |
| 228 | } |
| 229 | } |
| 230 | } |
| 231 | else{ # critval is empty, but nreal or siglevel is given |
| 232 | if (siglevel[1]!=0 & nreal!=0) critval <- |
| 233 | criticalvaluesWSP(tsanom,s0,noctave,nvoice,w0,swabs,tw,siglevel,nreal) |
| 234 | else { |
| 235 | critval <- NULL |
| 236 | arealsiglevel <- 0 |
| 237 | cat("# areawise test only possible with pointwise test \n") |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | #AREAL SIGNIFICANCE TEST |
| 242 | if (arealsiglevel!=0){ |
| 243 | v <- critval[1,] |
| 244 | v[v==0] <- 9999 |
| 245 | cvmat <- matrix(rep(v,length(t)),nrow=length(t),byrow=TRUE) |
| 246 | atest <- arealtest(smwsp/cvmat,dt,s0,noctave,nvoice,w0,swabs,tw,siglevel,arealsiglevel,kernel,0) |
| 247 | at <- atest$at |
| 248 | kernel <- atest$kernel |
| 249 | } |
| 250 | |
| 251 | if (s0rem<s0){ |
| 252 | smwsp <- addvalues(nvoice,dnoctave,smwsp,NA) |
| 253 | critval <- addvalues(nvoice,dnoctave,critval,1) |
| 254 | #at <- addvalues(nvoice,dnoctave,at,NA) |
| 255 | noctave <- noctave+dnoctave |
| 256 | s0 <- s0/2^dnoctave |
| 257 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 258 | } |
| 259 | |
| 260 | #PARAMETERS |
| 261 | wclist <- |
| 262 | list(modulus=smwsp,phase=NULL,time=t,s0=s0,noctave=noctave,nvoice=nvoice,w0=w0,scales=scalevector,critval=critval,at=at,kernel=kernel) |
| 263 | |
| 264 | class(wclist) <- "wt" |
| 265 | |
| 266 | #PLOTTING |
| 267 | if (plot) |
| 268 | plot(wclist,markt,marks,NULL,NULL,logscale,FALSE,units,"Wavelet Power Spectrum",device,file,FALSE,color,pwidth,pheight,labsc,labtext,sigplot) |
| 269 | |
| 270 | wclist |
| 271 | |
| 272 | } |
| 273 | |
| 274 | } |
| 275 | |
| 276 | ##################################### |
| 277 | # WCO |
| 278 | ##################################### |
| 279 | |
| 280 | wco <- |
| 281 | function(ts1,ts2,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,siglevel=0.95,arealsiglevel=0.9,kernel=0,markt=-999,marks=-999,sqr=FALSE,phase=TRUE,plot=TRUE,units="",device="screen",file="wcoh",split=FALSE,color=TRUE,pwidth=10,pheight=7,labsc=1,labtext="",sigplot=3){ |
| 282 | |
| 283 | if (class(ts1)!="ts"){ |
| 284 | |
| 285 | cat("# This function needs two time series objects as input. You may construct them by using the function ts(data,start,deltat). Try '?ts' for help.\n") |
| 286 | |
| 287 | } |
| 288 | else{ |
| 289 | |
| 290 | if (sw!=0 & swabs==0) |
| 291 | swabs <- as.integer(sw*nvoice) |
| 292 | if (swabs!=0 & sw==0) |
| 293 | sw <- swabs/nvoice |
| 294 | |
| 295 | sllist <- checkarealsiglevel(sw,tw,w0,arealsiglevel,siglevel,1) |
| 296 | arealsiglevel <- sllist$arealsiglevel |
| 297 | siglevel <- sllist$siglevel |
| 298 | |
| 299 | if (sw==0 & tw==0 & swabs==0) { |
| 300 | cat("# coherence without averaging makes no sense! \n") |
| 301 | siglevel <- 0 |
| 302 | arealsiglevel <- 0 |
| 303 | } |
| 304 | |
| 305 | if (phase==FALSE) phs <- NULL |
| 306 | |
| 307 | at <- NULL |
| 308 | |
| 309 | tsadjust <- adjust.timeseries(ts1,ts2) |
| 310 | ts1 <- tsadjust$ts1 |
| 311 | ts2 <- tsadjust$ts2 |
| 312 | |
| 313 | t <- time(ts1) |
| 314 | dt <- deltat(ts1) |
| 315 | |
| 316 | s0rem <- s0 |
| 317 | s0 <- adjust.s0(s0,dt) |
| 318 | dnoctave <- as.integer(log(s0/s0rem-0.000000000001)/log(2))+1 |
| 319 | |
| 320 | noctave <- adjust.noctave(length(ts1),dt,s0,tw,noctave) |
| 321 | |
| 322 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 323 | |
| 324 | ts1anom <- ts1-mean(ts1) |
| 325 | ts2anom <- ts2-mean(ts2) |
| 326 | |
| 327 | ts1.cwt <- cwt.ts(ts1anom,s0,noctave,nvoice,w0) |
| 328 | ts2.cwt <- cwt.ts(ts2anom,s0,noctave,nvoice,w0) |
| 329 | |
| 330 | cosp <- Re(ts1.cwt)*Re(ts2.cwt) + Im(ts1.cwt)*Im(ts2.cwt) |
| 331 | quad <- Im(ts1.cwt)*Re(ts2.cwt) - Re(ts1.cwt)*Im(ts2.cwt) |
| 332 | wsp1 <- Mod(ts1.cwt)^2 |
| 333 | wsp2 <- Mod(ts2.cwt)^2 |
| 334 | |
| 335 | smcosp <- smooth.matrix(cosp,swabs) |
| 336 | smquad <- smooth.matrix(quad,swabs) |
| 337 | smwsp1 <- smooth.matrix(wsp1,swabs) |
| 338 | smwsp2 <- smooth.matrix(wsp2,swabs) |
| 339 | |
| 340 | smsmcosp <- smooth.time(smcosp,tw,dt,scalevector) |
| 341 | smsmquad <- smooth.time(smquad,tw,dt,scalevector) |
| 342 | smsmwsp1 <- smooth.time(smwsp1,tw,dt,scalevector) |
| 343 | smsmwsp2 <- smooth.time(smwsp2,tw,dt,scalevector) |
| 344 | |
| 345 | if (sqr==FALSE) |
| 346 | wcoh <- sqrt((smsmcosp^2+smsmquad^2)/(smsmwsp1*smsmwsp2)) |
| 347 | else |
| 348 | wcoh <- (smsmcosp^2+smsmquad^2)/(smsmwsp1*smsmwsp2) |
| 349 | |
| 350 | if (phase) |
| 351 | phs <- atan2(smsmquad,smsmcosp) |
| 352 | else phs <- NULL |
| 353 | |
| 354 | #POINTWISE SIGNIFICANCE TEST |
| 355 | if (siglevel[1]!=0) critval <- criticalvaluesWCO(s0,noctave,nvoice,w0,swabs,tw,siglevel) |
| 356 | else critval <- NULL |
| 357 | if (sqr==TRUE & is.null(critval)==FALSE) |
| 358 | critval <- critval^2 |
| 359 | |
| 360 | #AREAWISE SIGNIFICANCE TEST |
| 361 | if (arealsiglevel!=0){ |
| 362 | atest <- arealtest(wcoh/critval,dt,s0,noctave,nvoice,w0,swabs,tw,siglevel,arealsiglevel,kernel,1) |
| 363 | at <- atest$at |
| 364 | kernel <- atest$kernel |
| 365 | } |
| 366 | |
| 367 | wcoh[1,1] <- 0 |
| 368 | wcoh[1,2] <- 1 |
| 369 | |
| 370 | if (phase){ |
| 371 | phs[1,1] <- -pi |
| 372 | phs[1,2] <- pi |
| 373 | } |
| 374 | |
| 375 | if (s0rem<s0){ |
| 376 | wcoh <- addvalues(nvoice,dnoctave,wcoh,NA) |
| 377 | phs <- addvalues(nvoice,dnoctave,phs,NA) |
| 378 | noctave <- noctave+dnoctave |
| 379 | s0 <- s0/2^dnoctave |
| 380 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 381 | } |
| 382 | |
| 383 | wclist <- list(modulus=wcoh,phase=phs,s0=s0,noctave=noctave,nvoice=nvoice,w0=w0,time=t,scales=scalevector,critval=critval,at=at,kernel=kernel) |
| 384 | |
| 385 | class(wclist) <- "wt" |
| 386 | |
| 387 | if (plot) plot(wclist,markt,marks,NULL,NULL,FALSE,phase,units,"Wavelet Coherence",device,file,split,color,pwidth,pheight,labsc,labtext,sigplot) |
| 388 | |
| 389 | wclist |
| 390 | |
| 391 | } |
| 392 | |
| 393 | } |
| 394 | |
| 395 | ##################################### |
| 396 | # WCS |
| 397 | ##################################### |
| 398 | |
| 399 | wcs <- function(ts1,ts2,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0,markt=-999,marks=-999,logscale=FALSE,phase=TRUE,plot=TRUE,units="",device="screen",file="wcsp",split=FALSE,color=TRUE,pwidth=10,pheight=7,labsc=1,labtext=""){ |
| 400 | |
| 401 | if (class(ts1)!="ts"){ |
| 402 | |
| 403 | cat("# This function needs two time series objects as input. You may construct them by using the function ts(data,start,deltat). Try '?ts' for help. \n") |
| 404 | |
| 405 | } |
| 406 | else{ |
| 407 | |
| 408 | if (sw!=0 & swabs==0) |
| 409 | swabs <- as.integer(sw*nvoice) |
| 410 | if (swabs!=0 & sw==0) |
| 411 | sw <- swabs/nvoice |
| 412 | |
| 413 | tsadjust <- adjust.timeseries(ts1,ts2) |
| 414 | ts1 <- tsadjust$ts1 |
| 415 | ts2 <- tsadjust$ts2 |
| 416 | |
| 417 | t <- time(ts1) |
| 418 | dt <- deltat(ts1) |
| 419 | |
| 420 | s0rem <- s0 |
| 421 | s0 <- adjust.s0(s0,dt) |
| 422 | dnoctave <- as.integer(log(s0/s0rem-0.000000000001)/log(2))+1 |
| 423 | |
| 424 | noctave <- adjust.noctave(length(ts1),dt,s0,tw,noctave) |
| 425 | |
| 426 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 427 | |
| 428 | ts1anom <- ts1-mean(ts1) |
| 429 | ts2anom <- ts2-mean(ts2) |
| 430 | |
| 431 | ts1.cwt <- cwt.ts(ts1anom,s0,noctave,nvoice,w0) |
| 432 | ts2.cwt <- cwt.ts(ts2anom,s0,noctave,nvoice,w0) |
| 433 | |
| 434 | cosp <- Re(ts1.cwt)*Re(ts2.cwt) + Im(ts1.cwt)*Im(ts2.cwt) |
| 435 | quad <- Im(ts1.cwt)*Re(ts2.cwt) - Re(ts1.cwt)*Im(ts2.cwt) |
| 436 | |
| 437 | smcosp <- smooth.matrix(cosp,swabs) |
| 438 | smquad <- smooth.matrix(quad,swabs) |
| 439 | |
| 440 | smsmcosp <- smooth.time(smcosp,tw,dt,scalevector) |
| 441 | smsmquad <- smooth.time(smquad,tw,dt,scalevector) |
| 442 | |
| 443 | wcsp <- smsmcosp^2+smsmquad^2 |
| 444 | |
| 445 | if (phase) |
| 446 | phs <- atan2(smsmquad,smsmcosp) |
| 447 | else phs <- NULL |
| 448 | |
| 449 | if (phase){ |
| 450 | phs[1,1] <- -pi |
| 451 | phs[1,2] <- pi |
| 452 | } |
| 453 | |
| 454 | if (s0rem<s0){ |
| 455 | wcsp <- addvalues(nvoice,dnoctave,wcoh,NA) |
| 456 | phs <- addvalues(nvoice,dnoctave,phs,NA) |
| 457 | noctave <- noctave+dnoctave |
| 458 | s0 <- s0/2^dnoctave |
| 459 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 460 | } |
| 461 | |
| 462 | wclist <- list(modulus=wcsp,phase=phs,s0=s0,noctave=noctave,nvoice=nvoice,w0=w0,time=t,scales=scalevector,critval=NULL,at=NULL,kernel=NULL) |
| 463 | |
| 464 | class(wclist) <- "wt" |
| 465 | |
| 466 | if (plot) plot(wclist,markt,marks,NULL,NULL,logscale,phase,units,"Wavelet Cross Spectrum",device,file,split,color,pwidth,pheight,labsc,labtext) |
| 467 | |
| 468 | wclist |
| 469 | |
| 470 | } |
| 471 | |
| 472 | } |
| 473 | |
| 474 | ########################################## |
| 475 | # POINTWISE SIGNIFICANCE TEST |
| 476 | ########################################## |
| 477 | |
| 478 | rawWSP <- function(ts,s0=1,noctave=5,nvoice=20,w0=2*pi,swabs=0,tw=0,scalevector){ |
| 479 | |
| 480 | tsanom <- ts-mean(ts) |
| 481 | |
| 482 | ts.cwt <- cwt.ts(tsanom,s0,noctave,nvoice,w0) |
| 483 | |
| 484 | wsp <- Mod(ts.cwt)^2 |
| 485 | |
| 486 | smwsp <- smooth.matrix(wsp,swabs) |
| 487 | smsmwsp <- smooth.time(smwsp,tw,deltat(ts),scalevector) |
| 488 | |
| 489 | smsmwsp |
| 490 | |
| 491 | } |
| 492 | |
| 493 | criticalvaluesWSP <- function(ts,s0=1,noctave=5,nvoice=10,w0=2*pi,swabs=0,tw=0,siglevel=0.95,nreal=1000){ |
| 494 | |
| 495 | t=time(ts) |
| 496 | dt=deltat(ts) |
| 497 | |
| 498 | s0 <- adjust.s0(s0,dt) |
| 499 | noctave <- adjust.noctave(length(ts),dt,s0,tw,noctave) |
| 500 | |
| 501 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 502 | |
| 503 | cat("# calculating critical values by means of MC-simulations \n") |
| 504 | |
| 505 | s0unit=s0/dt*w0/(2*pi) |
| 506 | s0log=as.integer((log2(s0unit)-1)*nvoice+1.5) |
| 507 | |
| 508 | wsp0 <- rawWSP(ts,s0,noctave,nvoice,w0,swabs,tw,scalevector) |
| 509 | |
| 510 | S <- dim(wsp0)[2] |
| 511 | |
| 512 | n1 <- 1 + 2*as.integer( sqrt(2) * 2^((S-swabs+s0log-1)/nvoice+1) ) |
| 513 | n2 <- max(scalevector)*tw*2/dt*1.1 |
| 514 | n3 <- 2*tw*s0*2^noctave/dt+100 |
| 515 | n <- max(n1,n2,n3) |
| 516 | |
| 517 | center <- (n-1)/2+1 |
| 518 | cv <- matrix(rep(0,S*length(siglevel)),ncol=S) |
| 519 | rmatrix <- matrix(0,nrow=nreal,ncol=S) |
| 520 | |
| 521 | # Fitting AR1-process (red noise) to data |
| 522 | arts0 <- ar(ts,order.max=1) |
| 523 | sdts0 <- sd(ts[1:length(ts)]) |
| 524 | |
| 525 | if (arts0$order==0){ |
| 526 | se <- sqrt(arts0$var) |
| 527 | arts0$ar <- 0.000001 |
| 528 | } |
| 529 | else |
| 530 | se <- sqrt(sdts0*sdts0*(1-arts0$ar*arts0$ar)) |
| 531 | |
| 532 | tsMC <- ts(data=rep(0,n),start=t[1],frequency=1/dt) |
| 533 | |
| 534 | # MC Simulations |
| 535 | for (i in 1:nreal){ |
| 536 | |
| 537 | tsMC[1:n] <- arima.sim(list(ar = arts0$ar), n+1, sd = se)[2:(n+1)] |
| 538 | |
| 539 | rmatrix[i,] <- rawWSP(tsMC,s0,noctave,nvoice,w0,swabs,tw,scalevector)[center,] |
| 540 | |
| 541 | } |
| 542 | |
| 543 | for (s in (1+swabs):(S-swabs)) rmatrix[,s] <- sort(rmatrix[,s]) |
| 544 | |
| 545 | for (i in 1:length(siglevel)){ |
| 546 | sigindex <- as.integer(nreal*siglevel[i]) |
| 547 | cvv <- rmatrix[sigindex,] |
| 548 | cvv[is.na(cvv)] <- 0 |
| 549 | cv[i,] <- cvv |
| 550 | } |
| 551 | |
| 552 | cv |
| 553 | |
| 554 | } |
| 555 | |
| 556 | ########### |
| 557 | |
| 558 | criticalvaluesWCO <- function(s0,noctave,nvoice,w0,swabs,tw,siglevel=0.95){ |
| 559 | |
| 560 | cv=rep(0,length(siglevel)) |
| 561 | |
| 562 | for (i in 1:length(siglevel)){ |
| 563 | |
| 564 | if (siglevel[i]!=0.9 && siglevel[i]!=0.95 && siglevel[i]!=0.99) siglevel[i] <- 0.95 |
| 565 | |
| 566 | if (siglevel[i]==0.9){ |
| 567 | cat("# significance level set to 0.90 \n") |
| 568 | sw <- 1.0*swabs/nvoice |
| 569 | cv[i] <- 0.00246872*w0^2*sw + 0.0302419*w0*sw^2 + 0.342056*sw^3 - |
| 570 | 0.000425853*w0^2 - 0.101749*w0*sw - 0.703537*sw^2 + |
| 571 | 0.00816219*w0 + 0.442342*sw + 0.970315 |
| 572 | } |
| 573 | |
| 574 | if (siglevel[i]==0.95){ |
| 575 | cat("# significance level set to 0.95 \n") |
| 576 | sw <- swabs*100.0/3.0/nvoice |
| 577 | cv[i] <- 0.0000823*w0^3 + 0.0000424*w0^2*sw + 0.0000113*w0*sw^2 + |
| 578 | 0.0000154*sw^3 - 0.0023*w0^2 - 0.00219*w0*sw - 0.000751*sw^2 + |
| 579 | 0.0205*w0 + 0.0127*sw + 0.95 |
| 580 | } |
| 581 | |
| 582 | if (siglevel[i]==0.99){ |
| 583 | cat("# significance level set to 0.99 \n") |
| 584 | sw <- 1.0*swabs/nvoice |
| 585 | cv[i] <- 0.00102304*w0^2*sw + 0.00745772*w0*sw^2 + 0.230035*sw^3 - |
| 586 | 0.000361565*w0^2 - 0.0502861*w0*sw - 0.440777*sw^2 + |
| 587 | 0.00694998*w0 + 0.29643*sw + 0.972964 |
| 588 | } |
| 589 | |
| 590 | if (cv[i]>1) cv[i] <- 1 |
| 591 | |
| 592 | cat(paste("# significance testing, cv=",cv[i]," \n",sep="")) |
| 593 | |
| 594 | } |
| 595 | |
| 596 | cv |
| 597 | |
| 598 | } |
| 599 | |
| 600 | ############################# |
| 601 | # AREAWISE SIGNIFICANCE TEST |
| 602 | ############################# |
| 603 | |
| 604 | slide <- function(data,kernellist,s0,noctave,nvoice,cv){ |
| 605 | |
| 606 | # slides kernel over data set |
| 607 | #---------------------------- |
| 608 | # data: matrix containing data |
| 609 | # kernellist: matrix containing kernel |
| 610 | # s0: lowest scale |
| 611 | # noctave: number of octaves |
| 612 | # nvoice: number of voices per octave |
| 613 | # cv: critical value, all values higher are set to one |
| 614 | |
| 615 | #Time: (rows) n,i the kernel is to be scaled in this direction |
| 616 | #Scale: (cols) m,j |
| 617 | |
| 618 | data[data<cv] <- 0 |
| 619 | |
| 620 | kernel <- kernellist$bitmap |
| 621 | |
| 622 | js <- kernellist$is |
| 623 | |
| 624 | sm <- s0*2^noctave |
| 625 | |
| 626 | dbin <- tobin(data) |
| 627 | kbin <- tobin(kernel) |
| 628 | |
| 629 | dn <- nrow(dbin) |
| 630 | dm <- ncol(dbin) |
| 631 | |
| 632 | kn <- nrow(kbin) |
| 633 | km <- ncol(kbin) |
| 634 | |
| 635 | mark <- matrix(rep(0,dn*dm),nrow=dn) |
| 636 | |
| 637 | for (j in 1:(dm-km+1)){ |
| 638 | |
| 639 | s <- s0*2^((j+js-1)/nvoice) |
| 640 | kscn <- as.integer(kn*s/sm); |
| 641 | if (kscn==0) kscn <- 1 |
| 642 | |
| 643 | ksc <- scaleKernel(kbin,kscn) |
| 644 | kscm <- km |
| 645 | |
| 646 | for (i in 1:(dn-kscn+1)){ |
| 647 | |
| 648 | subbin <- dbin[i:(i+kscn-1),j:(j+kscm-1)] |
| 649 | |
| 650 | if (sum(ksc*subbin)==sum(ksc)) |
| 651 | mark[i:(i+kscn-1),j:(j+kscm-1)] <- mark[i:(i+kscn-1),j:(j+kscm-1)]+ksc |
| 652 | |
| 653 | } |
| 654 | |
| 655 | } |
| 656 | |
| 657 | mark <- tobin(mark) |
| 658 | |
| 659 | mark |
| 660 | |
| 661 | } |
| 662 | |
| 663 | arealtest <- function(wt,dt=1,s0=1,noctave=5,nvoice=20,w0=2*pi,swabs=0,tw=0,siglevel,arealsiglevel=0.9,kernel=0,type=0){ |
| 664 | |
| 665 | slp <- slope(w0,swabs,tw,nvoice,siglevel,arealsiglevel,type) |
| 666 | |
| 667 | if (length(kernel)<2){ |
| 668 | maxarea <- s0*2^noctave*slp/10*nvoice/dt |
| 669 | cat(paste("# calculating kernel (maxarea=",maxarea,")\n",sep="")) |
| 670 | cvkernel <- |
| 671 | kernelRoot(s0,w0,a=maxarea,noctave,nvoice,swabs,tw,dt) |
| 672 | |
| 673 | cat("# building kernel bitmap \n") |
| 674 | kernel <- |
| 675 | kernelBitmap(cvkernel,s0,w0,noctave,nvoice,swabs,tw,dt) |
| 676 | |
| 677 | } |
| 678 | |
| 679 | cat("# performing arealtest \n") |
| 680 | sl <- slide(wt,kernel,s0,noctave,nvoice,1) |
| 681 | |
| 682 | list(at=sl,kernel=kernel) |
| 683 | |
| 684 | } |
| 685 | |
| 686 | ############################# |
| 687 | # PLOTTING |
| 688 | ############################# |
| 689 | |
| 690 | plotat <- function(t,wt,at,sigplot){ |
| 691 | |
| 692 | if (length(at)>1){ |
| 693 | linewidth <- 1 |
| 694 | if (sigplot==3) |
| 695 | linewidth <- 5 |
| 696 | |
| 697 | contour(x=t,z=at,levels=0.5,add=TRUE,drawlabels=FALSE,axes=FALSE,lwd=linewidth,col="black") |
| 698 | } |
| 699 | |
| 700 | } |
| 701 | |
| 702 | |
| 703 | plotcv <- function(t,wt,cv){ |
| 704 | |
| 705 | if (length(dim(cv))==0) |
| 706 | |
| 707 | contour(x=t,z=wt,levels=c(cv),drawlabels=FALSE,axes=FALSE,add=TRUE,col="black",lwd=1) |
| 708 | |
| 709 | else{ |
| 710 | |
| 711 | for(i in 1:nrow(cv)){ |
| 712 | |
| 713 | v <- cv[i,] |
| 714 | v[v==0] <- 9999 |
| 715 | m <- matrix(rep(v,length(t)),nrow=length(t),byrow=TRUE) |
| 716 | |
| 717 | contour(x=t,z=wt/m,levels=1,drawlabels=FALSE,axes=FALSE,add=TRUE,col="black",lwd=1) |
| 718 | |
| 719 | } |
| 720 | |
| 721 | } |
| 722 | |
| 723 | } |
| 724 | |
| 725 | plotcoi <- function(t,s0,noctave,w0){ |
| 726 | |
| 727 | tv <- as.vector(t) |
| 728 | tvl <- tv[tv-tv[1]<(tv[length(tv)]-tv[1])/2] |
| 729 | tvr <- tv[tv-tv[1]>=(tv[length(tv)]-tv[1])/2] |
| 730 | |
| 731 | lines(tvl,log2(((tvl-tv[1])*4*pi/((w0+sqrt(2+w0*w0))*sqrt(2)))/s0)/noctave,col="black") |
| 732 | lines(tvr,log2(((tv[length(tv)]-tvr)*4*pi/((w0+sqrt(2+w0*w0))*sqrt(2)))/s0)/noctave,col="black") |
| 733 | |
| 734 | } |
| 735 | |
| 736 | plotmarks <- function(t,s0,noctave,markt,marks){ |
| 737 | |
| 738 | if (markt[1]!=-999){ |
| 739 | |
| 740 | for (i in 1:length(markt)){ |
| 741 | lines(c(markt[i],markt[i]),c(0,1),lty="dotted") |
| 742 | } |
| 743 | |
| 744 | } |
| 745 | |
| 746 | if (marks[1]!=-999){ |
| 747 | |
| 748 | for (i in 1:length(marks)){ |
| 749 | lines(c(t[1],t[length(t)]),c(log2(marks[i]/s0)/noctave,log2(marks[i]/s0)/noctave),lty="dotted") |
| 750 | } |
| 751 | |
| 752 | } |
| 753 | |
| 754 | } |
| 755 | |
| 756 | |
| 757 | ##################### |
| 758 | # PLOT.WT |
| 759 | ##################### |
| 760 | |
| 761 | 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){ |
| 762 | |
| 763 | 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) |
| 764 | |
| 765 | } |
| 766 | |
| 767 | plotwt <- |
| 768 | 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){ |
| 769 | |
| 770 | if (is.null(phs)) phase <- FALSE |
| 771 | |
| 772 | mgpv <- c(3,1,0) |
| 773 | if (labsc>1) mgpv[1] <- 3-(labsc-1.5) |
| 774 | |
| 775 | ncolors <- 64 |
| 776 | colors <- wtcolors(ncolors) |
| 777 | if (color==FALSE) colors <- gray((0:ncolors)/ncolors*0.7+0.3) |
| 778 | |
| 779 | rangev <- (0:(ncolors-1))/(ncolors-1) |
| 780 | rangebar <- matrix(rangev,nrow=2,ncol=64,byrow=TRUE) |
| 781 | |
| 782 | s <- 2^(0:(noctave))*s0 |
| 783 | sn <- (0:(noctave))/noctave |
| 784 | |
| 785 | deltat <- (t[length(t)]-t[1])/(length(t)-1) |
| 786 | cut <- FALSE |
| 787 | if ((!is.null(t1)) | (!is.null(t2))){ |
| 788 | if (t1<t2 & t1>=t[1] & t2<=t[length(t)]){ |
| 789 | |
| 790 | cut <- TRUE |
| 791 | |
| 792 | i1 <- (t1-t[1])/deltat+1 |
| 793 | i2 <- (t2-t[1])/deltat+1 |
| 794 | |
| 795 | t <- t[t>=t1 & t<=t2] |
| 796 | |
| 797 | wt <- wt[i1:i2,] |
| 798 | if (phase) phs <- phs[i1:i2,] |
| 799 | if (length(at)>1) at <- at[i1:i2,] |
| 800 | |
| 801 | } |
| 802 | } |
| 803 | |
| 804 | #---------------- |
| 805 | # Setting layout |
| 806 | #---------------- |
| 807 | |
| 808 | if (device=="ps" && split==FALSE){ |
| 809 | |
| 810 | file <- paste(file,".eps",sep="") |
| 811 | |
| 812 | postscript(file,onefile=TRUE,horizontal=TRUE,paper="special",width=pwidth,height=pheight) |
| 813 | cat(paste("# writing",file," \n")) |
| 814 | |
| 815 | } |
| 816 | |
| 817 | if (device=="ps" && split==TRUE){ |
| 818 | |
| 819 | file1 <- paste(file,".mod.eps",sep="") |
| 820 | |
| 821 | postscript(file1,onefile=TRUE,horizontal=TRUE,paper="special",width=pwidth,height=pheight) |
| 822 | cat(paste("# writing",file1," \n")) |
| 823 | |
| 824 | } |
| 825 | |
| 826 | if (phase==TRUE && split==FALSE) nlo <- layout(matrix(c(1,2,3,4),2,2,byrow=TRUE),widths=c(4,1)) |
| 827 | else nlo <- layout(matrix(c(1,2),ncol=2,byrow=TRUE),widths=c(4,1)) |
| 828 | |
| 829 | |
| 830 | #----------------- |
| 831 | # Plotting modulus |
| 832 | #----------------- |
| 833 | |
| 834 | if (logscale){ |
| 835 | if (units=="") |
| 836 | image(x=t,z=log10(wt),col = colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) |
| 837 | else |
| 838 | 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) |
| 839 | } |
| 840 | else{ |
| 841 | if (units=="") |
| 842 | image(x=t,z=wt,col = colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) |
| 843 | else |
| 844 | 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) |
| 845 | } |
| 846 | |
| 847 | text(t[1+as.integer(length(t)*0.1)],0.8,labtext,cex=2) |
| 848 | |
| 849 | if (sigplot==1 | sigplot==3){ |
| 850 | if (is.null(cv)==FALSE){ #Critical values |
| 851 | if (cv[1]!=0 & cv[1]!=-1) plotcv(t,wt,cv) |
| 852 | } |
| 853 | } |
| 854 | |
| 855 | if (sigplot>1) plotat(t,wt,at,sigplot) |
| 856 | |
| 857 | if (!cut) plotcoi(t,s0,noctave,w0) #cone of influence |
| 858 | plotmarks(t,s0,noctave,markt,marks) #additional guiding lines |
| 859 | |
| 860 | if (is.null(xax)) |
| 861 | axis(side=1,at=axTicks(1),cex.axis=labsc) |
| 862 | else |
| 863 | if (is.null(xlab)) |
| 864 | axis(side=1,xax,labels=as.character(xax),cex.axis=labsc) |
| 865 | else |
| 866 | axis(side=1,xax,labels=xlab,cex.axis=labsc) |
| 867 | |
| 868 | if (is.null(yax)) |
| 869 | axis(side=2,sn,labels=as.character(s),cex.axis=labsc) |
| 870 | else |
| 871 | if (is.null(ylab)) |
| 872 | axis(side=2,yax,labels=as.character(yax),cex.axis=labsc) |
| 873 | else |
| 874 | axis(side=2,yax,labels=ylab,cex.axis=labsc) |
| 875 | |
| 876 | title(main=plottitle,cex=labsc) |
| 877 | |
| 878 | image(z=rangebar,axes=FALSE,col=colors,frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) |
| 879 | |
| 880 | if (is.null(cv)==FALSE){ |
| 881 | if (length(dim(cv))==0){ |
| 882 | for (i in 1:length(cv)) |
| 883 | if (cv[i]!=0) lines(c(-1,2),c(cv[i],cv[i])) |
| 884 | } |
| 885 | } |
| 886 | |
| 887 | if (!logscale) |
| 888 | axis(side=2,(0:5)/5,labels=c("0","","","","","1"),cex.axis=labsc) |
| 889 | else{ |
| 890 | labelv <- substr(as.character(c(0:5)*(max(log10(wt),na.rm=TRUE)-min(log10(wt),na.rm=TRUE))/5),1,4) |
| 891 | axis(side=2,(0:5)/5,labels=labelv,cex.axis=labsc) |
| 892 | } |
| 893 | |
| 894 | |
| 895 | #----------------- |
| 896 | # Plotting phase |
| 897 | #----------------- |
| 898 | if (phase==TRUE){ |
| 899 | |
| 900 | if (device=="ps" && split==TRUE){ |
| 901 | |
| 902 | dev.off() |
| 903 | |
| 904 | file2 <- paste(file,".phs.eps",sep="") |
| 905 | |
| 906 | postscript(file2,onefile=TRUE,horizontal=TRUE,paper="special",width=10,height=5) |
| 907 | cat(paste("# writing",file2," \n")) |
| 908 | |
| 909 | } |
| 910 | |
| 911 | colors <- rainbow(ncolors) |
| 912 | if (color==FALSE){ |
| 913 | dummy <- gray((0:ncolors)/ncolors) |
| 914 | colors[1:(ncolors/2)] <- dummy[(ncolors/2+1):ncolors] |
| 915 | colors[(ncolors/2+1):ncolors] <- dummy[1:(ncolors/2)] |
| 916 | } |
| 917 | |
| 918 | if (units=="") |
| 919 | image(x=t,z=phs,col=colors,axes=FALSE,xlab="Time",ylab="Scale",frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) |
| 920 | else |
| 921 | 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) |
| 922 | |
| 923 | if (is.null(cv)==FALSE) plotcv(t,wt,cv) |
| 924 | if (sigplot>1) plotat(t,wt,at,sigplot) |
| 925 | if (!cut) plotcoi(t,s0,noctave,w0) |
| 926 | plotmarks(t,s0,noctave,markt,marks) |
| 927 | |
| 928 | if (is.null(xax)) |
| 929 | axis(side=1,at=axTicks(1),cex.axis=labsc) |
| 930 | else |
| 931 | if (is.null(xlab)) |
| 932 | axis(side=1,xax,labels=as.character(xax),cex.axis=labsc) |
| 933 | else |
| 934 | axis(side=1,xax,labels=xlab,cex.axis=labsc) |
| 935 | |
| 936 | if (is.null(yax)) |
| 937 | axis(side=2,sn,labels=as.character(s),cex.axis=labsc) |
| 938 | else |
| 939 | if (is.null(ylab)) |
| 940 | axis(side=2,yax,labels=as.character(yax),cex.axis=labsc) |
| 941 | else |
| 942 | axis(side=2,yax,labels=ylab,cex.axis=labsc) |
| 943 | |
| 944 | |
| 945 | title(main="Phase") |
| 946 | |
| 947 | image(z=rangebar,axes=FALSE,col=colors,frame.plot=TRUE,cex.lab=labsc,mgp=mgpv) |
| 948 | axis(side=2,(0:4)/4,labels=c("-PI","","0","","PI"),cex.axis=labsc) |
| 949 | |
| 950 | } |
| 951 | |
| 952 | if (device=="ps") dev.off() |
| 953 | |
| 954 | } |
| 955 | |
| 956 | ############################## |
| 957 | # Surrogates |
| 958 | ############################## |
| 959 | |
| 960 | createwavesurrogates <- function(nsurr=1,wt=1,n,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi){ |
| 961 | |
| 962 | surrmat <- matrix(rep(0,n*nsurr),ncol=nsurr) |
| 963 | |
| 964 | for (i in 1:nsurr){ |
| 965 | |
| 966 | cat(paste("# Creating realization ",i,"\n",sep="")) |
| 967 | |
| 968 | x <- rnorm(n) |
| 969 | xts <- ts(x,start=0,deltat=dt) |
| 970 | |
| 971 | xwt <- cwt.ts(xts,s0,noctave,nvoice,w0) |
| 972 | wtsurr <- wt*xwt |
| 973 | |
| 974 | surri <- as.vector(invmorlet(wtsurr,0,dt,s0,noctave,nvoice,w0)) |
| 975 | |
| 976 | surrmat[,i] <- Re(surri) |
| 977 | |
| 978 | } |
| 979 | |
| 980 | surrmat |
| 981 | |
| 982 | } |
| 983 | |
| 984 | surrwave <- function(x,...) |
| 985 | UseMethod("surrwave") |
| 986 | |
| 987 | surrwave.wt <- function(wt,nsurr=1,spec=TRUE){ |
| 988 | |
| 989 | n <- length(wt$time) |
| 990 | t0 <- wt$time[1] |
| 991 | dt <- (wt$time[13]-t0)/12 |
| 992 | s0 <- wt$s0 |
| 993 | noctave <- wt$noctave |
| 994 | nvoice <- wt$nvoice |
| 995 | w0 <- wt$w0 |
| 996 | |
| 997 | wt <- wt$modulus |
| 998 | if (spec==TRUE) |
| 999 | wt <- sqrt(wt) |
| 1000 | |
| 1001 | surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0) |
| 1002 | |
| 1003 | surrts <- ts(surrmat,start=t0,deltat=dt) |
| 1004 | |
| 1005 | surrts |
| 1006 | |
| 1007 | } |
| 1008 | |
| 1009 | 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){ |
| 1010 | |
| 1011 | if (sw!=0 & swabs==0) |
| 1012 | swabs <- as.integer(sw*nvoice) |
| 1013 | |
| 1014 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 1015 | |
| 1016 | if ((noctave*nvoice+1)!=dim(mat)[2]) |
| 1017 | cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n") |
| 1018 | |
| 1019 | n <- dim(mat)[1] |
| 1020 | |
| 1021 | if (spec==FALSE) |
| 1022 | mat <- Mod(mat) |
| 1023 | else |
| 1024 | mat <- sqrt(Mod(mat)) |
| 1025 | |
| 1026 | wtsm <- smooth.matrix(mat,swabs) |
| 1027 | wt <- smooth.time(wtsm,tw,dt,scalevector) |
| 1028 | |
| 1029 | surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0) |
| 1030 | |
| 1031 | surrts <- ts(surrmat,start=t0,deltat=dt) |
| 1032 | |
| 1033 | surrts |
| 1034 | |
| 1035 | } |
| 1036 | |
| 1037 | surrwave.character <- |
| 1038 | 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){ |
| 1039 | |
| 1040 | if (sw!=0 & swabs==0) |
| 1041 | swabs <- as.integer(sw*nvoice) |
| 1042 | |
| 1043 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 1044 | |
| 1045 | if (transpose==FALSE) |
| 1046 | mat <- matrix(scan(file,comment.char="#"),ncol=nvoice*noctave+1,byrow=TRUE) |
| 1047 | else |
| 1048 | mat <- matrix(scan(file,comment.char="#"),ncol=nvoice*noctave+1,byrow=FALSE) |
| 1049 | |
| 1050 | if ((noctave*nvoice+1)!=dim(mat)[2]) |
| 1051 | cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n") |
| 1052 | |
| 1053 | n <- dim(mat)[1] |
| 1054 | |
| 1055 | if (spec==FALSE) |
| 1056 | mat <- Mod(mat) |
| 1057 | else |
| 1058 | mat <- sqrt(Mod(mat)) |
| 1059 | |
| 1060 | wtsm <- smooth.matrix(mat,swabs) |
| 1061 | wt <- smooth.time(wtsm,tw,dt,scalevector) |
| 1062 | |
| 1063 | surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0) |
| 1064 | |
| 1065 | surrts <- ts(surrmat,start=t0,deltat=dt) |
| 1066 | |
| 1067 | surrts |
| 1068 | |
| 1069 | } |
| 1070 | |
| 1071 | surrwave.ts <- function(ts,nsurr=1,s0=1,noctave=5,nvoice=10,w0=2*pi,sw=0,tw=0,swabs=0){ |
| 1072 | |
| 1073 | n <- length(ts) |
| 1074 | t0 <- time(ts)[1] |
| 1075 | dt <- deltat(ts) |
| 1076 | if (sw!=0 & swabs==0) |
| 1077 | swabs <- as.integer(sw*nvoice) |
| 1078 | |
| 1079 | scalevector <- 2^(0:(noctave*nvoice)/nvoice)*s0 |
| 1080 | |
| 1081 | wt <- Mod(cwt.ts(ts,s0,noctave,nvoice,w0)) |
| 1082 | |
| 1083 | wtsm <- smooth.matrix(wt,swabs) |
| 1084 | wt <- smooth.time(wtsm,tw,dt,scalevector) |
| 1085 | |
| 1086 | surrmat <- createwavesurrogates(nsurr,wt,n,dt,s0,noctave,nvoice,w0) |
| 1087 | |
| 1088 | surrts <- ts(surrmat,start=t0,deltat=dt) |
| 1089 | |
| 1090 | surrts |
| 1091 | |
| 1092 | } |
| 1093 | |
| 1094 | invmorlet <- function(wt,t0=0,dt=1,s0=1,noctave=5,nvoice=10,w0=2*pi){ |
| 1095 | |
| 1096 | if ((noctave*nvoice+1)!=dim(wt)[2]) |
| 1097 | cat("# ERROR! nscales unequal noctave*nvoice+1 ! \n") |
| 1098 | |
| 1099 | n <- dim(wt)[1] |
| 1100 | |
| 1101 | wt[is.na(wt)] <- 0 |
| 1102 | |
| 1103 | tsRe <- rep(0,n) |
| 1104 | tsIm <- rep(0,n) |
| 1105 | |
| 1106 | wtRe <- t(Re(wt)) |
| 1107 | wtIm <- t(Im(wt)) |
| 1108 | |
| 1109 | z <- .C("invmorlet", |
| 1110 | as.double(as.vector(wtRe)), |
| 1111 | as.double(as.vector(wtIm)), |
| 1112 | as.integer(n), |
| 1113 | as.double(dt), |
| 1114 | as.double(s0), |
| 1115 | as.integer(noctave), |
| 1116 | as.integer(nvoice), |
| 1117 | as.double(w0), |
| 1118 | tsRetmp = as.double(tsRe), |
| 1119 | tsImtmp = as.double(tsIm), |
| 1120 | PACKAGE="sowas") |
| 1121 | |
| 1122 | invvec=complex(real=z$tsRetmp,imaginary=z$tsImtmp) |
| 1123 | invts <- ts(data=invvec,start=t0,deltat=dt) |
| 1124 | |
| 1125 | invts |
| 1126 | |
| 1127 | } |
| 1128 | |
| 1129 | ################################# |
| 1130 | # INPUT / OUTPUT |
| 1131 | ################################# |
| 1132 | |
| 1133 | readmatrix <- function(file,M){ |
| 1134 | |
| 1135 | A <- matrix(scan(file,comment.char="#"),ncol=M,byrow=TRUE) |
| 1136 | |
| 1137 | A |
| 1138 | |
| 1139 | } |
| 1140 | |
| 1141 | |
| 1142 | readts <- function(file){ |
| 1143 | |
| 1144 | A <- matrix(scan(file,comment.char="#"),ncol=2,byrow=TRUE) |
| 1145 | |
| 1146 | Adum <- A |
| 1147 | |
| 1148 | Adum[is.na(Adum)] <- 0 |
| 1149 | |
| 1150 | t <- Adum %*% c(1,0) |
| 1151 | x <- A %*% c(0,1) |
| 1152 | |
| 1153 | N=length(t) |
| 1154 | f=1/(t[13]-t[1])*12 |
| 1155 | |
| 1156 | if ((f>11) && (f<13)) f <- 12 |
| 1157 | |
| 1158 | timeseries<-ts(data=x,start=t[1],frequency=f) |
| 1159 | |
| 1160 | timeseries |
| 1161 | |
| 1162 | } |
| 1163 | |
| 1164 | writematrix <- function(file,data,header="# R Matrix"){ |
| 1165 | |
| 1166 | write(header,file) |
| 1167 | write(t(data),file,ncol(data),append=TRUE) |
| 1168 | |
| 1169 | } |
| 1170 | |
| 1171 | ############################ |
| 1172 | # HELP FUNCTIONS |
| 1173 | ############################ |
| 1174 | |
| 1175 | smooth.matrix <- function(wt,swabs){ |
| 1176 | |
| 1177 | if (swabs != 0) |
| 1178 | smwt <- t(filter(t(wt),rep(1,2*swabs+1)/(2*swabs+1))) |
| 1179 | else |
| 1180 | smwt <- wt |
| 1181 | |
| 1182 | smwt |
| 1183 | |
| 1184 | } |
| 1185 | |
| 1186 | smooth.time <- function(wt,tw,dt,scalevector){ |
| 1187 | |
| 1188 | smwt <- wt |
| 1189 | |
| 1190 | if (tw != 0){ |
| 1191 | for (i in 1:length(scalevector)){ |
| 1192 | |
| 1193 | twi <- as.integer(scalevector[i]*tw/dt) |
| 1194 | smwt[,i] <- filter(wt[,i],rep(1,2*twi+1)/(2*twi+1)) |
| 1195 | |
| 1196 | } |
| 1197 | } |
| 1198 | |
| 1199 | smwt |
| 1200 | |
| 1201 | } |
| 1202 | |
| 1203 | |
| 1204 | adjust.noctave <- function(N,dt,s0,tw,noctave){ |
| 1205 | |
| 1206 | if (tw>0){ |
| 1207 | dumno <- as.integer((log(N*dt)-log(2*tw*s0))/log(2)) |
| 1208 | if (dumno<noctave){ |
| 1209 | cat("# noctave adjusted to time smoothing window \n") |
| 1210 | noctave <- dumno |
| 1211 | } |
| 1212 | } |
| 1213 | |
| 1214 | noctave |
| 1215 | |
| 1216 | } |
| 1217 | |
| 1218 | adjust.s0 <- function(s0,dt){ |
| 1219 | |
| 1220 | if (s0<2*dt){ |
| 1221 | s0 <- 2*dt |
| 1222 | cat(paste("# s0 set to ",s0," \n")) |
| 1223 | } |
| 1224 | |
| 1225 | s0 |
| 1226 | |
| 1227 | } |
| 1228 | |
| 1229 | adjust.timeseries <- function(ts1,ts2){ |
| 1230 | |
| 1231 | if (length(ts1)!=length(ts2)){ |
| 1232 | tsint <- ts.intersect(ts1,ts2) |
| 1233 | dt <- deltat(ts1) |
| 1234 | ts1 <- ts(data=tsint[,1],start=time(tsint)[1],frequency=1/dt) |
| 1235 | ts2 <- ts(data=tsint[,2],start=time(tsint)[1],frequency=1/dt) |
| 1236 | t <- time(ts1) |
| 1237 | } |
| 1238 | |
| 1239 | list(ts1=ts1,ts2=ts2) |
| 1240 | |
| 1241 | } |
| 1242 | |
| 1243 | checkarealsiglevel <- function(sw,tw,w0,arealsiglevel,siglevel,type){ |
| 1244 | |
| 1245 | if (type==0){ |
| 1246 | |
| 1247 | swv <- c(0,0.5,1) |
| 1248 | twv <- c(0,1.5,3) |
| 1249 | w0v <- c(pi,2*pi) |
| 1250 | |
| 1251 | if (length(swv[swv==sw])==0 || length(twv[twv==tw])==0 || |
| 1252 | length(w0v[w0v==w0])==0){ |
| 1253 | arealsiglevel <- 0 |
| 1254 | cat("# areawise test for spectrum currently \n") |
| 1255 | cat("# only possible for \n") |
| 1256 | cat("# sw = 0 \n") |
| 1257 | cat("# tw = 0 \n") |
| 1258 | cat("# w0 = 2pi \n") |
| 1259 | cat("# No areawise test performed \n") |
| 1260 | } |
| 1261 | } |
| 1262 | |
| 1263 | if (type==1){ |
| 1264 | |
| 1265 | swv <- c(0.5) |
| 1266 | twv <- c(1.5) |
| 1267 | w0v <- c(2*pi) |
| 1268 | |
| 1269 | if (length(swv[swv==sw])==0 || length(twv[twv==tw])==0 || |
| 1270 | length(w0v[w0v==w0])==0){ |
| 1271 | arealsiglevel <- 0 |
| 1272 | cat("# areawise test for coherence currently \n") |
| 1273 | cat("# only possible for \n") |
| 1274 | cat("# sw = 0.5 \n") |
| 1275 | cat("# tw = 1.5 \n") |
| 1276 | cat("# w0 = 2pi \n") |
| 1277 | cat("# No areawise test performed \n") |
| 1278 | } |
| 1279 | } |
| 1280 | |
| 1281 | |
| 1282 | if (arealsiglevel!=0){ |
| 1283 | arealsiglevel <- 0.9 |
| 1284 | siglevel <- 0.95 |
| 1285 | cat("# currently only siglevel=0.95 and arealsiglevel=0.9 possible for areawise test \n") |
| 1286 | } |
| 1287 | |
| 1288 | list(siglevel=siglevel,arealsiglevel=arealsiglevel) |
| 1289 | |
| 1290 | } |
| 1291 | |
| 1292 | ######################## |
| 1293 | |
| 1294 | as.wt <- function(modulus,phase=NULL,s0=NULL,noctave=NULL,nvoice=NULL,w0=NULL,dt=1,time=NULL,scales=NULL,critval=NULL,at=NULL,kernel=NULL,N=NULL,t0=NULL){ |
| 1295 | |
| 1296 | if (is.null(scales)) |
| 1297 | gotscales <- FALSE |
| 1298 | else |
| 1299 | gotscales <- TRUE |
| 1300 | |
| 1301 | if ((!gotscales) & (!is.null(s0)) & (!is.null(noctave)) &(!is.null(nvoice))){ |
| 1302 | gotscales <- TRUE |
| 1303 | scales=2^(0:(noctave*nvoice)/nvoice)*s0 |
| 1304 | } |
| 1305 | |
| 1306 | if (gotscales & (is.null(s0) | is.null(noctave) | |
| 1307 | is.null(nvoice))){ |
| 1308 | s0 <- scales[1] |
| 1309 | noctave <- log(scales[length(scales)]/s0)/log(2) |
| 1310 | nvoice <- (length(scales)-1)/noctave |
| 1311 | } |
| 1312 | |
| 1313 | |
| 1314 | if (!gotscales) |
| 1315 | cat("# ERROR! No scales given! \n") |
| 1316 | |
| 1317 | if (is.null(time)) gottimes <- FALSE |
| 1318 | else gottimes <- TRUE |
| 1319 | |
| 1320 | if ((!gottimes) & (!is.null(dt)) & (!is.null(t0)) &(!is.null(N))){ |
| 1321 | gottimes <- TRUE |
| 1322 | time=(0:(N-1))*dt+t0 |
| 1323 | } |
| 1324 | |
| 1325 | if (!gottimes) |
| 1326 | cat("# ERROR! No time vector given! \n") |
| 1327 | |
| 1328 | wcolist <- list(modulus=modulus,phase=phase,s0=s0,noctave=noctave,nvoice=nvoice,w0=w0,time=time,scales=scales,critval=critval,at=at,kernel=kernel) |
| 1329 | |
| 1330 | class(wcolist) <- "wt" |
| 1331 | |
| 1332 | wcolist |
| 1333 | |
| 1334 | } |
| 1335 | |
| 1336 | ######################## |
| 1337 | |
| 1338 | wtcolors <- function(ncolors){ |
| 1339 | |
| 1340 | upside <- rainbow(ncolors,start=0,end=.7) |
| 1341 | #upside <- heat.colors(ncolors+5) |
| 1342 | #upside <- upside[1:ncolors] |
| 1343 | |
| 1344 | |
| 1345 | down <- upside |
| 1346 | |
| 1347 | for (i in 1:ncolors){ |
| 1348 | down[i] <- upside[ncolors+1-i] |
| 1349 | }# |
| 1350 | |
| 1351 | down |
| 1352 | |
| 1353 | } |
| 1354 | |
| 1355 | #################### |
| 1356 | |
| 1357 | createwgn <- function(N,sig,dt){ |
| 1358 | |
| 1359 | timeseries<-ts(data=rnorm(N,0,sig),start=0,deltat=dt) |
| 1360 | |
| 1361 | timeseries |
| 1362 | |
| 1363 | } |
| 1364 | |
| 1365 | |
| 1366 | createar <- function(N,a,sig,dt){ |
| 1367 | |
| 1368 | if (a==0) a <- 0.000000001 |
| 1369 | |
| 1370 | se <- sqrt(sig*sig*(1-a*a)) |
| 1371 | tsMC <- ts(data=rep(0,N),start=0,deltat=dt) |
| 1372 | |
| 1373 | tsMC[1:N] <- arima.sim(list(ar = a), N, sd = se) |
| 1374 | |
| 1375 | } |
| 1376 | |
| 1377 | ###################### |
| 1378 | |
| 1379 | rk <- function(N=1000,s=8,noctave=5,nvoice=10,w0=2*pi,plot=TRUE){ |
| 1380 | |
| 1381 | t <- 1:N |
| 1382 | |
| 1383 | sunit <- s*(w0+sqrt(2+w0*w0))/(4*pi) |
| 1384 | |
| 1385 | s0 <- 4 |
| 1386 | #s0unit <- s0*(w0+sqrt(2+w0*w0))/(4*pi) |
| 1387 | s0unit=s0/dt*w0/(2*pi) #(CORRECT) |
| 1388 | s0log <- as.integer((log2(s0unit)-1)*nvoice+1.5) |
| 1389 | |
| 1390 | totnoct <- noctave+as.integer(s0log/nvoice)+1 |
| 1391 | |
| 1392 | x <- morlet(N,N/2,sunit,w0) |
| 1393 | |
| 1394 | totts.cwt <- Mod(cwt(x,totnoct,nvoice,w0,plot=0)) |
| 1395 | wt=totts.cwt[,s0log:(s0log+noctave*nvoice)] |
| 1396 | |
| 1397 | wt <- wt/max(wt) |
| 1398 | |
| 1399 | if (plot==TRUE) plotwt(wt,0,t,s0,noctave,w0,units="",plottitle="Reproducing Kernel") |
| 1400 | |
| 1401 | wt |
| 1402 | |
| 1403 | } |
| 1404 | |
| 1405 | ################### |
| 1406 | |
| 1407 | addvalues <- function(nvoice,dnoctave,x,value){ |
| 1408 | |
| 1409 | nr <- dim(x)[1] |
| 1410 | nc <- dim(x)[2] |
| 1411 | dnc <- nvoice*dnoctave |
| 1412 | |
| 1413 | y <- matrix(rep(value,nr*(nc+dnc)),nrow=nr) |
| 1414 | |
| 1415 | y[,(dnc+1):(dnc+nc)] <- x |
| 1416 | |
| 1417 | y |
| 1418 | |
| 1419 | } |
| 1420 | |
| 1421 | #################### |
| 1422 | |
| 1423 | scalematrix <- function(wt){ |
| 1424 | |
| 1425 | # scales matrix, such that the maximal value is one |
| 1426 | # wt: matrix to be scaled |
| 1427 | |
| 1428 | mval <- max(wt,na.rm=TRUE) |
| 1429 | |
| 1430 | wt <- wt/mval |
| 1431 | |
| 1432 | wt |
| 1433 | |
| 1434 | } |
| 1435 | |
| 1436 | |
| 1437 | foldKernel <- function(F,swabs,tw,s,dt){ |
| 1438 | |
| 1439 | # folds a matrix (e.g. kernel with smoothing window |
| 1440 | # F: matrix input |
| 1441 | # swabs: smooting window width |
| 1442 | |
| 1443 | smsF <- smooth.matrix(F,swabs) |
| 1444 | smsF[is.na(smsF)] <- 0 |
| 1445 | |
| 1446 | smtsF <- smooth.time(smsF,tw,dt,s) |
| 1447 | |
| 1448 | smtsF[is.na(smtsF)] <- 0 |
| 1449 | |
| 1450 | scF <- scalematrix(smtsF) |
| 1451 | |
| 1452 | scF |
| 1453 | |
| 1454 | } |
| 1455 | |
| 1456 | kernelBitmap <- function(c,s0=1,w0=6,noctave=6,nvoice=20,swabs=0,tw=0,dt=1){ |
| 1457 | # produces kernel bitmap |
| 1458 | # c: height of contour, that defines area |
| 1459 | # s0: lowest scale |
| 1460 | # noctave: number of octaves |
| 1461 | # nvoice: number of voices per octave |
| 1462 | # swabs: smoothing window length in scale direction |
| 1463 | # dt: sampling time |
| 1464 | |
| 1465 | s <- s0*2^noctave |
| 1466 | is <- noctave*nvoice |
| 1467 | |
| 1468 | x <- s0*2^(((1:(nvoice*(noctave+2)))-1)/nvoice) |
| 1469 | |
| 1470 | t <- max(2000,max(x)*tw*2/dt*1.1) |
| 1471 | |
| 1472 | y <- ((0:(2*t))-t)/2*dt |
| 1473 | |
| 1474 | X <- matrix(x,ncol=nvoice*(noctave+2),nrow=2*t+1,byrow=T) |
| 1475 | Y <- matrix(y,ncol=nvoice*(noctave+2),nrow=2*t+1) |
| 1476 | |
| 1477 | F <- sqrt(2*s*X/(s*s+X*X))*exp(-0.5*(Y*Y+w0*w0*(X-s)*(X-s))/(s*s+X*X)) |
| 1478 | |
| 1479 | F <- foldKernel(F,swabs,tw,x,dt) |
| 1480 | |
| 1481 | F[F<c] <- 0 |
| 1482 | F[F>=c] <- 1 |
| 1483 | |
| 1484 | is1 <- 1 |
| 1485 | is2 <- nvoice*(noctave+1) |
| 1486 | it1 <- 1 |
| 1487 | it2 <- 2*t+1 |
| 1488 | |
| 1489 | L <- F[1:(2*t+1),is1] |
| 1490 | |
| 1491 | while (length(L[L!=0])==0) { |
| 1492 | is1 <- is1+1 |
| 1493 | L <- F[1:(2*t+1),is1] |
| 1494 | } |
| 1495 | |
| 1496 | L <- F[1:(2*t+1),is2] |
| 1497 | |
| 1498 | while (length(L[L!=0])==0) { |
| 1499 | is2 <- is2-1 |
| 1500 | L <- F[1:(2*t+1),is2] |
| 1501 | } |
| 1502 | |
| 1503 | |
| 1504 | L <- F[it1,1:(nvoice*(noctave+2))] |
| 1505 | |
| 1506 | while (length(L[L!=0])==0) { |
| 1507 | it1 <- it1+1 |
| 1508 | L <- F[it1,1:(nvoice*(noctave+2))] |
| 1509 | } |
| 1510 | |
| 1511 | L <- F[it2,1:(nvoice*(noctave+2))] |
| 1512 | |
| 1513 | while (length(L[L!=0])==0) { |
| 1514 | it2 <- it2-1 |
| 1515 | L <- F[it2,1:(nvoice*(noctave+2))] |
| 1516 | } |
| 1517 | |
| 1518 | kernel <- list(bitmap=F[(it1-1):(it2+1),(is1-1):(is2+1)],is=is-is1) |
| 1519 | |
| 1520 | kernel |
| 1521 | |
| 1522 | } |
| 1523 | |
| 1524 | kernelRoot <- function(s0=1,w0=6,a=0,noctave=6,nvoice=20,swabs=0,tw=0,dt=1){ |
| 1525 | |
| 1526 | tol <- 0.005 |
| 1527 | cmin <- 0 |
| 1528 | cmax <- 1 |
| 1529 | cntr <- 0.5 |
| 1530 | da <- a |
| 1531 | |
| 1532 | while (abs(da/a)>tol){ |
| 1533 | |
| 1534 | da <- kernelArea(cntr,s0,w0,a,noctave,nvoice,swabs,tw,dt) |
| 1535 | if (da>0){ |
| 1536 | cmin <- cntr |
| 1537 | cntr <- mean(c(cntr,cmax)) |
| 1538 | } |
| 1539 | if (da<0){ |
| 1540 | cmax <- cntr |
| 1541 | cntr <- mean(c(cntr,cmin)) |
| 1542 | } |
| 1543 | } |
| 1544 | |
| 1545 | cntr |
| 1546 | |
| 1547 | } |
| 1548 | |
| 1549 | kernelArea <- function(cntr,s0=1,w0=6,a=0,noctave=6,nvoice=20,swabs=0,tw=0,dt=1){ |
| 1550 | |
| 1551 | # calulates area of reproducing kernel for smoothed data at scale s0*2^noctave |
| 1552 | # cntr: height of contour line to define kernel area. This |
| 1553 | # parameter is to be estimated! |
| 1554 | # s0: lowest scale |
| 1555 | # w0: parameter of Morlet Wavelet |
| 1556 | # a: area offset (only needed, when finding root. Is set to |
| 1557 | # desired area |
| 1558 | # noctave: number of octaves |
| 1559 | # nvoice: number of voices per octave |
| 1560 | # swabs: smoothing window width in scale direction |
| 1561 | # dt: sampling time |
| 1562 | |
| 1563 | s <- s0*2^noctave |
| 1564 | |
| 1565 | x <- s0*2^(((1:(nvoice*(noctave+2)))-1)/nvoice) |
| 1566 | |
| 1567 | t <- max(2000,max(x)*tw*2/dt*1.1) |
| 1568 | |
| 1569 | y <- ((0:(2*t))-t)/2*dt |
| 1570 | |
| 1571 | X <- matrix(x,ncol=nvoice*(noctave+2),nrow=2*t+1,byrow=T) |
| 1572 | Y <- matrix(y,ncol=nvoice*(noctave+2),nrow=2*t+1) |
| 1573 | |
| 1574 | F <- sqrt(2*s*X/(s*s+X*X))*exp(-0.5*(Y*Y+w0*w0*(X-s)*(X-s))/(s*s+X*X)) |
| 1575 | |
| 1576 | F <- foldKernel(F,swabs,tw,x,dt) |
| 1577 | |
| 1578 | F[F>=cntr] <- 1 |
| 1579 | F[F<cntr] <- 0 |
| 1580 | |
| 1581 | area <- length(F[F==1])-a |
| 1582 | |
| 1583 | area |
| 1584 | |
| 1585 | } |
| 1586 | |
| 1587 | |
| 1588 | tobin <- function(x){ |
| 1589 | |
| 1590 | # sets nonzero values to one |
| 1591 | |
| 1592 | y <- x/x |
| 1593 | y[is.na(y)] <- 0 |
| 1594 | |
| 1595 | y |
| 1596 | |
| 1597 | } |
| 1598 | |
| 1599 | scaleKernel <- function(kernel,l){ |
| 1600 | |
| 1601 | # scales kernel length in time direction proportional to scale |
| 1602 | # kernel: data bitmap of width n |
| 1603 | # l: new width of kernel |
| 1604 | |
| 1605 | n <- nrow(kernel) |
| 1606 | m <- ncol(kernel) |
| 1607 | |
| 1608 | newKernel <- matrix(rep(0,m*l),nrow=l) |
| 1609 | |
| 1610 | d <- as.double(n)/as.double(l) |
| 1611 | |
| 1612 | for (i in 1:l){ |
| 1613 | j <- as.integer((i-0.5)*d) |
| 1614 | if (j==0) j <- 1 |
| 1615 | newKernel[i,1:m] <- kernel[j,1:m] |
| 1616 | } |
| 1617 | |
| 1618 | newKernel |
| 1619 | |
| 1620 | } |
| 1621 | |
| 1622 | slope <- function(w0,swabs,tw,nvoice,siglevel,arealsiglevel,type){ |
| 1623 | |
| 1624 | sw <- swabs/nvoice |
| 1625 | |
| 1626 | if (type==0){ # wavelet spectrum |
| 1627 | |
| 1628 | if (tw == 0 & sw == 0 & w0 == 1 *pi) slp <- 5.82518 # w = 18.35831 |
| 1629 | if (tw == 1.5 & sw == 0 & w0 == 1 *pi) slp <- 24.69852 # w = 14.30709 |
| 1630 | if (tw == 3 & sw == 0 & w0 == 1 *pi) slp <- 35.48368 # w = 14.72354 |
| 1631 | if (tw == 0 & sw == 5 & w0 == 1 *pi) slp <- 7.347707 # w = 17.96942 |
| 1632 | if (tw == 1.5 & sw == 5 & w0 == 1 *pi) slp <- 28.24291 # w = 12.65993 |
| 1633 | if (tw == 3 & sw == 5 & w0 == 1 *pi) slp <- 51.13723 # w = 10.96359 |
| 1634 | if (tw == 0 & sw == 10 & w0 == 1 *pi) slp <- 10.47856 # w = 15.5941 |
| 1635 | if (tw == 1.5 & sw == 10 & w0 == 1 *pi) slp <- 45.07387 # w = 15.29793 |
| 1636 | if (tw == 3 & sw == 10 & w0 == 1 *pi) slp <- 52.82886 # w = 12.72361 |
| 1637 | |
| 1638 | if (tw == 0 & sw == 0 & w0 == 2 *pi) slp <- 8.718912 # w = 17.75933 |
| 1639 | if (tw == 1.5 & sw == 0 & w0 == 2 *pi) slp <- 11.88006 # w = 15.39648 |
| 1640 | if (tw == 3 & sw == 0 & w0 == 2 *pi) slp <- 26.55977 # w = 1.064384 |
| 1641 | if (tw == 0 & sw == 5 & w0 == 2 *pi) slp <- 14.64761 # w = 16.27518 |
| 1642 | if (tw == 1.5 & sw == 5 & w0 == 2 *pi) slp <- 28.27798 # w = 14.57059 |
| 1643 | if (tw == 3 & sw == 5 & w0 == 2 *pi) slp <- 63.54121 # w = 12.83778 |
| 1644 | if (tw == 0 & sw == 10 & w0 == 2 *pi) slp <- 27.78735 # w = 11.95813 |
| 1645 | if (tw == 1.5 & sw == 10 & w0 == 2 *pi) slp <- 41.27260 # w = 12.03379 |
| 1646 | if (tw == 3 & sw == 10 & w0 == 2 *pi) slp <- 67.37015 # w = 10.63935 |
| 1647 | |
| 1648 | } |
| 1649 | |
| 1650 | if (type==1){ # wavelet coherence |
| 1651 | |
| 1652 | if (tw==0 & sw==0 & w0==pi) slp <- 999 #not valid |
| 1653 | if (tw==1.5 & sw==0 & w0==pi) slp <- 1 |
| 1654 | if (tw==3 & sw==0 & w0==pi) slp <- 1 |
| 1655 | if (tw==0 & sw==0.5 & w0==pi) slp <- 1 |
| 1656 | if (tw==1.5 & sw==0.5 & w0==pi) slp <- 1 |
| 1657 | if (tw==3 & sw==0.5 & w0==pi) slp <- 1 |
| 1658 | if (tw==0 & sw==1 & w0==pi) slp <- 1 |
| 1659 | if (tw==1.5 & sw==1 & w0==pi) slp <- 1 |
| 1660 | if (tw==3 & sw==1 & w0==pi) slp <- 1 |
| 1661 | |
| 1662 | if (tw==0 & sw==0 & w0==2*pi) slp <- 999 #not valid |
| 1663 | if (tw==1.5 & sw==0 & w0==2*pi) slp <- 1 |
| 1664 | if (tw==3 & sw==0 & w0==2*pi) slp <- 1 |
| 1665 | if (tw==0 & sw==0.5 & w0==2*pi) slp <- 1 |
| 1666 | if (tw==1.5 & sw==0.5 & w0==2*pi) slp <- 8.3 |
| 1667 | if (tw==3 & sw==0.5 & w0==2*pi) slp <- 1 |
| 1668 | if (tw==0 & sw==1 & w0==2*pi) slp <- 1 |
| 1669 | if (tw==1.5 & sw==1 & w0==2*pi) slp <- 1 |
| 1670 | if (tw==3 & sw==1 & w0==2*pi) slp <- 1 |
| 1671 | |
| 1672 | if (tw==0 & sw==0 & w0==3*pi) slp <- 999 #not valid |
| 1673 | if (tw==1.5 & sw==0 & w0==3*pi) slp <- 1 |
| 1674 | if (tw==3 & sw==0 & w0==3*pi) slp <- 1 |
| 1675 | if (tw==0 & sw==0.5 & w0==3*pi) slp <- 1 |
| 1676 | if (tw==1.5 & sw==0.5 & w0==3*pi) slp <- 1 |
| 1677 | if (tw==3 & sw==0.5 & w0==3*pi) slp <- 1 |
| 1678 | if (tw==0 & sw==1 & w0==3*pi) slp <- 1 |
| 1679 | if (tw==1.5 & sw==1 & w0==3*pi) slp <- 1 |
| 1680 | if (tw==3 & sw==1 & w0==3*pi) slp <- 1 |
| 1681 | |
| 1682 | if (tw==0 & sw==0 & w0==4*pi) slp <- 999 #not valid |
| 1683 | if (tw==1.5 & sw==0 & w0==4*pi) slp <- 1 |
| 1684 | if (tw==3 & sw==0 & w0==4*pi) slp <- 1 |
| 1685 | if (tw==0 & sw==0.5 & w0==4*pi) slp <- 1 |
| 1686 | if (tw==1.5 & sw==0.5 & w0==4*pi) slp <- 1 |
| 1687 | if (tw==3 & sw==0.5 & w0==4*pi) slp <- 1 |
| 1688 | if (tw==0 & sw==1 & w0==4*pi) slp <- 1 |
| 1689 | if (tw==1.5 & sw==1 & w0==4*pi) slp <- 1 |
| 1690 | if (tw==3 & sw==1 & w0==4*pi) slp <- 1 |
| 1691 | |
| 1692 | } |
| 1693 | |
| 1694 | cat(paste("# slope ",slp,"\n",sep="")) |
| 1695 | |
| 1696 | slp |
| 1697 | |
| 1698 | } |
| 1699 | |
| 1700 | #============================ |
| 1701 | #============================ |
| 1702 | #============================ |
| 1703 | |
| 1704 | ## 1. Read auxiliar data files #### |
| 1705 | |
| 1706 | identifiants <- read.table("identifs.txt")[ ,1] |
| 1707 | dates0 <- read.table("datesall.txt")[, 1] |
| 1708 | dates <- as.character(dates0[grep("2009", dates0)]) |
| 1709 | rm(dates0) |
| 1710 | |
| 1711 | n <- length(identifiants) |
| 1712 | p <- delta <- length(dates) |
| 1713 | |
| 1714 | synchros09 <- t(as.matrix(read.table("~/tmp/2009_synchros200RC.txt"))) |
| 1715 | #synchros09 <- t(as.matrix(read.table("~/tmp/2009_synchros200-random.txt"))) |
| 1716 | |
| 1717 | nas <- which(is.na(synchros09)[, 1]) # some 1/1/2009 are missing |
| 1718 | synchros09[nas, 1] <- rowMeans(synchros09[nas, 2:4]) #valeurs après 1er janvier |
| 1719 | |
| 1720 | #moyenne pondérée pour compléter deux demi-heures manquantes |
| 1721 | imput09 <- synchros09[, 4180:4181] %*% matrix(c(2/3, 1/3, 1/3, 2/3), 2) |
| 1722 | synchros09 <- cbind(synchros09[, 1:4180], imput09, synchros09[, 4181:17518]) |
| 1723 | |
| 1724 | conso <- synchros09[-201, ]; # series must be on rows |
| 1725 | n <- nrow(conso) |
| 1726 | delta <- ncol(conso) |
| 1727 | |
| 1728 | rm(synchros09, nas) |
| 1729 | |
| 1730 | ## 2. Compute WER distance matrix #### |
| 1731 | |
| 1732 | ## _.a CWT -- Filtering the lowest freqs (>6m) #### |
| 1733 | # nvoice <- 4 |
| 1734 | # # noctave4 = 2^13 = 8192 half hours ~ 180 days |
| 1735 | # noctave4 <- adjust.noctave(N = delta, dt = 1, s0 = 2, |
| 1736 | # tw = 0, noctave = 13) |
| 1737 | # # 4 here represent 2^5 = 32 half-hours ~ 1 day |
| 1738 | # scalevector4 <- 2^(4:(noctave4 * nvoice) / nvoice) * 2 |
| 1739 | # lscvect4 <- length(scalevector4) |
| 1740 | # lscvect <- lscvect4 # i should clean my code: werFam demands a lscvect |
| 1741 | |
| 1742 | |
| 1743 | #17000 colonnes coeff 1, puis 17000 coeff 2... [non : dans chaque tranche du cube] |
| 1744 | |
| 1745 | #TODO: une fonction qui fait lignes 59 à 91 |
| 1746 | |
| 1747 | #cube: |
| 1748 | # Xcwt4 <- toCWT(conso, noctave = noctave4, dt = 1, |
| 1749 | # scalevector = scalevector4, |
| 1750 | # lt = delta, smooth = FALSE, |
| 1751 | # nvoice = nvoice) # observations node with CWT |
| 1752 | # |
| 1753 | # #matrix: |
| 1754 | # ############Xcwt2 <- matrix(0.0, nrow= n, ncol= 2 + delta * lscvect) |
| 1755 | # #Xcwt2 <- matrix(NA_complex_, nrow= n, ncol= 2 + length((c(Xcwt4[,,1])))) |
| 1756 | # |
| 1757 | # #NOTE: delta et lscvect pourraient etre gardés à part (communs) |
| 1758 | # for(i in 1:n) |
| 1759 | # Xcwt2[i,] <- c(delta, lscvect, Xcwt4[,,i] / max(Mod(Xcwt4[,,i])) ) |
| 1760 | # |
| 1761 | # #rm(conso, Xcwt4); gc() |
| 1762 | # |
| 1763 | # ## _.b WER^2 distances ######## |
| 1764 | # Xwer_dist <- matrix(0.0, n, n) |
| 1765 | # for(i in 1:(n - 1)){ |
| 1766 | # mat1 <- vect2mat(Xcwt2[i,]) |
| 1767 | # for(j in (i + 1):n){ |
| 1768 | # mat2 <- vect2mat(Xcwt2[j,]) |
| 1769 | # num <- Mod(mat1 * Conj(mat2)) |
| 1770 | # WX <- Mod(mat1 * Conj(mat1)) |
| 1771 | # WY <- Mod(mat2 * Conj(mat2)) |
| 1772 | # smsmnum <- smCWT(num, scalevector = scalevector4) |
| 1773 | # smsmWX <- smCWT(WX, scalevector = scalevector4) |
| 1774 | # smsmWY <- smCWT(WY, scalevector = scalevector4) |
| 1775 | # wer2 <- sum(colSums(smsmnum)^2) / |
| 1776 | # sum( sum(colSums(smsmWX) * colSums(smsmWY)) ) |
| 1777 | # Xwer_dist[i, j] <- sqrt(delta * lscvect * (1 - wer2)) |
| 1778 | # Xwer_dist[j, i] <- Xwer_dist[i, j] |
| 1779 | # } |
| 1780 | # } |
| 1781 | # diag(Xwer_dist) <- numeric(n) |
| 1782 | # |
| 1783 | # save(Xwer_dist, file = "../res/2009_synchros200WER.Rdata") |
| 1784 | # save(Xwer_dist, file = "../res/2009_synchros200-randomWER.Rdata") |
| 1785 | |
| 1786 | load("../res/2009_synchros200WER.Rdata") |
| 1787 | #load("../res/2009_synchros200-randomWER.Rdata") |
| 1788 | |
| 1789 | ## 3. Cluster using WER distance matrix #### |
| 1790 | |
| 1791 | #hc <- hclust(as.dist(Xwer_dist), method = "ward.D") |
| 1792 | #plot(hc) |
| 1793 | # |
| 1794 | # #clust <- cutree(hc, 2) |
| 1795 | # |
| 1796 | for(K in 2:30){ |
| 1797 | #K <- 3 |
| 1798 | #pamfit <- pam(tdata[-201, ci$selectv], k = K) |
| 1799 | pamfit <- pam(as.dist(Xwer_dist), k = K, diss = TRUE) |
| 1800 | |
| 1801 | #table(pamfit$clustering) |
| 1802 | |
| 1803 | SC <- matrix(0, ncol = p, nrow = K) |
| 1804 | |
| 1805 | clustfactor <- pamfit$clustering |
| 1806 | # for(k in 1:K){ |
| 1807 | # clustk <- which(clustfactor == k) |
| 1808 | # if(length(clustk) > 0) { |
| 1809 | # if(length(clustk) > 1) { |
| 1810 | # SCk <- colSums(synchros09[which(clustfactor == k), ]) |
| 1811 | # } else { |
| 1812 | # SCk <- synchros09[which(clustfactor == k), ] |
| 1813 | # } |
| 1814 | # SC[k, ] <- SC[k, ] + SCk |
| 1815 | # rm(SCk) |
| 1816 | # } |
| 1817 | #} |
| 1818 | |
| 1819 | #write.table(clustfactor, file = paste0("~/tmp/clustfactorRC", K, ".txt")) |
| 1820 | #write.table(clustfactor, file = "~/tmp/clustfactor3.txt") |
| 1821 | #write.table(clustfactor, file = paste0("~/tmp/clustfactorWER", K, ".txt")) |
| 1822 | write.table(clustfactor, file = paste0("~/tmp/clustfactor-randomWER", K, ".txt")) |
| 1823 | } |
| 1824 | # |
| 1825 | # # Plots |
| 1826 | # layout(1) |
| 1827 | # matplot(t(SC)[48*10 + 1:(48*30), ], type = 'l', ylab = '',col = 1:3, lty = 1) |
| 1828 | # matplot(t(SC)[48*100 + 1:(48*30), ], type = 'l', ylab = '', col = 1:3, lty = 1) |
| 1829 | # |
| 1830 | # |
| 1831 | # |