合并和调整 R 中的两个重叠时间序列
Merge and adjust two overlapping time series in R
我有两个动物园时间序列,一个区域的参数相同,但来自不同的平台。这两个时间序列的数据略有变化,即使它们各自的趋势是正确的并且日期重叠。我想将两个时间序列合并为一个连续序列,同时使用重叠日期的数据调整两个序列中的错误。请问我该怎么做?
我在下面添加了一些示例数据。
library(ggplot2)
library(gtable)
library(grid)
library(zoo)
library(reshape)
library(reshape2)
##Create zoo objects
x<-as.zoo(as.matrix(cbind(a=1:8,b=2:9)))
y<-as.zoo(as.matrix(cbind(a=2:9,b=3:10)))
##Create dates
CCnb1<-seq(from=as.Date("2004-01-01"),to=as.Date("2004-08-01"),by="1 months")
CCnb2<-seq(from=as.Date("2004-06-01"),to=as.Date("2005-01-01"),by="1 months")
##Index appropriately
index(x)<-CCnb1
index(y)<-CCnb2
####Create dataframes
x1<-as.data.frame(x)
y1<-as.data.frame(y)
##Add date columns
x1$Date=CCnb1
y1$Date=CCnb2
##Melt data frames
x2<-melt(x1, id.vars="Date")
y2<-melt(y1, id.vars="Date")
我已经包含了一个使用 ggplot2 的伪图,显示了线条的外观。我的实际时间序列要长得多,值的变化也没有这个例子那么糟糕。
#Plot
NT<-ggplot(x2, aes(x=Date, y=value,colour=variable, group=variable)) +
theme_bw()+ geom_line(size=0.5,colour="grey30")
NTb<-NT + geom_line(data=y2,aes(x=Date, y=value,group=variable))
NTb+facet_wrap(~variable)
差异不变:
> y$a - x$a
2004-06-01 2004-07-01 2004-08-01
-4 -4 -4
> y$b - x$b
2004-06-01 2004-07-01 2004-08-01
-4 -4 -4
所以假设 x$a
将调整为 y$a
并且对于 x$b
和 y$b
:
va <- apply(merge(x$a + coredata(y$a - x$a)[1], y$a), 1, mean, na.rm = TRUE)
a <- zoo(va, as.Date(names(va)))
vb <- apply(merge(x$b + coredata(y$b - x$b)[1], y$b), 1, mean, na.rm = TRUE)
b <- zoo(vb, as.Date(names(vb)))
merge(a, b)
给予:
a b
2004-01-01 -3 -2
2004-02-01 -2 -1
2004-03-01 -1 0
2004-04-01 0 1
2004-05-01 1 2
2004-06-01 2 3
2004-07-01 3 4
2004-08-01 4 5
2004-09-01 5 6
2004-10-01 6 7
2004-11-01 7 8
2004-12-01 8 9
2005-01-01 9 10
我有两个动物园时间序列,一个区域的参数相同,但来自不同的平台。这两个时间序列的数据略有变化,即使它们各自的趋势是正确的并且日期重叠。我想将两个时间序列合并为一个连续序列,同时使用重叠日期的数据调整两个序列中的错误。请问我该怎么做? 我在下面添加了一些示例数据。
library(ggplot2)
library(gtable)
library(grid)
library(zoo)
library(reshape)
library(reshape2)
##Create zoo objects
x<-as.zoo(as.matrix(cbind(a=1:8,b=2:9)))
y<-as.zoo(as.matrix(cbind(a=2:9,b=3:10)))
##Create dates
CCnb1<-seq(from=as.Date("2004-01-01"),to=as.Date("2004-08-01"),by="1 months")
CCnb2<-seq(from=as.Date("2004-06-01"),to=as.Date("2005-01-01"),by="1 months")
##Index appropriately
index(x)<-CCnb1
index(y)<-CCnb2
####Create dataframes
x1<-as.data.frame(x)
y1<-as.data.frame(y)
##Add date columns
x1$Date=CCnb1
y1$Date=CCnb2
##Melt data frames
x2<-melt(x1, id.vars="Date")
y2<-melt(y1, id.vars="Date")
我已经包含了一个使用 ggplot2 的伪图,显示了线条的外观。我的实际时间序列要长得多,值的变化也没有这个例子那么糟糕。
#Plot
NT<-ggplot(x2, aes(x=Date, y=value,colour=variable, group=variable)) +
theme_bw()+ geom_line(size=0.5,colour="grey30")
NTb<-NT + geom_line(data=y2,aes(x=Date, y=value,group=variable))
NTb+facet_wrap(~variable)
差异不变:
> y$a - x$a
2004-06-01 2004-07-01 2004-08-01
-4 -4 -4
> y$b - x$b
2004-06-01 2004-07-01 2004-08-01
-4 -4 -4
所以假设 x$a
将调整为 y$a
并且对于 x$b
和 y$b
:
va <- apply(merge(x$a + coredata(y$a - x$a)[1], y$a), 1, mean, na.rm = TRUE)
a <- zoo(va, as.Date(names(va)))
vb <- apply(merge(x$b + coredata(y$b - x$b)[1], y$b), 1, mean, na.rm = TRUE)
b <- zoo(vb, as.Date(names(vb)))
merge(a, b)
给予:
a b
2004-01-01 -3 -2
2004-02-01 -2 -1
2004-03-01 -1 0
2004-04-01 0 1
2004-05-01 1 2
2004-06-01 2 3
2004-07-01 3 4
2004-08-01 4 5
2004-09-01 5 6
2004-10-01 6 7
2004-11-01 7 8
2004-12-01 8 9
2005-01-01 9 10