我使用R包TraMineR进行一些学术研究序列分析。
我想找到一个模式,定义为某人在目标公司,然后出去,然后回到目标公司。
(简化)我将州A定义为目标公司; B作为外部工业公司,C作为内部工业公司。
所以我想做的是找到具有特定模式A-B-A或A-C-A的序列。
在查看此问题(Strange number of subsequences?)并阅读用户指南后,特别是以下段落:
4.3.3子序列 如果u的所有连续元素ui在x中同样出现,则序列u是x的子序列 顺序,我们简单地用u x表示。根据这种说法,可以出现未共享的>状态 在序列u和x之间共同的那些之间。例如,u = S; M是>子序列 x = S; U;米; MC。
和
7.3.2查找具有给定子序列的序列 seqpm()函数计算包含给定子序列并收集的序列数 他们的行索引号。该函数返回一个包含两个元素的列表。第一个元素,MTab, 只是一个表格,其中包含数据中给定子序列的出现次数。注意 即使子序列出现多于一个,每个序列也只计算一次出现次数 时间顺序。列表的第二个元素MIndex给出行索引号 包含子序列的序列。这些索引号可能对访问时有用 有关序列(下面的例子)。由于在字符串中搜索模式更容易, 当使用seqconc函数时,函数rst以这种格式转换序列数据 TRUE选项。
我得出结论,seqpm()是完成工作所需的功能。
所以我有以下序列: A-A-A-A-A-B-B-B-B-B-A-A-A-A-A
根据我在mentiod源上找到的子序列的定义,我想通过使用我可以找到那种序列:
seqpm(sequence,"ABA")
但这不会发生。为了找到我需要输入的示例序列
seqpm(sequence,"ABBBBBA")
对我需要的东西不是很有用。
非常感谢!
答案 0 :(得分:3)
seqpm
帮助页面的标题是"查找序列中的子字符串模式",这就是函数实际执行的操作。它搜索包含给定子字符串(而不是子序列)的序列。似乎用户指南中存在配方错误。
找到包含给定子序列的序列的解决方案是将状态序列转换为seqecreate
的事件序列,然后使用seqefsub
和seqeapplysub
函数。我将使用actcal
附带的TraMineR
数据进行说明。
library(TraMineR)
data(actcal)
actcal.seq <- seqdef(actcal[,13:24])
## displaying the first state sequences
head(actcal.seq)
## transforming into event sequences
actcal.seqe <- seqecreate(actcal.seq, tevent = "state", use.labels=FALSE)
## displaying the first event sequences
head(actcal.seqe)
## now searching for the subsequences
subs <- seqefsub(actcal.seqe, strsubseq=c("(A)-(D)","(D)-(B)"))
## and identifying the sequences that contain the subsequences
subs.pres <- seqeapplysub(subs, method="presence")
head(subs.pres)
## we can now, for example, count the sequences that contain (A)-(D)
sum(subs.pres[,1])
## or list the sequences that contain (A)-(D)
rownames(subs.pres)[subs.pres[,1]==1]
希望这会有所帮助。