TraMineR,提取所有存在的事件组合作为虚拟变量

TraMineR, Extract all present combination of events as dummy variables

假设我有这些数据。我的objective是提取序列的组合。
我有一个限制,两个事件之间的时间不能超过 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 循环编写一个函数,但如果序列变大并且事件的不同数量也变大,它就会变得非常复杂。而且如果不同用户的数量增长到 100 000。

是否可以在 TraMineR 中借助 seqeconstraint 执行此操作?

以下是使用 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 是一个 table,每个子序列在数据集中至少出现一次。因此,如果您有多个个体(事件序列),table 每个个体一行,列将是您要查找的二进制变量。 (另请参阅 TraMineR: Can I get the complete sequence if I give an event sub sequence?

但是,请注意 TraMineR 仅适用于长度不超过 4 或 5 的子序列。我们建议在 seqefsub 中设置 maxK=34 .只要您限制要查找的最大子序列长度,个人的数量应该不是问题,不同的可能事件(字母表)的数量也不应该成为问题。

希望对您有所帮助