我想从包含缺失的数据(即包含间隙的序列)中对与 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
那么,当数据包含缺失,即序列包含间隙时,我们如何使用 seqdist()
和 seqsubm()
的输出正确计算序列之间的差异?
注意:我是'm not very sure if this makes sense at all. So far I just exclude observations with missings but due to my data I loose lots of observations by that. Therefore it would be worthwhile to know if there'这样的选择 .
1 回答
当你有差距时,有不同的计算距离策略 .
1)第一种解决方案是将缺失状态视为附加状态 . 这是
seqdist
设置with.missing=TRUE
时的作用 . 在这种情况下,sm
矩阵应该包含用缺失状态代替任何州的成本 . 使用seqsubm
,您只需为该功能指定with.missing=TRUE
. 默认情况下,替换'missing'的替换成本设置为固定值miss.cost
(默认为2) .根据转移概率获得“缺失”的替代成本
使用后者
sm
,我们得到序列之间的距离当然,序列之间会彼此接近,因为它们共享许多缺失状态(*) . 因此,您可能希望仅保留缺少少于10%元素的序列 .
2)第二种解决方案是删除您在
seqdef
中执行的间隙 . (但请注意,这会改变对齐方式 . )