R序列和事件问题中的模式序列

Sequence of patterns in R sequence and events issues

我正在尝试使用 R (SPADE) 中的频繁序列。我有以下数据集:

d1 <- c(1:10)
d2 <- c("nut", "bolt", "screw")
data <- data.frame(expand.grid(d1,d2))
data$status <- sample(c("a","b","c"), size = nrow(data), replace = TRUE)
colnames(data) <- c("day", "widget", "status")

   day widget status
1    1    nut      c
2    2    nut      b
3    3    nut      b
4    4    nut      b
5    5    nut      a
6    6    nut      a
7    7    nut      b
8    8    nut      c
9    9    nut      c
10  10    nut      b
11   1   bolt      a
12   2   bolt      b
...

我无法将数据转换成似乎适用于各种可用软件包的格式。我认为基本问题是大多数包都希望有与身份和事件相关联的序列。在我的情况下不存在。

我想回答以下问题:

如果在任何一天小部件[螺栓]的状态是"a"并且小部件[螺丝]是"c"并且在第二天小部件[螺丝]是"b"然后在第 3 天 widget[nut] 很可能是 "a".

所以没有身份或者transaction/event可以使用。我是不是把这个问题复杂化了?或者是否有一个非常适合这个的包。到目前为止,我已经尝试过 arulesSequence 和 TraMineR。

谢谢

我认为您会发现通过将数据从长数据重塑为宽数据,然后实施逻辑测试,最容易解决此类问题。例如:

# reshape from long to wide
data2 <- reshape2::dcast(data, day ~ widget)

# get the next-rows's value for "nut"
data2$next_nut <- dplyr::lead(data2$nut)

# implement your test 
data2$bolt == "a" & data2$screw == "c" & data2$next_nut == "a"

此处的关键是 根据您的 objective 重塑您的数据集。你必须确保每一行都有所有的输入信息(你的criteria/conditions)和目标变量(你想知道的)。

根据您描述的问题:

输入信息是"widget[bolt] value at a given day, widget[screw] value at the same given day and on widget[screw] value the day after",因此您需要确保新数据集的每一行都有此信息。

目标信息 是“第 3 天小部件[坚果]值”。

# for reproducibility reasons
set.seed(16)  

# example dataset
d1 <- c(1:100)
d2 <- c("nut", "bolt", "screw")
data <- data.frame(expand.grid(d1,d2))
data$status <- sample(c("a","b","c"), size = nrow(data), replace = TRUE)
colnames(data) <- c("day", "widget", "status")

library(tidyverse)

data %>% 
  spread(widget, status) %>%             # reshape data
  mutate(screw_next_1 = lead(screw),     # add screw next day
         nut_next_2 = lead(nut, 2)) %>%  # add nut 2 days after (target variable)
  filter(bolt == "a" & screw == "c" & screw_next_1 == "b") # get rows that satisfy your criteria

#   day nut bolt screw screw_next_1 nut_next_2
# 1   8   c    a     c            b          a
# 2  19   c    a     c            b          c
# 3  62   c    a     c            b          c
# 4  97   c    a     c            b          b

通过简单的计算,您可以说根据数据您有 nut = a 第 3 天的概率,给定您的标准,是 1/4。

不确定你想做什么。如果您想使用 TraMineR,假设小部件是您的序列 ID,您可以通过以下方式输入数据:

library(TraMineR)

## Transforming into the STS form expected by seqdef()
sts.data <- seqformat(data, from="SPELL", to="STS", id="widget", 
                      begin="day", end="day", status="status",
                      limit=10)

## Setting position names and sequence names
names(sts.data) <- paste0("d",rep(1:10))
rownames(sts.data) <- d2
sts.data
#       d1 d2 d3 d4 d5 d6 d7 d8 d9 d10
# nut    b  a  b  b  b  a  c  a  a   a
# bolt   c  b  a  b  a  c  b  a  c   c
# screw  a  b  a  a  c  c  b  b  b   c

## Creating the state sequence object
sseq <- seqdef(sts.data)

## Potting the sequences
seqiplot(sseq, ytlab="id", ncol=3)