2015-08-04 2 views
1

J'essaie de comprendre la fonction ondelette croix en R, mais ne peut pas comprendre comment convertir les flèches de décalage de phase à un décalage dans le temps avec le package biwavelet. Par exemple:calculer le décalage de flèches de phase avec biwavelet en r

require(gamair) 
data(cairo) 
data_1 <- within(cairo, Date <- as.Date(paste(year, month, day.of.month, sep = "-"))) 
data_1 <- data_1[,c('Date','temp')] 
data_2 <- data_1 

# add a lag 
n <- nrow(data_1) 
nn <- n - 49 
data_1 <- data_1[1:nn,] 
data_2 <- data_2[50:nrow(data_2),] 
data_2[,1] <- data_1[,1] 

require(biwavelet) 
d1 <- data_1[,c('Date','temp')] 
d2 <- data_2[,c('Date','temp')] 
xt1 <- xwt(d1,d2) 
plot(xt1, plot.phase = TRUE) 

enter image description here enter image description here

Ce sont mes deux séries chronologiques. Les deux sont identiques mais l'un est en retard sur l'autre. Les flèches suggèrent un angle de phase de 45 degrés - apparemment vers le bas ou vers le haut signifie 90 degrés (dans ou hors phase) donc mon interprétation est que je regarde un décalage de 45 degrés.

Comment puis-je convertir maintenant à un décalage dans le temps à savoir comment je calculer le décalage entre ces signaux?

J'ai lu en ligne que cela ne peut être fait pour une longueur d'onde spécifique (que je suppose que des moyens pour une certaine période?). Donc, étant donné que nous sommes intéressés par une période de 365 jours, et que le pas de temps entre les signaux est d'un jour, comment pourrait-on calculer le décalage temporel?

Répondre

0

Je crois que vous vous demandez comment vous pouvez déterminer ce que le temps de latence est donné deux séries chronologiques (dans ce cas, vous artificiellement ajouté dans un délai de 49 jours). Je n'ai pas connaissance de paquets qui en font un processus en une seule étape, mais puisque nous traitons essentiellement des ondes sinus, une option serait de «mettre à zéro» les ondes et ensuite de trouver les points de passage par zéro. Vous pouvez ensuite calculer la distance moyenne entre zéro points de passage des vagues 1 et 2. Si vous connaissez le pas de temps entre les mesures, vous pouvez calculer facilement le temps de latence (dans ce cas, le temps entre les étapes de mesure est un jour).

Voici le code que je l'habitude d'accomplir ceci:

#smooth the data to get rid of the noise that would introduce excess zero crossings) 
#subtracted 70 from the temp to introduce a "zero" approximately in the middle of the wave 
spline1 <- smooth.spline(data_1$Date, y = (data_1$temp - 70), df = 30) 
plot(spline1) 
#add the smoothed y back into the original data just in case you need it 
data_1$temp_smoothed <- spline1$y 

#do the same for wave 2 
spline2 <- smooth.spline(data_2$Date, y = (data_2$temp - 70), df = 30) 
plot(spline2) 
data_2$temp_smoothed <- spline2$y 

#function for finding zero crossing points, borrowed from the msProcess package 
zeroCross <- function(x, slope="positive") 
{ 
    checkVectorType(x,"numeric") 
    checkScalarType(slope,"character") 
    slope <- match.arg(slope,c("positive","negative")) 
    slope <- match.arg(lowerCase(slope), c("positive","negative")) 

    ipost <- ifelse1(slope == "negative", sort(which(c(x, 0) < 0 & c(0, x) > 0)), 
    sort(which(c(x, 0) > 0 & c(0, x) < 0))) 
    offset <- apply(matrix(abs(x[c(ipost-1, ipost)]), nrow=2, byrow=TRUE), MARGIN=2, order)[1,] - 2 
    ipost + offset 
} 

#find zero crossing points for the two waves 
zcross1 <- zeroCross(data_1$temp_smoothed, slope = 'positive') 
length(zcross1) 
[1] 10 

zcross2 <- zeroCross(data_2$temp_smoothed, slope = 'positive') 
length(zcross2) 
[1] 11 

#join the two vectors as a data.frame (using only the first 10 crossing points for wave2 to avoid any issues of mismatched lengths) 
zcrossings <- as.data.frame(cbind(zcross1, zcross2[1:10])) 

#calculate the mean of the crossing point differences 
mean(zcrossings$zcross1 - zcrossings$V2) 
[1] 49 

Je suis sûr qu'il existe des moyens plus éloquents d'aller à ce sujet, mais il vous faut obtenir les informations dont vous avez besoin.