R 如何对列中的每个名称值进行时间序列分析,分解并导出到表中
我有一个数据框(DF),有几个列,但目标列是日期、索引和站点。 下面是一个子集表: 时间序列开始于2006年朱利安日1,结束于2015年jd 353,全年观测23次R 如何对列中的每个名称值进行时间序列分析,分解并导出到表中,r,dataframe,time-series,xts,decomposition,R,Dataframe,Time Series,Xts,Decomposition,我有一个数据框(DF),有几个列,但目标列是日期、索引和站点。 下面是一个子集表: 时间序列开始于2006年朱利安日1,结束于2015年jd 353,全年观测23次 INDEX_TS <- ts(DF$index, start = c(2006,1), end = c(2015,23), frequency = 23) 要提取表中的季节性、趋势和余数: STL12 <- stl(INDEX_TS, 12) DF_STL <- data.frame(STL12, INDEX_T
INDEX_TS <- ts(DF$index, start = c(2006,1), end = c(2015,23), frequency = 23)
要提取表中的季节性
、趋势
和余数
:
STL12 <- stl(INDEX_TS, 12)
DF_STL <- data.frame(STL12, INDEX_TS$time.series)
尝试以下方法。此
按站点
拆分数据帧,将索引
存储在每个站点
中,作为ts
,分解
并与原始子集组合。最后,do.call
rbind
s所有子集+解组到最终数据帧中:
可复制示例:
AirData = data.frame(AirPassengers, SITE = rep(c("A", "B", "C"), each = 48))
do.call(rbind, lapply(split(AirData, AirData$SITE), function(x) {
INDEX_TS <- ts(x$AirPassengers, frequency = 12)
STL12 <- stl(INDEX_TS, 12)$time.series
return(data.frame(x, STL12))
}))
AirPassengers SITE seasonal trend remainder
A.1 112 A -13.986104 123.5683 2.4177707
A.2 118 A -7.759212 124.1061 1.6531607
A.3 132 A 8.325181 124.6438 -0.9689496
A.4 129 A -1.887274 125.1815 5.7057890
A.5 121 A -5.517268 125.7871 0.7302135
A.6 135 A 12.098461 126.3926 -3.4910836
A.7 148 A 27.559203 126.9982 -6.5573953
A.8 148 A 28.502489 127.5898 -8.0922545
A.9 136 A 9.726413 128.1813 -1.9077517
A.10 119 A -12.472175 128.7729 2.6992637
A.11 104 A -31.553871 129.7343 5.8195429
A.12 118 A -13.061798 130.6957 0.3660530
A.13 115 A -13.978583 131.6572 -2.6785793
A.14 126 A -7.772715 133.1337 0.6389980
A.15 141 A 8.281701 134.6103 -1.8919729
A.16 135 A -2.206362 136.0868 1.1195345
A.17 125 A -5.580592 137.8077 -7.2271040
A.18 149 A 12.368207 139.5286 -2.8967712
A.19 170 A 27.747586 141.2494 1.0029824
A.20 170 A 28.926157 143.7331 -2.6593066
... ... ... ... ... ...
do.call(rbind, lapply(split(DF, DF$SITE), function(x) {
INDEX_TS <- ts(x$index, start = c(2006,1), end = c(2015,23), frequency = 23)
STL12 <- stl(INDEX_TS, 12)$time.series
return(data.frame(x, STL12))
}))
OP的示例:
AirData = data.frame(AirPassengers, SITE = rep(c("A", "B", "C"), each = 48))
do.call(rbind, lapply(split(AirData, AirData$SITE), function(x) {
INDEX_TS <- ts(x$AirPassengers, frequency = 12)
STL12 <- stl(INDEX_TS, 12)$time.series
return(data.frame(x, STL12))
}))
AirPassengers SITE seasonal trend remainder
A.1 112 A -13.986104 123.5683 2.4177707
A.2 118 A -7.759212 124.1061 1.6531607
A.3 132 A 8.325181 124.6438 -0.9689496
A.4 129 A -1.887274 125.1815 5.7057890
A.5 121 A -5.517268 125.7871 0.7302135
A.6 135 A 12.098461 126.3926 -3.4910836
A.7 148 A 27.559203 126.9982 -6.5573953
A.8 148 A 28.502489 127.5898 -8.0922545
A.9 136 A 9.726413 128.1813 -1.9077517
A.10 119 A -12.472175 128.7729 2.6992637
A.11 104 A -31.553871 129.7343 5.8195429
A.12 118 A -13.061798 130.6957 0.3660530
A.13 115 A -13.978583 131.6572 -2.6785793
A.14 126 A -7.772715 133.1337 0.6389980
A.15 141 A 8.281701 134.6103 -1.8919729
A.16 135 A -2.206362 136.0868 1.1195345
A.17 125 A -5.580592 137.8077 -7.2271040
A.18 149 A 12.368207 139.5286 -2.8967712
A.19 170 A 27.747586 141.2494 1.0029824
A.20 170 A 28.926157 143.7331 -2.6593066
... ... ... ... ... ...
do.call(rbind, lapply(split(DF, DF$SITE), function(x) {
INDEX_TS <- ts(x$index, start = c(2006,1), end = c(2015,23), frequency = 23)
STL12 <- stl(INDEX_TS, 12)$time.series
return(data.frame(x, STL12))
}))
do.call(rbind,lappy(split)(DF,DF$SITE),函数(x){
INDEX_TS@useR原谅我redaction@useR我想分别分解每个站点,因为每个站点都有不同的行为,所以每个站点在同一日期将有不同的分解值。ts中的错误(x$LAI,start=c(2006,1),end=c(2017,17),frequency=23):“ts”对象必须有一个或多个观察值
我认为它可能有用,但请发送给我error@OSCAR_P您确定每个站点
都有相同数量的观察结果吗?您运行的此代码与我的解决方案中的代码不同。另外,请通过复制和粘贴dput(DF)的输出提供一个可复制的示例
进入您的问题。我纠正了这一点。实际上,该示例运行得很好,但看起来,主要区别在于AirData表,其中AirPassenger是时间序列。现在,我在stl(索引,12)中获得了错误:外部函数调用(arg 1)中的NA/NaN/Inf从:stl(索引,12)