检测有序事件列表中的类似序列

时间:2014-06-28 16:48:43

标签: linux data-analysis sequencing

我从一堆(数百万)小实验中得到了记录。

每个日志包含一个列表(数十到数百个)条目。每个条目都是一个时间戳和一个事件ID(有几千个事件ID,每个事件ID可能在日志中多次出现):

1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 alpha
1403973098 delta

我知道一个事件可能会在以后触发其他事件。

我正在研究这个数据集。我正在寻找在实验中经常发生的“稳定”事件序列。

有没有办法在不编写太多代码和不使用专有软件的情况下执行此操作?解决方案应该足够可扩展,并且可以处理大型数据集。

我认为这项任务类似于生物信息学所做的工作 - 在DNA等中寻找序列。只有我的任务包括字母表中的四个以上的字母......(更新,感谢@JayInNyc:蛋白质组学处理比我更大的字母表。)

(注意,顺便说一下,我事先并不知道我想要我的序列是多么稳定和类似,最小的序列长度等等。我正在研究数据集,并且必须在旅途中弄清楚这一点。)

无论如何,有关我可以使用的方法/工具/库的任何建议吗?


更新:评论中的问题的一些答案:

稳定的序列:在实验中经常发现。 (经常是不够的?还不知道。看起来我需要计算链条的顶部,并丢弃最稀有的。)

类似的序列:看起来相似的序列。 “根据你的序列'ABCDE'和'ABCED'(序列中的微小差异)是否相似?序列'ABCDE'和'ABC 1 DE'(所选事件的发生顺序是否相同)也是相似的? “ - 这两个问题都是。更激烈的突变可能也行。再一次,我希望能够计算一个顶部并丢弃最不相似的......

时间:我现在可以丢弃时间信息(但不是命令)。但是将它放在相似性指数公式中会很酷。


更新2:预期输出。

最后,我希望获得最受欢迎的最长最稳定链条的评级。所有这三个因素的组合应该会对评分得分的计算产生影响。

显然,这种评级中的链条是一组相似的链条。

链簇的合成示例:

alpha
beta
gamma
[garbage]
[garbage]
delta

另一:

alpha
beta
gamma|zeta|epsilon
delta

(或者现在没有想到任何变体。)

因此,最终输出将是这样的(在这个例子中数字完全是随机的):

Chain cluster ID | Times found | Time stab. factor | Chain stab. factor | Length | Score
A                | 12345       | 123               | 3                  | 5      | 100000
B                | 54321       | 12                | 30                 | 3      | 700000

2 个答案:

答案 0 :(得分:0)

在过去的一天左右我已经考虑过这个设置 - 如何在bash等中以一种理智的可扩展方式来实现它。答案实际上是由你想从数据中提取的关系信息驱动的。您当前拥有的数据集的外观大小。 xleanest解决方案是将数据集加载到关系数据库中(根据我的建议,MariaDB)

由于您的数据已经以相当干净的格式存在,因此您将数据输入数据库的选项是2.(1)如果文件的数据位于可用的rowxcol设置中,那么您只需使用{{1}将数据带入数据库;或者(2)在LOAD DATA INFILE场景中使用bash解析文件,解析数据以获得所需的表格格式的数据,并使用mysql批处理模式直接将信息加载到mysql中。 bash命令的一般形式为while read line; do

一旦进入关系数据库,您就拥有了适当的工具,能够以合理的方式对您的数据运行灵活的查询,而不是不断地编写/重写bash片段以便以不同的方式处理您的数据每一次。这可能是您正在寻找的最佳可扩展解决方案。提前做一点工作,但未来会有更好的设置。

答案 1 :(得分:0)

维基百科将算法定义为“精确步骤的精确列表”:'我正在寻找在实验中经常出现的“稳定”事件序列。没有定义的“稳定”和“经常足够”会导致无法为您提供算法的任务。

所以我给你一个简单的计算长度为2的序列的频率。我将忽略时间戳。这是awk代码(pW代表前一个Word,pc代表对计数器):

#!/usr/bin/awk -f

BEGIN { getline; pW=$2; }

{ pcs[pW, $2]++; pW=$2; }

END {
    for (i in pcs)
        print i, pcs[i];
}

我复制了你的样本以显示有意义的内容

1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 alpha
1403973098 delta
1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 beta
1403973098 delta
1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 beta
1403973098 delta
1403973044 alpha
1403973045 beta
1403973070 gamma
1403973070 beta
1403973098 delta

在上面运行上面的代码会给出:

gammaalpha 1
alphabeta 4
gammabeta 3
deltaalpha 3
betagamma 4
alphadelta 1
betadelta 3

可以解释为α,然后是β和β​​,然后是γ,是最常见的长度,两个序列各自在样本中出现4次。我想这就是你对稳定序列的定义经常发生。

下一步是什么?

(1)您可以轻松地将上面的代码用于长度为N的序列,并找到经常出现的序列,您可以对第二列的输出进行排序(-k2nr)。

(2)为了限制N你可以规定没有事件触发自己,这为你提供了一个截止点。或者您可以限制时间戳,即连续事件之间的差异。

(3)到目前为止,这些序列实际上是字符串,我使用了它们之间的精确匹配(CLRS术语)。没有什么可以阻止您使用您最喜欢的相似性度量:

{ pcs[CLIFY(pW, $2)]++; pW=$2; }

CLIFY将是一个函数,它接受k个连续事件并将它们放入一个bin中,也就是说你想让ABCDE和ABDCE转到同一个bin。 CLIFY当然可以作为目前为止的一组箱子的附加论据。

awk的选择是为了方便。它不会飞,但你可以轻松地并行运行它们。

目前还不清楚你想要使用它,但谷歌搜索马尔科夫连锁店,Mark V Shaney可能会有所帮助。