【问题标题】:Daily time series with ts.. how to specify start and end [closed]带有ts的每日时间序列..如何指定开始和结束[关闭]
【发布时间】:2014-06-29 13:03:31
【问题描述】:

我有一个从周六开始到周三结束的每日时间序列。有一个明确的每周周期。它存储在 R 中的向量 a 中。所以,我尝试将其转换为时间序列对象 -

ts(a,frequency=7)

这给了我 -

Time Series:
Start = c(1, 1) 
End = c(13, 5) 

(1,1) 和 (13,5) 是什么意思?在这种情况下,指定开始和结束的最佳方式是什么。互联网上的所有示例都是针对年度数据,而不是每天。

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    让我们使用文档 (?ts) 探索 ts 如何在不同频率下工作

    假设这是您的数据

    dat <- data.frame(myts = sample(10, 24, replace = T),
                      Date = seq(as.Date("2008-10-11"), as.Date("2008-10-11") + 23, by = 1))
    
    # myts       Date
    # 1     6 2008-10-11
    # 2     9 2008-10-12
    # 3     6 2008-10-13
    # 4     9 2008-10-14
    # 5     8 2008-10-15
    # 6     6 2008-10-16
    # 7     1 2008-10-17
    # 8     9 2008-10-18
    # 9     3 2008-10-19
    # 10    5 2008-10-20
    # 11    7 2008-10-21
    # 12    4 2008-10-22
    # 13    2 2008-10-23
    # 14    9 2008-10-24
    # 15    5 2008-10-25
    # 16    9 2008-10-26
    # 17    7 2008-10-27
    # 18    8 2008-10-28
    # 19    7 2008-10-29
    # 20    2 2008-10-30
    # 21    6 2008-10-31
    # 22    6 2008-11-01
    # 23    8 2008-11-02
    # 24    1 2008-11-03
    

    让我们比较相同数据和任意起点上不同频率的输出

    print(ts(dat$myts, frequency = 7, start = c(1950, 3)), calendar = T)
    #      p1 p2 p3 p4 p5 p6 p7
    # 1950        6  9  6  9  8
    # 1951  6  1  9  3  5  7  4
    # 1952  2  9  5  9  7  8  7
    # 1953  2  6  6  8  1      
    print(ts(dat$myts, frequency = 12, start = c(1950, 3)), calendar = T)
    #      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    # 1950           6   9   6   9   8   6   1   9   3   5
    # 1951   7   4   2   9   5   9   7   8   7   2   6   6
    # 1952   8   1                                        
    print(ts(dat$myts, frequency = 4, start = c(1950, 3)), calendar = T)
    #      Qtr1 Qtr2 Qtr3 Qtr4
    # 1950              6    9
    # 1951    6    9    8    6
    # 1952    1    9    3    5
    # 1953    7    4    2    9
    # 1954    5    9    7    8
    # 1955    7    2    6    6
    # 1956    8    1          
    print(ts(dat$myts, frequency = 7), calendar = T)
    #   p1 p2 p3 p4 p5 p6 p7
    # 1  6  9  6  9  8  6  1
    # 2  9  3  5  7  4  2  9
    # 3  5  9  7  8  7  2  6
    # 4  6  8  1    
    

    我们可以从输出中学到 3 件事

    1- ts 熟悉 12 和 4 频率并将它们识别为月份和季度,而它以不那么直接的方式打印 7 频率。

    2- start 参数中的第一个数字是取决于频率的周期数,而第二个数字是该周期内的第一个事件(因为并非所有系列都从一月或周日开始)。

    3- 当您未指定起点时,ts 函数假定您从第一个周期的开头开始(因此在您的示例中为 (1,1)

    现在,为了让这个时间序列对您更有意义,您可能会计算一年中的第几周(因为我们通常一年大约有 52 周)和第一次观察的天数(例如: 1 = 星期日,2 = 星期一等)并将它们解析为start 参数(请参阅?strftime

    startW <- as.numeric(strftime(head(dat$Date, 1), format = "%W"))
    startD <- as.numeric(strftime(head(dat$Date, 1) + 1, format =" %w")) 
    print(ts(dat$myts, frequency = 7, start = c(startW, startD)), calendar = T)
    #   p1 p2 p3 p4 p5 p6 p7
    #39                    6
    #40  9  6  9  8  6  1  9
    #41  3  5  7  4  2  9  5
    #42  9  7  8  7  2  6  6
    #43  8  1   
    

    这意味着我们的第一次观察(发生在 2008 年 10 月 11 日)是 2008 年第 39 周的星期六

    【讨论】:

    • 抱歉删除我的评论,因为公平地说,我正在为另一个案例尝试它并且没有工作。
    • @David Arenburg 我注意到startD 你使用了head(dat$Date, 1) + 1。这是因为%w 是英国格式(星期从星期一开始),而ts 函数使用美国格式(星期从星期日开始)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2015-07-26
    • 2011-11-27
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多