在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那样对无序(无序?)群体起作用的东西会很棒。我注意到计算负荷可能存在问题,但是如果我需要在编写程序时切入牙齿,我会考虑(即某种微不足道的阈值)。
答案 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个序列包含元素FE
和EM
,只有那两个,84个有EM
和TR
而没有其他状态,57个有{{ 1}},EM
和JL
。
您还可以使用TR
绘制频繁集。
不确定这是否是您正在寻找的,但希望它有所帮助。
====
以下是如何摆脱无用的“/ 1”
seqfplot(set)
给出了
tf <- seqtab(set, tlim=1:3, format="STS")
t <- attr(tf,"freq")
rownames(t) <- gsub("-\\*","",rownames(t))
t