Анализ последовательности кластеризации CHI2 EUCLID ошибка - PullRequest
1 голос
/ 05 февраля 2020

Я довольно новичок в анализе последовательностей и пытаюсь идентифицировать кластеры в агрегированной матрице последовательностей, ориентируясь на продолжительность состояния. Однако при использовании method = 'CHI2' / 'EUCLID' в сочетании с шагом = 1 (не иначе) я получаю сообщение об ошибке:

Ошибка в if (SCres> currentSCres) {: отсутствует значение где Требуется ИСТИНА / ЛОЖЬ

Есть идеи, почему (в матрице расстояний есть некоторое количество NaN, могут ли они быть результатом последовательностей различной длины)?

Как выглядит объект последовательности и матрица расстояний. Код:

Sequence                                         
1    a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a
2    a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a  
3    a-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-c-c-c
4    a-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e
5    b-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a

Distance matrix
           1         2      3          4
2        NaN                              
3        289.92897   NaN                    
4        141.07472   NaN    263.22855          
5        10.22425    NaN    290.10919  141.44473

Код:

library(TraMineR) #version 2.0-13
library(WeightedCluster) #version 1.4

SO = seqdef(DAT,right='DEL')
DM = seqdist(SO, method = "CHI2", step=1, full.matrix = F)
FIT = seqpropclust(SO, diss=DM, maxcluster=8, 
      properties=c("state", "duration", "spell.age","spell.dur",
        "transition","pattern", "AFtransition", "AFpattern","Complexity"))

1 Ответ

1 голос
/ 07 февраля 2020

Расстояние "CHI2" между двумя последовательностями x и y , вычисленное как TraMineR, является суммой расстояния хи-квадрат между распределениями состояний за последовательные периоды длины step. См. Studer and Ritschard (2014, стр. 8) .

Это означает, что для step=1 расстояние хи-квадрат вычисляется в каждой позиции. Когда одна из последовательностей имеет пустые значения в некоторых позициях (например, последняя позиция в вашей второй последовательности), расстояние не может быть вычислено для этих позиций, и мы получаем значение NaN для расстояния CHI2 между этой последовательностью и любыми другими sequence.

Чтобы избежать этого, вы можете использовать следующие обходные пути:

1) Установите достаточно большое значение step, чтобы каждая последовательность содержала как минимум один элемент void в каждом интервалы Для вашего примера, самые длинные последовательности имеют длину 25. Чтобы быть уверенным, что последний период содержит не пустые элементы, вы должны установить step=5.

DAT <- c("a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a",
         "a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a",  
         "a-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-c-c-c",
         "a-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e-e",
         "b-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a")
SO <- seqdef(DAT)
DM <- seqdist(SO, method = "CHI2", step=5)
DM
##          [,1]     [,2]     [,3]     [,4]     [,5]
## [1,] 0.000000 0.000000 4.543441 4.543441 1.030776
## [2,] 0.000000 0.000000 4.543441 4.543441 1.030776
## [3,] 4.543441 4.543441 0.000000 2.028370 4.604927
## [4,] 4.543441 4.543441 2.028370 0.000000 4.604927
## [5,] 1.030776 1.030776 4.604927 4.604927 0.000000

2) Удалите столбцы с пустыми элементами:

SOdrop <- SO[,1:(ncol(SO)-1)]
SOdrop
DMd <- seqdist(SOdrop, method = "CHI2", step=1)
DMd
##          [,1]     [,2]      [,3]      [,4]     [,5]
## [1,]  0.00000  0.00000 10.041580 10.041580  2.50000
## [2,]  0.00000  0.00000 10.041580 10.041580  2.50000
## [3,] 10.04158 10.04158  0.000000  4.472136 10.34811
## [4,] 10.04158 10.04158  4.472136  0.000000 10.34811
## [5,]  2.50000  2.50000 10.348108 10.348108  0.00000

3) Заполните более короткие последовательности пропусками и рассмотрите пропущенное значение как дополнительное возможное состояние. По умолчанию right='DEL' в seqdef, что создает пустоты. Здесь мы устанавливаем right=NA для получения пропущенных значений.

SOm = seqdef(DAT, right=NA)
DMm = seqdist(SOm, method = "CHI2", step=1, with.missing=TRUE)
DMm
##          [,1]      [,2]      [,3]      [,4]      [,5]
## [1,]  0.000000  2.738613 10.408330 10.408330  2.500000
## [2,]  2.738613  0.000000 10.527741 10.527741  3.708099
## [3,] 10.408330 10.527741  0.000000  5.477226 10.704360
## [4,] 10.408330 10.527741  5.477226  0.000000 10.704360
## [5,]  2.500000  3.708099 10.704360 10.704360  0.000000

Теперь ошибка, о которой сообщается в вопросе, НЕ является ошибкой seqdist, а функцией seqpropclust из WeightedCluster библиотека. Ошибка, очевидно, вызвана NaN в матрице различий.

...