难以使用相关公式重现由 Traminer 包(在 R 中)的 seqdist() 函数生成的卡方距离计算

Difficulty reproducing the chi-square distance calculation produced by the seqdist() function of Traminer package (in R) using the associated formula

我一直在以分类状态的有序序列的形式对数据进行一些探索性分析,例如序列 x = A,A,B,D...等

我一直在使用 R 中的 Traminer 包来做这个分析。包中提供的函数之一 (seqdist()) 计算序列对之间的距离(用于聚类)。支持许多距离度量,包括卡方距离,如 Studer & Ritschard (2015 - http://dx.doi.org/10.1111/rssa.12125) 中所述。

我想通过一个简单的例子计算距离'by hand'来验证我对这个距离度量的理解。 Studer & Ritschard (2015) 没有提供公式,但在查询 Traminer 邮件列表 (http://traminer.unige.ch/contrib.shtml), Gilbert Ritschard kindly directed me to an earlier working paper (https://www.lives-nccr.ch/sites/default/files/pdf/publication/33_lives_wp_studer_sequencedissmeasures.pdf - p.8) 后,其中包含此公式并鼓励我将我的问题指向堆栈溢出,以便它被更广泛地看到。

但是,对于一个非常简单的示例,我仍然无法使用提供的公式重现卡方距离度量。使用 R 的可重现示例和距离度量的公式如下,如果有人可以帮助我确定差异的来源(大概我以某种方式误解了公式),我将不胜感激。

给出卡方距离公式如下:

对于集合j中的序列字母表,以及序列x和y,令p_(j|x)等于序列中处于状态j的时间比例x,并令 p_(j) 等于 'overall proportion of time spent in state j',序列 x 和 y 之间的卡方距离,给出为:

Chi-Squared Distance Formula

使用这个公式(不是周期相关的版本),我尝试重现以下示例的距离计算,仅涉及两个短序列:

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

确认最后的数值计算正确:

https://www.wolframalpha.com/input/?i=(((3%2F5)-(5%2F5))%5E2)%2F(8%2F10)+%2B+(((2%2F5)-(0%2F5))%5E2)%2F(2%2F10)

我想我要么误解了公式,要么距离度量在我使用的 seqdist() 中以不同方式实现。我将非常感谢任何人帮助理解差异。

您的人工计算是正确的。 TraMineR 中存在一个错误,其中距离是使用计数(即每个状态在两个序列中的每一个中出现的次数)而不是每个状态所花费时间的百分比来计算的。

只要所有 k 个周期的长度相同(特别是当 k=1 时),到目前为止用计数获得的解与现在用比例计算的解成正比。

这意味着距离排名保持不变。基于 CHI2 或 EUCLIDEAN 距离的聚类解决方案也应保持不变。

该错误已在 R-Forge 上可用的开发版本(内部版本 2018-11-15)中修复。几天后将在 CRAN 上发布更新版本。