首页 文章

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

提问于
浏览
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() 的子集或'membership elsewhere'类别和分数 .

结果还会显示......

abcde

作为一个不同的,略微罕见的集合或类,具有更高的分数反映更长 length() .

最后......

abc*

会有更高的计数分数,但得分更低 .

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

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个序列包含 FEEM 元素,只有那两个,84有 EMTR 而没有其他状态,57有 EMJLTR .

    您还可以使用 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
    

相关问题