代码之家  ›  专栏  ›  技术社区  ›  jay.sf

当序列包含间隙时,如何计算序列之间的差异?

  •  1
  • jay.sf  · 技术社区  · 7 年前

    TraMineR::seqdist() 来自包含缺失的数据,即包含间隙的序列。

    library(TraMineR)
    data(ex1)
    sum(is.na(ex1))
    
    # [1] 38
    
    sq <- seqdef(ex1[1:13])
    sq
    
    #    Sequence                 
    # s1 *-*-*-A-A-A-A-A-A-A-A-A-A
    # s2 D-D-D-B-B-B-B-B-B-B      
    # s3 *-D-D-D-D-D-D-D-D-D-D    
    # s4 A-A-*-*-B-B-B-B-D-D      
    # s5 A-*-A-A-A-A-*-A-A-A      
    # s6 *-*-*-C-C-C-C-C-C-C      
    # s7 *-*-*-*-*-*-*-*-*-*-*-*-*
    
    sm <- seqsubm(sq, method='TRATE')
    round(sm,digits=3)
    
    #      A-> B->   C-> D->
    # A->   0 2.000   2 2.000
    # B->   2 0.000   2 1.823
    # C->   2 2.000   0 2.000
    # D->   2 1.823   2 0.000
    

    当我跑的时候 seqdist()

    dist.om <- seqdist(sq, method="OM", indel=1, sm=sm)
    

    Error: 'with.missing' must be TRUE when 'seqdata' or 'refseq' contains missing values
    

    但当我设置选项时 with.missing=TRUE 我收到了

     [>] including missing values as an additional state
     [>] 7 sequences with 5 distinct states
     [>] checking 'sm' (one value for each state, triangle inequality)
    Error:  [!] size of substitution cost matrix must be 5x5
    

    输出 seqsubm() 当数据包含缺失,即序列包含间隙时,正确的方法是什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gilbert    7 年前

    当你有差距时,有不同的计算距离的策略。

    1)第一个解决方案是将缺失状态视为附加状态。这是什么 seqdist with.missing=TRUE . 在这种情况下 sm 矩阵应包含用缺失状态替换任何状态的成本。使用 seqsubm with.missing=TRUE 也适用于该功能。默认情况下,替换“缺失”的替换成本设置为固定值 miss.cost

    sm <- seqsubm(sq, method='TRATE', with.missing=TRUE)
    round(sm,digits=3)
    
    #     A->   B-> C->   D-> *->
    # A->   0 2.000   2 2.000   2
    # B->   2 0.000   2 1.823   2
    # C->   2 2.000   0 2.000   2
    # D->   2 1.823   2 0.000   2
    # *->   2 2.000   2 2.000   0
    

    根据转移概率获取“缺失”的替代成本

    sm <- seqsubm(sq, method='TRATE', with.missing=TRUE, miss.cost.fixed=FALSE)
    round(sm,digits=3)
    
    #       A->   B->   C->   D->   *->
    # A-> 0.000 2.000 2.000 2.000 1.703
    # B-> 2.000 0.000 2.000 1.823 1.957
    # C-> 2.000 2.000 0.000 2.000 1.957
    # D-> 2.000 1.823 2.000 0.000 1.957
    # *-> 1.703 1.957 1.957 1.957 0.000
    

    使用后者 山猫 ,我们得到了序列之间的距离

    dist.om <- seqdist(sq, method="OM", indel=1, sm=sm, with.missing=TRUE)
    round(dist.om, digits=2)
    
    #       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
    # [1,]  0.00 22.87 21.91 18.41  6.41 17.00 17.03
    # [2,] 22.87  0.00 13.76 11.56 19.91 19.87 22.57
    # [3,] 21.91 13.76  0.00 14.25 18.96 18.91 21.57
    # [4,] 18.41 11.56 14.25  0.00 13.70 15.70 18.14
    # [5,]  6.41 19.91 18.96 13.70  0.00 15.70 16.62
    # [6,] 17.00 19.87 18.91 15.70 15.70  0.00 16.70
    # [7,] 17.03 22.57 21.57 18.14 16.62 16.70  0.00
    

    seqdef . (但是,请注意,这会更改对齐方式。)

    ## Here, we drop seq 7 that contains only missing values
    
    sq <- seqdef(ex1[-7,1:13], left='DEL', gaps='DEL')
    sq
    
    #    Sequence           
    # s1 A-A-A-A-A-A-A-A-A-A
    # s2 D-D-D-B-B-B-B-B-B-B
    # s3 D-D-D-D-D-D-D-D-D-D
    # s4 A-A-B-B-B-B-D-D    
    # s5 A-A-A-A-A-A-A-A    
    # s6 C-C-C-C-C-C-C  
    
    sm <- seqsubm(sq, method='TRATE')
    round(sm,digits=3)
    
    #       A->   B-> C->   D->
    # A-> 0.000 1.944   2 2.000
    # B-> 1.944 0.000   2 1.823
    # C-> 2.000 2.000   0 2.000
    # D-> 2.000 1.823   2 0.000
    
    dist.om <- seqdist(sq, method="OM", indel=1, sm=sm)
    round(dist.om, digits=2)
    
    #       [,1]  [,2]  [,3]  [,4]  [,5] [,6]
    # [1,]  0.00 19.61 20.00 13.78  2.00   17
    # [2,] 19.61  0.00 12.76  9.59 17.61   17
    # [3,] 20.00 12.76  0.00 13.29 18.00   17
    # [4,] 13.78  9.59 13.29  0.00 11.78   15
    # [5,]  2.00 17.61 18.00 11.78  0.00   15
    # [6,] 17.00 17.00 17.00 15.00 15.00    0