如何在 TraMineR 中提取所有当前事件组合作为虚拟变量

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

假设我有这些数据。我的目标是提取序列的组合。我有一个限制,两个事件之间的时间不能超过 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。

是否可以在

seqeconstraint
的帮助下在 TraMineR 中执行此操作?

r sequence traminer
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=3
中设置
4
seqefsub
。只要您限制要查找的最大子序列长度,个体的数量就不应该成为问题,不同的可能事件(字母表)的数量也不应该成为问题。

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.