计算子集成员资格共现和组字母长度

时间:2014-12-10 04:41:31

标签: r traminer

在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*

会有更高的计数分数,但得分会更低{。}}。

像Traminer那样对无序(无序?)群体起作用的东西会很棒。我注意到计算负荷可能存在问题,但是如果我需要在编写程序时切入牙齿,我会考虑(即某种微不足道的阈值)。

1 个答案:

答案 0 :(得分: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个序列包含元素FEEM,只有那两个,84个有EMTR而没有其他状态,57个有{{ 1}},EMJL

您还可以使用TR绘制频繁集。

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

====

以下是如何摆脱无用的“/ 1”

seqfplot(set)

给出了

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