【问题标题】:Converting a data frame into TS object in R将数据帧转换为 R 中的 TS 对象
【发布时间】:2020-05-27 04:40:31
【问题描述】:

我有一个如下所示的数据框:

  DAY     X1996 X1997 
1 1-Jul    98    86   
2 2-Jul    97    90   
3 3-Jul    97    93   
....

我想最终得到一个 TS 对象,这样我就可以对其进行 HoltWinters 平滑处理。 我认为我希望它看起来像这样(虽然我不确定,因为我以前没有做过 HoltWinters):

Day    Year   Temp
1-Jul  1996   98
2-Jul  1996   98
3-Jul  1996   98
...
1-Jul  1997   86
2-Jul  1997   90
3-Jul  1997   93

这就是我想要做的:

df <- read.delim("temps.txt")
myts <- as.ts(df)

但这看起来不像我需要做一个 Holtwinters 模型。我已经查看了 stackoverflow 以及 TS 和 Zoo 的文档,但我一直坚持如何创建这个 TS 对象。我们将不胜感激朝着正确的方向前进。

【问题讨论】:

  • tidyr::pivot_longer(df, cols = -DAY) 应该为您提供所显示的格式。 stackoverflow.com/questions/2185252/…
  • @RonakShah 非常接近。它首先按天分组,所以我的前几行是 1996 年 7 月 1 日、1997 年 7 月 1 日、1998 年 7 月 1 日等。但这是朝着正确方向的一个很好的推动。我将在 pivot_longer 上查找文档,看看是否能弄清楚。
  • 嗯,您可以通过arrange Year 获取按年份排序的数据。 tidyr::pivot_longer(df, cols = -DAY) %&gt;% arrange(Year).

标签: r holtwinters


【解决方案1】:

ts 对象通常与月度、季度或年度数据一起使用,而不是每日数据;但是,如果我们删除 2 月 29 日,那么我们可以创建一个 ts 对象,其时间是年份加上一个分数 0/365、1/365、...、364/365,如果没有丢失日期,它将有规律地间隔。关键是,如果季节性是基于一年的,那么我们每年必须有相同数量的点才能将其表示为 ts 对象。

首先转换为具有普通日期的动物园对象 z0,删除提供 z 的 Feb 29th,在动物园对象 zz 中创建上述时间索引,然后将其转换为 ts。

library(data.table)
library(lubridate)
library(zoo)

m <- melt(as.data.table(df), id.vars = 1)
z0 <- with(m, zoo(value, as.Date(paste(variable, DAY), "X%Y %d-%b")))
z <- z0[! (month(time(z)) == 2 & day(time(z)) == 29)]  

tt <- time(z)
zz <- zoo(coredata(z), year(tt) + (yday(tt) - ((month(tt) > 2) & leap_year(tt)) - 1)/365)
as.ts(zz)

删除闰年的 12 月 31 日

上面我们删除了闰年的 2 月 29 日,但另一种方法是删除闰年的 12 月 31 日,提供稍微简单的代码,避免使用闰年,因为我们可以简单地删除 yday 为 366 的任何一天。z0 是从上面。

zz0 <- z0[yday(time(z0)) <= 365]
tt <- time(zz0)
zz <- zoo(coredata(zz0), year(tt) + (yday(tt) - 1) / 365)
as.ts(zz)

每月汇总

另一种方法是将数据缩减为月度数据。然后它相对简单,因为 ts 具有表示月度数据的工具。下面我们使用了每个月的最后一个点,但如果需要,我们可以使用平均值或其他标量摘要。

ag <- aggregate(z0, as.yearmon, tail, 1)  # use last point in each month
as.ts(ag)

注意

问题中的 df 制成可重现的形式如下(但是,我们需要用更多数据填写它以避免生成具有许多 NA 的 ts 对象)。

df <- structure(list(DAY = structure(1:3, .Label = c("1-Jul", "2-Jul", 
"3-Jul"), class = "factor"), X1996 = c(98L, 97L, 97L), X1997 = c(86L, 
90L, 93L)), class = "data.frame", row.names = c("1", "2", "3"
))

【讨论】:

    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2019-04-19
    • 2022-01-15
    • 1970-01-01
    • 2014-10-10
    • 2019-01-26
    相关资源
    最近更新 更多