【问题标题】:Time series in grouped dataframe分组数据框中的时间序列
【发布时间】:2021-01-21 07:36:51
【问题描述】:

我目前正在处理分组/嵌套数据框中的多个时间序列,但我不知道如何继续。我希望这里有人可以帮助我解决这个问题。

我的数据集由 5 个分组变量 (Category) 组成,每个变量包含 10 个重复 (ID)。每个重复都包含以固定时间间隔进行的 60 次连续观察 (Time)。然后,每个观察结果都包含多个变量:AmountWalk_1Walk_2Walk_1+2。但是,我还有其他三个变量(Amount1Amount2Amount3),它们包含在按区域分割的 Number 变量中。

因此,以图形方式显示它:

A { (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) { 1(1, 2, 3, 4, ... , 60); 2(1, 2, 3, 4, ... , 60); ..等等。

B { (11, 12, 13, 14, 15, 16, 17, 18, 19, 20) { 11(1, 2, 3, 4, ... , 60); 12(1, 2, 3, 4, ... , 60); ..等等。

.

.

E { (41, 42, 43, 44, 45, 46, 47, 48, 49, 50) { 41(1, 2, 3, 4, ... , 60); 42(1, 2, 3, 4, ... , 60); ..等等。

我想知道的是变量walk_1walk_2walk_1+2

  • 在分组变量CategoryID 内部和之间有所不同
  • 显示 60 次观测的振荡/周期性趋势。

我尝试将数据集嵌套到 ID 类别中,然后使用 mutate + map 函数按组应用 acf 函数。这样,我获得了一系列 acf 值。但是,我不知道如何进行数据集的可视化和分析。

这个方法对我的目的有用吗,还是我应该使用不同的功能?

编辑:因为我被要求提供一个可重现的示例,所以这里有一些类似的数据结构和一个简化的假数据集。

dat1 = data.frame(
category = rep(x = 1:5, each=600),
ID = rep(rep(1:50,each=60)),
walk_1 = rnorm(n = 3000,mean = 10,sd = 4),
walk_2 = rnorm(n = 3000, mean = 5, sd = 5),
amount = sample.int(50, 3000, replace = TRUE))

dat1 <- dat1 %>%
  group_by(ID) %>% 
  mutate(walk_12 = walk_1 + walk_2) %>%
  nest() 

dat1 <- dat1 %>%
  mutate(data = map(data, 
                   ~ mutate(., Time = seq(1, 60, by = 1)))) %>%
  unnest() 
  
dat1 <- dat1 %>%
   mutate(walk_1 = ifelse(Time == 1, NA, walk_1)) %>%
   mutate(walk_2 = ifelse(Time == 1, NA, walk_2)) %>%
   mutate(walk_12 = ifelse(Time == 1, NA, walk_12))

这是 dput(head(dat1)) 的输出:

structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L), category = c(1L, 
1L, 1L, 1L, 1L, 1L), walk_1 = c(NA, 7.93428744179875, 11.6326574689602, 
10.3687325793843, 6.2631358473095, 14.0134490135895), walk_2 = c(NA, 
-4.03741066457775, 2.91290193315445, 8.04203547142631, 9.42608080771425, 
16.2253066800552), amount = c(34L, 37L, 31L, 26L, 29L, 33L), 
    walk_12 = c(NA, 3.896876777221, 14.5455594021146, 18.4107680508106, 
    15.6892166550237, 30.2387556936447), Time = c(1, 2, 3, 4, 
    5, 6)), row.names = c(NA, -6L), groups = structure(list(ID = 1L, 
    .rows = structure(list(1:6), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), row.names = 1L, class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

@Marco 在这里,amount 是个人计数,因此同一ID 内的先前测量不应独立。在Amount1 + Amount2 + Amount3 = amount 的意义上,Amount1Amount2Amount3 是相关的。

我需要做的是了解walk_1walk_2 和(因此)walk_1+2 是否具有周期性,如果是这种情况,这种周期性在不同ID 内部或之间是否相等不同的Category。另外,我没有每个ID 中任何第一个时间点的数据,所以要分析的时间序列是 59 个点。

我希望这能澄清我的问题。感谢您的帮助!

【问题讨论】:

  • 请遵循here 的指导方针,了解如何提出一个好的问题并给出一个可重复的例子——尤其是在你的答案中给出dput( head(dat)) 的输出。
  • 你在说什么周期?每周,每月...?因为你说,你有时间数据。或者只是一些任意的周期性?比如 25.8 分钟?
  • @marco 我的时间序列从 00:00:00 开始,一直到 09:50:00。它是一个 POSIXct 对象,每隔 10 分钟增加一次。我需要探索这个时间序列,看看是否有周期性,我不知道峰值之间的时间间隔(如果有的话)

标签: r time-series tidyverse


【解决方案1】:

要比较类别和 ID 之间的统计信息,请使用 dplyr。 时间序列分析并非易事,只有 60 个时间点,要找到有意义的周期并不容易。无论如何,我有很好的经验与先知一起做这件事。请举例说明 AmountX,Y,Z 如何发挥作用。我不清楚。

#example data
dat = data.frame(
category = rep(x = 1:5,each=600),
ID = rep(rep(1:10,each=60),5),
time = as.POSIXct(rep(rep(1:60,10),5)*100000,origin="1970-01-01"), # time frame 2 month + a little
walk_1 = rnorm(n = 3000,mean = 10,sd = 4)
)
##to analyse between categories or ID usw group_by from the dplyr package
dat %>% group_by(category) %>% summarise(sddev = sd(walk_1))
#or some other interesting statistics besides standard deviation

dat %>% group_by(ID) %>% summarise(sddev = sd(walk_1)) # to compare repliactes
dat %>% group_by(category, ID) %>% summarise(sddev = sd(walk_1)) # to compare repliactes and categories

#to investigate for periodic trends is not that trivial. i love to use prohpet for this https://facebook.github.io/prophet/

library(prophet)
#make a time series analysis for category 1 and replicate 1
a = dat %>% filter(category==1,ID==1) %>% mutate(ds =  time,y=walk_1) %>% select(-walk_1,-time) %>% prophet()
future <- make_future_dataframe(a, periods = 365)
b =  predict(a, future)
b$trend # the long term trend
b$weekly # weekly trend
#a plot of trends
prophet_plot_components(m, b) 
    #please note I use random data,

【讨论】:

  • 嗨,马可,感谢您的回答。所以你认为我的数据集在数据点的数量上是有限的?我的问题是,如何通过先知找到周期性趋势的意义?有关详细信息,请参阅我编辑的问题。
猜你喜欢
  • 2020-12-24
  • 1970-01-01
  • 2020-12-21
  • 2016-07-02
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
相关资源
最近更新 更多