【问题标题】:Find specific patterns in sequences在序列中查找特定模式
【发布时间】:2015-01-23 13:46:26
【问题描述】:

我正在使用 R 包 TraMineR 做一些关于序列分析的学术研究。

我想找到一种模式,定义为某人在目标公司,然后出去,然后回到目标公司。

(简化)我已将状态 A 定义为目标公司; B 为外部行业公司,C 为内部行业公司。

所以我想做的是找到具有特定模式 A-B-A 或 A-C-A 的序列。

看了这个问题(Strange number of subsequences?)并阅读了用户指南,特别是以下段落:

4.3.3 子序列 如果 u 的所有连续元素 ui >in x 出现在同一 顺序,我们简单地用 u x 表示。根据这个定义,可以出现非共享>状态 在序列 u 和 x 共有的那些之间。例如,u = S; M 是一个 > 的子序列 x = S;你;米;主持人。

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

根据我在提及的来源中找到的子序列的定义,我想我可以使用以下方法找到那种序列:

seqpm(sequence,"ABA")

但这不会发生。为了找到我需要输入的示例序列

seqpm(sequence,"ABBBBBA")

这对我需要的东西不是很有用。

  1. 那么你们知道我可能遗漏了什么吗?
  2. 如何检索从 A 到 B 再返回到 A 的所有序列?
  3. 有没有办法让我找到从 A 到其他任何地方然后返回 A 的方法?

非常感谢!

【问题讨论】:

    标签: r traminer


    【解决方案1】:

    seqpm 帮助页面的标题是“在序列中查找子字符串模式”,这就是该函数的实际作用。它搜索包含给定子字符串(不是子序列)的序列。用户指南中似乎有公式错误。

    找到包含给定子序列的序列的一种解决方案是使用seqecreate 将状态序列转换为事件序列,然后使用seqefsubseqeapplysub 函数。我使用TraMineR 附带的actcal 数据进行说明。

    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]
    

    希望这会有所帮助。

    【讨论】:

    • 哦,我希望他们有一个工具可以直接在状态序列上进行搜索。我会通过电子邮件向他们发送有关此建议和用户指南上的困惑的信息。谢谢,很有帮助!
    • 我很难理解 ob seqapplysub() 的响应格式是什么。我的问题是,当我检查 subs 对象时,它说 count=6,但是当我检查 subs.pres 对象时,它会打印一堆行(比计数多得多)。我更改了这行代码: subs
    • seqeapplysub 返回一个矩阵,其中每个原始序列对应一行,搜索的每个子序列对应一个列(上面的示例中有两个)。列中的 1 表示包含相应子序列的序列,而 0 表示不包含相应子序列的序列。因此seqefsub(在您的情况下为 6)返回的计数对应于列中 1 的数量。
    • 谢谢!有没有办法获取他们的索引?
    • 只需使用which。例如,index &lt;- which(subs.pres[,1]==1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多