【问题标题】:How to identify sequences within each cluster?如何识别每个簇内的序列?
【发布时间】:2014-01-24 21:22:34
【问题描述】:

使用 TraMineR 中的 biofam 数据集:

library(TraMineR)
data(biofam)
lab <- c("P","L","M","LM","C","LC","LMC","D")
biofam.seq <- seqdef(biofam[,10:25], states=lab)
head(biofam.seq)
     Sequence                                    
1167 P-P-P-P-P-P-P-P-P-LM-LMC-LMC-LMC-LMC-LMC-LMC
514  P-L-L-L-L-L-L-L-L-L-L-LM-LMC-LMC-LMC-LMC    
1013 P-P-P-P-P-P-P-L-L-L-L-L-LM-LMC-LMC-LMC      
275  P-P-P-P-P-L-L-L-L-L-L-L-L-L-L-L             
2580 P-P-P-P-P-L-L-L-L-L-L-L-L-LMC-LMC-LMC       
773  P-P-P-P-P-P-P-P-P-P-P-P-P-P-P-P 

我可以进行聚类分析:

library(cluster)
couts <- seqsubm(biofam.seq, method = "TRATE")
biofam.om <- seqdist(biofam.seq, method = "OM", indel = 3, sm = couts)
clusterward <- agnes(biofam.om, diss = TRUE, method = "ward")
cluster3 <- cutree(clusterward, k = 3)
cluster3 <- factor(cluster3, labels = c("Type 1", "Type 2", "Type 3"))

但是,在这个过程中,来自 biofam.seq 的唯一 ID 已被替换为从 1 到 N 的数字列表:

head(cluster3, 10)
[1] Type 1 Type 2 Type 2 Type 2 Type 2 Type 3 Type 3 Type 2 Type 1
[10] Type 2
Levels: Type 1 Type 2 Type 3

现在,我想知道每个簇内有哪些序列,以便我可以应用其他函数来获得每个簇内的平均长度、熵、子序列、相异度等。我需要做的是:

  1. 将旧 ID 映射到新 ID
  2. 将每个簇中的序列插入到单独的序列对象中
  3. 对每个新序列对象运行我想要的统计数据

我怎样才能完成上面列表中的 2 和 3?

【问题讨论】:

  • 我想帮忙,但我无法运行您的示例:biofam.seq 来自哪里?
  • 它加载了TraMineR:mephisto.unige.ch/traminer/doc/biofam.html,如果它没有自动加载,你应该可以在运行biofam.seq &lt;- seqdef(biofam)之后使用biofam.seq &lt;- seqdef(biofam)来完成data(biofam)
  • biofam 数据还包含协变量。因此,在seqdef 中,您应该指定我们找到序列数据的列,即seqdef(biofam[10:25,])。我已经相应地编辑了问题。

标签: r cluster-analysis data-manipulation traminer


【解决方案1】:

例如,第一个集群的状态序列对象,可以简单地获得

bio1.seq <- biofam.seq[cluster3=="Type 1",]
summary(bio1.seq)

【讨论】:

    【解决方案2】:

    我认为这将回答您的问题。我使用我在这里找到的代码http://www.bristol.ac.uk/cmm/software/support/workshops/materials/solutions-to-r.pdf 来创建biofam.seq,因为你的建议都不适合我。

    # create data
    library(TraMineR)
    data(biofam)
    bf.states  <- c("Parent", "Left", "Married", "Left/Married", "Child",
                    "Left/Child", "Left/Married/Child", "Divorced")
    bf.shortlab <- c("P","L","M","LM","C","LC", "LMC", "D")
    biofam.seq  <- seqdef(biofam[, 10:25], states = bf.shortlab,
                                           labels = bf.states)
    
    # cluster
    library(cluster)
    couts <- seqsubm(biofam.seq, method = "TRATE")
    biofam.om <- seqdist(biofam.seq, method = "OM", indel = 3, sm = couts)
    clusterward <- agnes(biofam.om, diss = TRUE, method = "ward")
    cluster3 <- cutree(clusterward, k = 3)
    cluster3 <- factor(cluster3, labels = c("Type 1", "Type 2", "Type 3"))
    

    首先,我使用split 为每个集群创建一个索引列表,然后在lapply 循环中使用它从biofam.seq 创建一个子序列列表:

    # create a list of sequences
    idx.list <- split(seq_len(nrow(biofam)), cluster3)
    seq.list <- lapply(idx.list, function(idx)biofam.seq[idx, ])
    

    最后,您可以使用lapplysapply 对每个子序列运行分析

    # compute statistics on each sub-sequence (just an example)
    cluster.sizes <- sapply(seq.list, FUN = nrow)
    

    其中FUN 可以是您通常在单个序列上运行的任何函数。

    【讨论】:

    • @histelheim,如果我已经回答了您的问题,请考虑接受。谢谢。
    猜你喜欢
    • 2011-05-16
    • 2019-10-10
    • 1970-01-01
    • 2014-12-11
    • 2011-10-31
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多