规范形式保存不规则时间序列的矩阵?

问题描述 投票:1回答:1

让我们说一群人po(最终,n维)的二维网格中移动一堆物体i * k

每当一些p移动时,我都会拍摄i x k网格的快照(这实际上是通过js回调发生的)。

因此,对于p Aliceos qazxsw poi,以及qazxsw poi,qazxsw poi,每个2,在c("foo", "bar),这给出了像

i

四秒钟之后,在k,比方说,

2017-12-24 18:00:00

对于其他一些 1 2 1 "foo" 2 "bar" 2017-12-26 18:00:04,我得到类似的快照,但是,至关重要的是在不同的时间,因为,好吧, 1 2 1 "foo" 2 "bar" 选择在不同的时间移动物体。

对于大多数分析,我将只查看每个p的最终(最新)快照,然后愉快地BobBob数组中的整个事情。

但我也希望保留不定期订购的时间序列。如何在R中以巧妙的规范方式最好地存储这些数据?

由于我不能在不规则的时间点上进行p(因为它们每个人都不同),我目前的方法是将快照放在每个abind()的列表中,比如说,

p x i x k

等等。 (也许,我宁愿使用适当的abind() p作为列表元素属性,但这是详细信息)。

这样做没问题,但感觉很乱/很奇怪,原因有很多:

  1. 列表本身不支持时间序列信息,因此将它们添加为列表元素属性会让人感到烦恼。
  2. 该列表使得很难看出所有单个矩阵具有相同的等级(必须如此)。 (我想这是不可避免的,因为我不能有意义地使用data$alice <- list( `2017-12-24 18-00-00` = matrix(data = c("foo", NA, NA, "bar"), nrow = 2), `2017-12-24 18-00-04` = matrix(data = c("foo", NA, "bar", NA), nrow = 2)) data$bob <- ... )。
  3. 我的直觉想法通常很糟糕。必须有一个更好的方法。

我是时间序列的新手,我只是想确保我不是非常愚蠢而且(很差)重新发明轮子以解决一个典型的问题。另外:这将成为一个包和lubricate类的一部分,所以我想要做到这一点。


警告/旁观:

  • 我已经研究了datetimes包,但虽然它提供了不规则的时间间隔(我有),它似乎没有提供不同的不规则时间间隔的类。
  • 我不想以整洁的格式存储这些数据。我在这里和abind()在一起;网格的矩阵表示本质上是有意义的,我想保留它。还会有一些矩阵代数,如果应用于整洁的数据,它只会产生非常不透明的代码。也就是说,如果我在这里愚蠢,以及以整齐的形式存储这类数据的规范方式,我对此持开放态度。

Ps:为无耻的伪代码/数学道歉。希望它仍然有助于使事情更清楚。

r matrix time-series zoo tidyverse
1个回答
3
投票

我有两个建议,虽然我不知道它们是否是“规范的”。您可以使用S3(来自zoo包中的面板数据)或Jeff Leek

设置一些数据:

pdata.frame

plm方法将每个矩阵元素存储为一列,除了人和时间标识符之外,它还可以为您提供tibble列。

set.seed(123)
dat <- data.frame(
  person = c("Alice", "Alice", "Bob", "Bob"),
  time = as.POSIXct(runif(4, 1500000000, 1510000000), origin = "1970-01-01")
)
mats <- lapply(1:4, function(...) matrix(sample(1:4, 4), nc = 2, nr = 2))

给我的pdata.frame更优雅:

i * k

例如,它允许您为每个人拍摄最新的快照:

library(plm)
dat_plm <- cbind(dat, as.data.frame(do.call(rbind, lapply(mats, as.vector))))
pdat <- pdata.frame(dat_plm, index = c("person", "time"), row.names = FALSE)
pdat
#   person                time V1 V2 V3 V4
# 1  Alice 2017-08-04 05:52:13  1  3  2  4
# 2  Alice 2017-08-26 08:13:42  2  4  3  1
# 4    Bob 2017-08-09 08:45:14  4  3  1  2
# 3    Bob 2017-10-28 11:20:55  1  3  2  4
str(pdat)
# Classes ‘pdata.frame’ and 'data.frame': 4 obs. of  6 variables:
#  $ person: Factor w/ 2 levels "Alice","Bob": 1 1 2 2
#   ..- attr(*, "names")= chr  "1" "2" "4" "3"
#   ..- attr(*, "index")=Classes ‘pindex’ and 'data.frame': 4 obs. of  2 variables:
#   .. ..$ person: Factor w/ 2 levels "Alice","Bob": 1 1 2 2
#   .. ..$ time  : Factor w/ 4 levels "2017-08-04 05:52:13",..: 1 3 2 4
# <snip>
#  - attr(*, "index")=Classes ‘pindex’ and 'data.frame':  4 obs. of  2 variables:
#   ..$ person: Factor w/ 2 levels "Alice","Bob": 1 1 2 2
#   ..$ time  : Factor w/ 4 levels "2017-08-04 05:52:13",..: 1 3 2 4
© www.soinside.com 2019 - 2024. All rights reserved.