【问题标题】:TraMineR: Can I get the complete sequence if I give an event sub sequence?TraMineR:如果我给出一个事件子序列,我能得到完整的序列吗?
【发布时间】:2016-10-21 14:28:58
【问题描述】:

我有一个如下的序列数据集:

customerid    flag  0   1   2   3   4   5   6   7   8   9   10  11
abc234          1   3   4   3   4   5   8   4   3   3   2   14  14
abc233          0   4   4   4   4   4   4   4   4   4   4   4   4
qpr81           0   9   8   7   8   8   7   8   8   7   8   8   7
qnr94           0   14  14  14  2   14  14  14  14  14  14  14  14

011 列中的值是序列。有两组客户的标志 = 1 和标志 = 0,我对两组都有不同的事件序列。 (此处仅显示 2 组的频率和残差)

Subsequence Freq.0      Freq.1     Resid.0       Resid.1
(3>4)       0.19208177  0.0753386   5.540793    -21.43304
(4>5)       0.15752553  0.059960497 5.115241    -19.78691
(5>4)       0.15950556  0.062782167 5.037413    -19.48586

我想查找与事件序列匹配的客户 ID 和标志。

我应该编写一个 python 脚本来遍历交易还是在 R 中有一些直接的方法可以做到这一点?

`

CODE
--------------

library(TraMineR)

custid=c(a1,a2,a3,b4,b5,c6,c7,d8,d9)#sample customer ids
flag=c(0,0,0,1,0,1,1,0,1)#flag
col1=c(14,14,14,14,14,5,14,14,2)
col2=c(14,14,3,14,3,14,6,3,3)
col3=c(14,2,2,14,2,14,2,2,2)
col4=c(14,2,2,14,2,14,2,2,14)
df=data.frame(custid,flag,col1,col2,col3,col4)#dataframe generation
print(df)
#Defining sequence from col1 to col4
df.s<-seqdef(df,3:6)
print(df.s)
#finding the transitions
transition<-seqetm(df.s,method='transition')
print(transition)
#converting to TSE format
df.tse=seqformat(df.s,from='SPS',to='TSE',tevent = transition)
print(df.tse)
#Event sequence generation
df.seqe=seqecreate(id=df.tse$id,timestamp=df.tse$time,event=df.tse$event)
print(df.seqe)
#subsequences
fsubseq <- seqefsub(df.seqe, pMinSupport = 0.01)
print(fsubseq)
groups <- factor(df$flag>0,labels=c(1,0))
#finding differentiating event sequences based on flag using ChiSquare test
diff <- seqecmpgroup(fsubseq, group = df$flag, method = "chisq")

#Using seqeapplysub for finding the presence of subsequences?
presence=seqeapplysub(fsubseq,method="presence")
print(presence[1:3,3:1])

`

谢谢

【问题讨论】:

    标签: r traminer


    【解决方案1】:

    据我了解,您有状态序列,并使用TraMineRseqecreate 函数将它们转换为事件序列。您正在考虑的事件是状态变化。因此(3&gt;4) 代表只有一个事件的子序列,即事件3&gt;4(从3 切换到4)。然后,您使用seqefsubseqecmpgroup 函数识别最能区分您的两个标志的事件子序列。

    如果这是正确的,那么您可以使用seqeapplysub 函数识别包含每个子序列的序列。我无法在这里说明,因为您没有在问题中提供任何代码。看seqeapplysub函数的在线帮助。

    ======= 更新参考您添加的代码 =======

    您可以通过以下方式获取包含最具辨别力的子序列的序列 ID。

    首先,我们从您的 diff 对象中提取前三个最具区分性的序列。其次,我们计算presence 矩阵,该矩阵为每个提取的子序列提供一列,其中包含子序列的序列为 1,否则为 0。

    diffseq <- seqefsub(df.seqe, strsubseq = paste(diff$subseq[1:3]))
    (presence=seqeapplysub(diffseq, method="presence"))
    

    现在你得到了第一个子序列的ID

    custid[presence[,1]==1]
    

    第二个是custid[presence[,2]==1] 等等。

    同样你会得到标志

    flag[presence[,1]==1]
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢吉尔伯特!我查看了seqeapplysub 函数。对我来说,获取客户 ID 和标志更为重要。我正在查看seqecmpgroup 方法给出的index 字段。已经添加了代码,顺便说一句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多