我一直在以分类状态的有序序列形式对数据进行一些探索性分析,例如顺序x = A,A,B,D ...等
我一直在R中使用Traminer软件包来进行此分析。包中提供的功能之一(seqdist())计算序列对之间的距离(用于聚类)。如Studer&Ritschard(2015-http://dx.doi.org/10.1111/rssa.12125)中所述,支持许多距离度量,包括Chi-Squared距离。
我想通过一个简单的例子来计算“手动”距离,以验证我对这个距离度量的理解。 Studer&Ritschard(2015)未提供公式,但在对Traminer邮件列表(http://traminer.unige.ch/contrib.shtml)进行查询后,吉尔伯特·里查德(Gilbert Ritschard)友好地将我引向了早期的工作论文(https://www.lives-nccr.ch/sites/default/files/pdf/publication/33_lives_wp_studer_sequencedissmeasures.pdf-第8页)(包括该公式),并鼓励我将问题引向堆栈溢出问题,以便更广泛地看待它。
但是,对于一个非常简单的示例,我仍然难以使用提供的公式来再现卡方距离度量。一个使用R和距离度量的公式的可重现示例如下,如果有人可以帮助我确定差异的根源,我将不胜感激(大概是我对公式有误解)。
卡方距离公式如下:
对于集合 j 中的序列字母以及序列x和y,令p_(j | x)等于序列x在状态j中花费的时间比例,并令p_ (j)等于“在状态j中花费的总时间比例”,序列x和y之间的卡方距离为:
使用此公式(而不是与周期有关的版本),我尝试为以下示例重现距离计算,该示例仅涉及两个短序列:
x = E-E-E-G-G
y = E-E-E-E-E
所以国家的字母是{E,G}
在R中,可以如下重新创建这些序列:
library(TraMineR)
sequence.mat <- matrix(c("E", "E", "E", "G", "G", "E", "E", "E", "E", "E"), nrow=2, byrow=TRUE)
colnames(sequence.mat) <- paste("m", 1:5, sep="")
sequence.mat
给予:
m1 m2 m3 m4 m5
[1,] "E" "E" "E" "G" "G"
[2,] "E" "E" "E" "E" "E"
这被定义为Traminer的序列,如下所示:
sequence.obj <- seqdef(data=sequence.mat)
[>] 2 distinct states appear in the data:
1 = E
2 = G
[>] state coding:
[alphabet] [label] [long label]
1 E E E
2 G G G
[>] 2 sequences in the data set
[>] min/max sequence length: 5/5
sequence.obj
Sequence
1 E-E-E-G-G
2 E-E-E-E-E
两个序列之间的距离计算如下:
seqdist(sequence.obj, method = "CHI2", full.matrix = FALSE, step = 5)
1
2 1.581139
其中step = 5可确保将卡方距离计算为跨越五个状态的单个周期。
问题在于,如果手动应用公式,则此值(1.581139)似乎与给定的值不匹配,即1。工作如下图所示:
Manual calculation from example
要确认最后的数字计算是正确的:
我认为我或者误解了该公式,或者在我使用seqdist()时,距离度量的实现方式有所不同。对于任何人理解差异的帮助,我将深表感谢。
答案 0 :(得分:1)
您的手动计算是正确的。 TraMineR
中有一个错误,该错误是使用计数(即两个序列中每个状态在每个状态中出现的次数)而不是每个状态所花费的时间百分比来计算距离的。
只要所有k个周期都具有相同的长度(尤其是当k = 1时),那么到目前为止,通过计数获得的解与现在通过比例计算出的解成比例。
这意味着距离的排名保持不变。基于CHI2或EUCLIDEAN距离的聚类解决方案也应保持不变。
该错误已在R-Forge上可用的开发版本(内部版本2018-11-15)中修复。几天后将在CRAN上发布更新的版本。