2

可以说我有这些数据。我的目标是提取序列的组合。
我有一个约束,两个事件之间的时间可能不超过 5,我们称之为maxGap.

User <- c(rep(1,3))     # One users
Event <- c("C","B","C") # Say this is random events could be anything from LETTERS[1:4]
Time <- c(c(1,12,13))   # This is a timeline
df <- data.frame(User=User,
             Event=Event,
             Time=Time)

如果想用这些序列作为二元解释变量进行分析。
给定这个数据框,结果应该是这样的。

res.df <- data.frame(User=1,
                     C=1,
                     B=1,
                     CB=0,
                     BC=1,
                     CBC=0)  

(CB) 和 (CBC) 将是 0,因为maxGap> 5。
我试图为此使用许多 for 循环编写一个函数,但如果序列变得更大并且不同数量的 evet 也变得更大,它会变得非常复杂。如果不同用户的数量增长到 100 000。

是否有可能在 TraMineR 的帮助下做到这一点seqeconstraint

4

1 回答 1

1

以下是您将如何做到这一点TraMineR

df.seqe <- seqecreate(id=df$User, timestamp=df$Time, event=df$Event)

constr <- seqeconstraint(maxGap=5)
subseq <- seqefsub(df.seqe, minSupport=0, constraint=constr)
(presence <- seqeapplysub(subseq, method="presence"))

这使

                   (B) (B)-(C) (C)
1-(C)-11-(B)-1-(C)   1       1   1

presence是一个表,其中包含在数据集中至少出现一次的每个子序列的列。因此,如果您有几个人(事件序列),则该表将每个人一行,而列将是您要查找的二进制变量。(另见TraMineR:如果我给出一个事件子序列,我能得到完整的序列吗?

但是,请注意,TraMineR只有长度不超过 4 或 5 的子序列才能正常工作。我们建议设置maxK=34in seqefsub。只要您限制您正在寻找的最大子序列长度,个体的数量应该不是问题,不同的可能事件(字母表)的数量也不应该成为问题。

希望这可以帮助

于 2017-02-18T14:18:06.020 回答