First commit
[epclust.git] / temp / WerDist.R
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 #