我正在尝试理解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期的兴趣,以及信号之间的时间步长为一天,如何计算时滞?
答案 0 :(得分:0)
所以我相信你会问你如何确定给出两个时间序列的延迟时间(在这种情况下,你是在49天的滞后期间人为添加的)。
我不知道有任何软件包使这个过程分为一步,但由于我们基本上处理的是sin波,一种选择是将波“归零”,然后找到过零点。然后,您可以计算波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
我确信有更多有说服力的方法,但它应该为您提供所需的信息。
答案 1 :(得分:0)
在我的情况下,对于半日的潮汐,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小时。