R中的时间序列和stl:仅允许单变量序列出错

时间:2012-05-08 03:27:02

标签: r time-series decomposition

我正在对一个混乱的文件进行每小时降水分析。但是,我设法清理它并将其存储在一个数据框(称为CA1)中,其格式如下:

  Station_ID Guage_Type   Lat   Long       Date Time_Zone Time_Frame H0 H1 H2 H3 H4 H5        H6        H7        H8        H9       H10       H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23
1    4457700         HI 41.52 124.03 1948-07-01         8        LST  0  0  0  0  0  0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000   0   0   0   0  0  0   0   0   0   0   0   0
2    4457700         HI 41.52 124.03 1948-07-05         8        LST  0  1  1  1  1  1  2.0000000 2.0000000 2.0000000 4.0000000 5.0000000 5.0000000   4   7   1   1   0 0  10  13   5   1   1   3
3    4457700         HI 41.52 124.03 1948-07-06         8        LST  1  1  1  0  1  1 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000   0   0   0   0   0  0   0   0   0   0   0   0
4    4457700         HI 41.52 124.03 1948-07-27         8        LST  3  0  0  0  0  0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000   0   0   0   0   0 0   0   0   0   0   0   0
5    4457700         HI 41.52 124.03 1948-08-01         8        LST  0  0  0  0  0  0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000   0   0   0   0   0 0   0   0   0   0   0   0
6    4457700         HI 41.52 124.03 1948-08-17         8        LST  0  0  0  0  0  0 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889   6   1   0   0   0 0   0   0   0   0   0   0

其中H0到H23表示每天24小时(行)

仅使用CA1(上面的数据帧),我每天(行)得到24个点并垂直移调它并将剩余的天数(行)连接到一个变量,我称之为dat1:

 > dat1[1:48,]
  H0  H1  H2  H3  H4  H5  H6  H7  H8  H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23  H0  H1  H2  H3  H4  H5  H6  H7  H8  H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   1   1   2   2   2   4   5   5   4   7   1   1   0  0  10  13   5   1   1   3 

使用变量dat1,我将其作为参数输入以获取时间序列数据:

> rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon), 
    frequency = 24)

有几点需要注意:

>dim(CA1)
  [1] 5636   31
>length(dat1)
  [1] 135264

因此5636 * 24(每行总数据点[24])= 135264个总点数。 长度(rainCA1)与上述几点一致。但是,如果我在ts函数中结束,例如

>rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon), 
    end = c(1900+as.POSIXlt(CA1[5636,5])$year, 1+as.POSIXlt(CA1[5636,5])$mon),
    frequency = 24)

我总得分为1134分,我缺少很多数据。我假设这是因为日期不是连续的,因为我只将月份和年份作为起点的参数。

继续,在我认为正确的路径中,使用没有end参数的第一个ts计算,我将其作为stl的输入提供:

>rainCA1_2 <-stl(rainCA1, "periodic")

不幸的是,我收到了一个错误:

Error in stl(rainCA1, "periodic") : only univariate series are allowed

我不明白或如何去做。但是,如果我返回ts函数并提供end参数,stl工作正常,没有任何错误。

我在很多论坛上进行了研究,但没有人(或者我的理解)提供了一个很好的解决方案来获取每小时数据的数据属性。如果有人能帮助我,我将非常感激。谢谢!

4 个答案:

答案 0 :(得分:8)

该错误是数据形状的结果。试试> dim(rainCA1);我怀疑它会提供类似> [1] 135264 1的东西。 将rainCA1 <- ts(dat1 ...替换为rainCA1 <- ts(dat1[[1]] ...,它应该有效。

是否正确,我想... 在我看来,您的第一个业务是获得一致格式的数据。确保ts()获得正确的输入。查看ts的准确说明。

ts()不解释日期时间格式。 ts()需要具有固定间隔的连续数据点。它使用一个主要计数器和一个小计数器(其中frequency适合一个主要计数器)。例如,如果您的数据是每小时一次,并且您希望每日级别的季节性,frequency等于24 startend,则主要是装饰性的:start仅表示t(0)表示主计数器,而end表示t(结束)。

答案 1 :(得分:3)

我尝试用一​​个非常简单的例子解释写方式,以避免在另一个问题中出现这类错误,链接在这里:

stl() decomposition won't accept univariate ts object?

答案 2 :(得分:1)

如果在二氧化碳或AirPassengers中应用dim(),它将返回NULL。 因此,我建议您申请 dim(rainCA1)<-NULL

它为我工作了很多次。

答案 3 :(得分:0)

我找到的一个解决方案是time_series_var <- ts(data[, c("var_of_interest")])然后是time_series_var <- ts(as.vector(time_series_var)),然后与单变量相关的错误会消失,因为维度现在是正确的。