изчисляване на изоставането от фазовите стрелки с двувълнова вълна в r

Опитвам се да разбера кръстосаната вълнова функция в R, но не мога да разбера как да преобразувам стрелките за фазово забавяне във времево забавяне с пакета biwavelet. Например:

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)

въведете описание на изображението тук въведете описание на изображението тук

Това са моите две времеви серии. И двете са идентични, но едната изостава от другата. Стрелките предполагат фазов ъгъл от 45 градуса - очевидно сочещи надолу или нагоре означават 90 градуса (във или извън фаза), така че моето тълкуване е, че гледам изоставане от 45 градуса.

Как бих преобразувал това в забавяне във времето, т.е. как бих изчислил забавянето във времето между тези сигнали?

Прочетох онлайн, че това може да се направи само за определена дължина на вълната (което предполагам означава за определен период?). И така, като се има предвид, че се интересуваме от период от 365 и времевата стъпка между сигналите е един ден, как ще се изчисли забавянето във времето?


person Emma Tebbs    schedule 04.08.2015    source източник


Отговори (2)


Така че вярвам, че питате как можете да определите какво е времето на изоставане при два времеви реда (в този случай сте добавили изкуствено изоставане от 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

Сигурен съм, че има по-красноречиви начини да се справите с това, но това трябва да ви осигури информацията, от която се нуждаете.

person scribbles    schedule 05.08.2015

В моя случай, за приливната вълна в полуденонощието, 90 градуса е равно на 3 часа (90*12,5 часа/360 = 3,125 часа). 12,5 часа е периодът на полуденонощие. И така, за 45 градуса, равно на -> 45*12,5/360 = 1,56 часа.

Така във вашия случай: 90 градуса -> 90*365/360 = 91,25 часа. 45 градуса -> 45*365/360= 45,625 часа.

person meddy    schedule 07.12.2018