2

R中有没有办法计算序列中状态共现的模式,即在元素顺序不一定重要的组上工作?目的是找出更大的子组在更长的组中的出现有多普遍。

例如,输入数据集将是这样的(“真实”数据序列的宽度可达约 10 列,深度可达 1000 行)......

a,b,c,d
b,c,d,a
c,d,b,a
a,b,c,d,e
b,c,d,a,e
a,b,c
...

结果可能会显示...

abcd, abcd*  

作为一个集合或类,用一个计数来表示出现的次数,例如 * 表示一个子集或“其他地方的成员资格”类别和基于 的分数length()

结果还会显示...

abcde

作为一个不同且稍微稀有的集合或类别,分数越高反映的时间越长length()

最后...

abc*

计数分数会更高,但length()分数会更低。

像 Traminer 这样适用于无序(无序?)组的东西会很棒。我注意到计算负载可能存在问题,但如果我需要刻意编写程序,我会考虑这一点(即某种琐碎阈值)。

4

1 回答 1

3

这是一个按字母顺序对每个序列中的元素进行排序的函数,然后提取已排序序列的连续不同状态。

dssort <- function(seqdata){
  ssort <- t(apply(seqdata, MARGIN=1, sort))
  ssort.seq <- seqdef(ssort, states=alphabet(seqdata), labels=stlab(seqdata))
  sdss  <- seqdef(seqdss(ssort.seq), missing="%")
  sdss
} 

使用此函数的结果,您可以获得形成序列的不同元素集的频率。例如,与

library(TraMineR)
data(mvad)
shortlab <- c("EM", "FE", "HE", "JL", "SC", "TR")
mvad.seq <- seqdef(mvad[,17:86], states=shortlab)

set <- dssort(mvad.seq)

seqtab(set, tlim=1:3)

你得到

               Freq Percent
EM/1-FE/1        94      13
EM/1-TR/1        84      12
EM/1-JL/1-TR/1   57       8

所以你知道 94 个序列包含元素FE并且EM只有这两个,84 个有EM并且TR没有其他状态,57 个有 EM,JLTR

您还可以用 绘制频繁集seqfplot(set)

不确定这是否是您正在寻找的,但希望它有所帮助。

====

这是摆脱无用“/ 1”的方法

tf <- seqtab(set, tlim=1:3, format="STS")
t <- attr(tf,"freq")
rownames(t) <- gsub("-\\*","",rownames(t))
t

这给了

            Freq   Percent
EM-FE         94 13.202247
EM-TR         84 11.797753
EM-JL-TR      57  8.005618
于 2014-12-10T08:36:16.253 回答