2015-08-04 4 views
1

Я пытаюсь понять функцию кросс-вейвлета в R, но не могу понять, как преобразовать стрелки задержки фазы в временную задержку с пакетом бивалеи. Например:вычислить отставание от фазовых стрелок с бивеоветом в 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

Это мои два временных рядов. Оба идентичны, но один отстает от другого. Стрелки предполагают угол фазы 45 градусов - по-видимому, указав вниз или вверх на 90 градусов (в фазе или вне фазы), поэтому моя интерпретация заключается в том, что я смотрю на отставание в 45 градусов.

Как бы я теперь преобразовал это во временную задержку, то есть как бы вычислить временную задержку между этими сигналами?

Я читал в Интернете, что это можно сделать только для определенной длины волны (что я предполагаю для определенного периода?). Итак, учитывая, что нас интересует период 365, и временной интервал между сигналами составляет один день, как можно было бы выкупить временную задержку?

ответ

0

Так что я считаю, что вы спрашиваете, как вы можете определить, какое время запаздывания дается за два временных ряда (в этом случае вы искусственно добавили в отставание 49 дней).

Я не осведомлен о каких-либо пакетах, которые делают это одноэтапным процессом, но поскольку мы имеем дело с греческими волнами, одним из вариантов было бы «обнулить» волны, а затем найти нулевые точки пересечения. Затем вы можете рассчитать среднее расстояние между нулевыми точками пересечения волны 1 и волной 2. Если вы знаете временной интервал между измерениями, вы можете легко вычислить время запаздывания (в этом случае время между шагами измерения составляет один день).

Вот код, который я использовал для достижения этой цели:

#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 

Я уверен, что есть более красноречивые способы идти об этом, но вы должны получить информацию о том, что вам нужно.