为R中每天采样的数据创建时间序列

igsr9ssn  于 2023-03-10  发布在  其他
关注(0)|答案(3)|浏览(133)

我不明白时间序列对象是如何在R中创建的。我有数据:data = c(101,99,97,95,93,91,89,87,85,83,81)(为简洁起见,数据集较小),该数据从2016-07-052016-07-15,连续11天每天采集一次,根据docs,每天采集数据的频率应为7,但我不了解startend参数的值,对于start,文档中说:the time of the first observation. Either a single number or a vector of two integers, which specify a natural time unit and a (1-based) number of samples into the time unit.我不明白1-based number of samples是什么意思。我试着谷歌它,但它没有帮助。
如果只使用2016,7作为开始日期和结束日期,则会得到:

Time Series:
Start = c(2016, 7) 
End = c(2016, 7) 
Frequency = 7 
[1] 101

如果使用2016,7,12016,7,11作为开始日期和结束日期,仍然会得到相同的输出。
我哪里做错了?

2uluyalo

2uluyalo1#

我认为最好的方法是切换到xts或zoo,因为根据另一个问题here,ts()很难进行每日观察,因为年与年之间的天数不同。

6qfn3psc

6qfn3psc2#

据我理解,ts()函数中的单位是年,所以这里frequency应该设置为365因此,startend也应该表示天。(我相信)要把握好时机,startend应该是所需间隔与年初的天数差(在您的具体情况下,分别为186和196)。这些数字的适当性可通过以下方式检查:

as.numeric(as.Date("2016-07-05") - as.Date("2016-01-01"))
[1] 186
as.numeric(as.Date("2016-07-15") - as.Date("2016-01-01"))
[1] 196

将这些信息嵌入到代码中,对ts()的调用应为:

data = c(101,99,97,95,93,91,89,87,85,83,81)
ts(data, start = c(2016, 186), end = c(2016, 196), frequency = 365)
# which yielded
Time Series:
Start = c(2016, 186) 
End = c(2016, 196) 
Frequency = 365 
 [1] 101  99  97  95  93  91  89  87  85  83  81

高温加热

but5z9lq

but5z9lq3#

ts对象中的Frequency参数确定系列在单元中具有多少个样本。因此,当您选择频率时,它假定一个单元。此单元将用于设置startend参数。
例如,如果你设置frequency = 365,你假设单位是年,并且在单位之间有365个采样点,让我们在2016-07-05这个单位中确定你的序列的第一个点,年显然是2016年,在这一年内我取as.Date("2016-07-05") - as.Date("2016-01-01") + 1,即187。注意,我假设第一个采样日的索引为1,而不是@Helloworld的解中使用的0。因此,start = c(2016, 187)

data <- c(101,99,97,95,93,91,89,87,85,83,81) 
start_dt <- "2016-07-05" 
end_dt <- "2016-07-15"

ts_365 <- ts(data, start = c(216, 187), frequency = 365)
ts_365
#> Time Series:
#> Start = c(216, 187) 
#> End = c(216, 197) 
#> Frequency = 365 
#>  [1] 101  99  97  95  93  91  89  87  85  83  81

另一方面,如果我们想使用frequency = 7,我们需要使用week作为单位,并使用它来指定start。实际上,我们可以获得week(isoweek,但其他条件也可以)和一周中的哪一天,假设星期一是第一天(同样,您可以更改此条件)

strftime(start_dt, "isoweek: %V weekday: %u (%A)")
#> [1] "isoweek: 27 weekday: 2 (martes)"

对于frequency = 7,我们将时间序列定义为

ts_7 <- ts(data, start = c(27, 2), frequency = 7)
ts_7
#> Time Series:
#> Start = c(27, 2) 
#> End = c(28, 5) 
#> Frequency = 7 
#>  [1] 101  99  97  95  93  91  89  87  85  83  81

如果您绘制上面的任何ts对象,您将得到一个基于所选单位的数值轴。

x_dates <- seq.Date(from = as.Date(start_dt), to = as.Date(end_dt), by = "day")
plot(x_dates, data)

创建于2023年3月5日,使用reprex v2.0.2
当您将某些函数应用于ts对象时,您选择的频率是相关的,因为频率可以作为查找季节性的周期(例如,decompose()函数)

相关问题