我有一个像这样的数据文件:
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)
但这看上去与我所需要做的霍尔温特斯模型不太接近。我查看了所有的堆栈溢出和TS和Zoo的文档,我一直在研究如何创建这个TS对象。朝正确的方向推进将是非常感激的。
发布于 2020-05-27 02:44:57
ts对象通常用于每月、季度或年度数据,而不是每日数据;但是,如果删除2月29日,则可以创建一个ts对象,其时间为年份,加上一个分数0/365、1/365、.、364/365,如果没有缺少日期,这些对象将定期间隔。关键是,如果季节性是以一年为基础的,那么我们必须在每年有相同的点数才能将其表示为ts对象。
首先转换为具有普通日期的动物园对象z0,删除2月29日给z,在动物园对象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日在闰年,提供稍微简单的代码,这避免了需要使用leap_year,因为我们可以简单地删除任何一天,其中一天是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变成了一个可复制的形式,如下所示(但是,我们需要用更多的数据来填充它,以避免生成一个带有许多NAs的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"
))
https://stackoverflow.com/questions/62035588
复制相似问题