18

我正在对一个杂乱无章的文件进行每小时降水分析。但是,我设法清理它并将其存储在数据帧(称为 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

4 回答 4

12

该错误是数据形状的结果。试试> dim(rainCA1);我怀疑它会给出类似的东西> [1] 135264 1。替换rainCA1 <- ts(dat1 ...rainCA1 <- ts(dat1[[1]] ...,它应该可以工作。

我想知道它是否正确...在我看来,您的首要任务是获取格式一致的数据。确保ts()获得正确的输入。查看ts.

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

于 2012-06-18T16:13:24.580 回答
4

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

stl() 分解不接受单变量 ts 对象?

于 2015-07-30T10:42:50.370 回答
4

如果您申请dim()co2 或 AirPassengers,它将返回 NULL。所以建议你申请 dim(rainCA1)<-NULL

它对我有用很多次。

于 2020-10-30T17:11:07.613 回答
1

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

于 2017-06-13T19:00:21.033 回答