【问题标题】:Is it possible to have frequency as number of observation per minutes in ts function?是否可以在 ts 函数中将频率作为每分钟的观察次数?
【发布时间】:2016-11-28 16:30:39
【问题描述】:

我正在尝试预测通过密封件的泄漏率。原始数据由每秒记录 60 分钟的数据测量值组成:

我有 3600 个数据点(60 秒 * 60 分钟 = 3600)。我正在尝试使用 R 中的ts 将我的数据转换为时间序列。我编写了以下代码,我将频率设置为 60,因为我们每秒收集 60 个数据点。频率是每个周期的观察次数,在我的情况下,周期是分钟(我假设,不确定这是否正确)

NEW <- ts(Set2.1, start= 0, end= 60, frequency=60)

这是正确的做法吗?因为我得到了 3601 个数据点,而不是 3600 个数据点。不知道为什么我得到 3601 个数据点而不是 3600 个。如果我没有在我的代码中提到频率,它给了我正好 3600 个数据点。

NEW <- ts(Set2.1)

当我使用分解进行分解时,我收到以下错误:时间序列没有或少于 2 个周期。数据是否可能没有季节性?我的原始数据是非常线性的,呈上升趋势,我不确定它是否有任何季节性。

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    ts() 使用两个时间单位。两者中较长的一个包含多个较短的样本,由ts()frequency 参数给出。

    在您的情况下,较长的时间单位是分钟,其中包含较短时间单位的 60 个样本,即秒。时间序列中的任何时刻都可以用两个数字标记,表示两个单位。同样,在您的情况下,10 分 35 秒的测量值将被标记为 c(10, 35)

    当你在ts() 中指明开始和结束时,你也可以给他们两个数字。您的第一次测量是在 0 分 1 秒,即c(0, 1),最后一次是在 60 分 0 秒,即c(60, 0)。因此,这给出了预期的结果(我为示例创建了一些虚拟值):

    data <- rnorm(3600)
    ts_data <- ts(data, start = c(0, 1), end = c(60, 0), frequency = 60)
    length(ts_data)
    ## [1] 3600
    

    为了解释你的方法的问题,我需要介绍另外两个函数:start()end() 分别返回第一个和最后一个测量的两个值标签。所以,对于上面的例子:

    start(ts_data)
    ## [1] 0 1
    end(ts_data)
    ## [1] 59 60
    

    在这里,您已经可以看到一些细节:ts() 实际上确实从 1 开始对样本进行编号,因此 60 分 0 秒被理解为 59 分 60 秒。

    现在看你的例子:

    ts_data2 <- ts(data, start = 0, end = 60, frequency = 60)
    start(ts_data2)
    ## [1] 0 1
    end(ts_data2)
    ## [1] 60  1
    

    如您所见,如果您只将一个整数传递给startend,这将被解释为属于较短单元中的第一个样本。因此,您实际上创建了一个从 0 分 1 秒到 60 分 1 秒的时间序列,这比您想要的多一秒。因此ts_data2 的长度为3601

    要结束的一点评论:我主要谈论的是每分钟秒数,因为这适合您的示例。但重要的是要注意ts() 只是在使用越来越短的时间单位,而不知道它们实际上是什么。所以,c(4, 6) 不仅可以指 4 分 6 秒,还可以指第 4 年的第 6 个月,或第 4 周的第 6 天。

    【讨论】:

    • 非常感谢!它帮助我理解了 ts 工作原理背后的理论。我的代码是固定的,我不再有这个问题。感谢您节省了我的时间。
    猜你喜欢
    • 2021-07-12
    • 2019-09-06
    • 1970-01-01
    • 2015-11-27
    • 2019-02-25
    • 2023-03-13
    • 2020-08-27
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多