【问题标题】:Converting data collected at irregular times into a time series in R将在不规则时间收集的数据转换为 R 中的时间序列
【发布时间】:2019-08-31 05:06:33
【问题描述】:

我在春季和夏季(月份:5、6、7、8)收集了多变量数据,不一定每天,而且超过 30 年。如何将其转为时间序列对象进行时间序列分析?

我尝试过: 时间序列

但我不知道应该有什么频率,因为它每年收集 4 次,但不是“季刊”。

这是数据的样子:

    Year  Month Day   ID     Size      Sex      Temperature
    1 2017     5  13  033     54.0       M        13.0
    2 2017     5  15  044     53.5       F        11.0
    3 2017     5  16  141     55.8       M        15.7

我想也许我必须在缺少收集数据的月份和日期的数据中添加 NA。我也不知道如何每年除以日和月...

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    1) 使用末尾注释中显示的数据(与问题略有不同)从温度创建一个动物园系列,其时间为年 + (month-5)/4 减少多个值在一个月内使用mean,然后将其全部转换为ts

    library(zoo)
    toYearMon <- function(x) x[[1]] + (x[[2]] - 5)/4
    z <- read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3, 
      FUN = toYearMon, aggregate = mean)
    as.ts(z)
    ##      Qtr1 Qtr2
    ## 2017 12.0 15.7
    

    ts 会认为 4 个月是季度,但希望你能忍受。交替使用z

    2) 另一种可能性是,由于从 5 月 1 日到 8 月 31 日有 123 天,因此创建一个时间变量,即年 + 0 表示 May1st,年 + 1/123 表示 May2nd,.. ., 年 + 122/123 为 8 月 31 日。

    toDate <- function(x) as.Date(paste(x[[1]], x[[2]], x[[3]], sep = "-"))
    
    sinceMay1 <- function(x) {
      d <- toDate(x)
      may1 <- toDate(data.frame(x[[1]], 5, 1))
      x[[1]] + as.numeric(d - may1) / 123
    }
    
    zsm <- read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3,
      FUN = sinceMay1)
    frequency(zsm) <- 123
    

    现在我们可以使用zsmas.ts(zsm)

    3) 如果它足以使用 1, 2, 3, ... 时代的另一种可能性是

    ts(DF$Temperature)
    

    4) 我们可以像这样创建一个动物园系列,其中 toDate 来自上方:

    read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3,
      FUN = toDate)
    

    注意

    我们将上个月更改为 6。

    Lines <- "Year  Month Day   ID     Size      Sex      Temperature
        1 2017     5  13  033     54.0       M        13.0
        2 2017     5  15  044     53.5       F        11.0
        3 2017     6  16  141     55.8       M        15.7"
    DF <- read.table(text = Lines)
    

    【讨论】:

    • 谢谢,这很有用,但是您知道有什么方法可以不必将每日数据强制转换为“季度”吗?如果我只是平均每月的每日数据,恐怕我可能会失去趋势......
    • 我增加了更多的可能性。如果这些都不是您想要的,那么您将需要更详细地说明您想要什么。请注意,ts 系列通常不用于日常数据。
    • 你也能转换成“每周”吗?
    • 将 toYearMon 替换为转换为星期的。
    猜你喜欢
    • 2011-04-23
    • 2020-09-21
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2011-11-17
    • 2017-09-24
    • 1970-01-01
    • 2017-03-06
    相关资源
    最近更新 更多