Слишком много уникальных последовательностей - PullRequest
1 голос
/ 14 июля 2020

У меня есть большой набор данных с более чем 2 миллионами последовательностей, включая около 180 000 уникальных. Я использую команду seqdist для измерения расстояний, и в конечном итоге я также попытаюсь идентифицировать кластеры последовательностей. Ниже приведено сообщение об ошибке, которое я получаю:

Код и сообщение об ошибке

Есть ли способ установить другое максимальное количество последовательностей или какой-либо другой обходной путь? Заранее большое спасибо!

1 Ответ

0 голосов
/ 22 июля 2020

Пределы размера для матрицы расстояний вытекают из максимально допустимого значения индекса. Это значение зависит от машины.

Для огромного количества n данных решение состоит в том, чтобы выбрать случайное репрезентативное подмножество последовательностей, вычислить различия для этого подмножества и сгруппировать подмножество.

Если членство в кластере необходимо для каждой отдельной последовательности, вы можете идентифицировать медоид каждого из кластеров, полученных из подмножества, а затем назначить каждую отдельную последовательность ближайшему медоиду. Для кластеров k это требует вычисления n x k расстояний вместо полной попарной матрицы.

Я проиллюстрировал ниже, используя biofam данные, поставляемые с TraMineR.

Обратите внимание, что до версии 2.2-0.1 TraMineR проверял размер попарной матрицы расстояний, даже когда использовалось refseq. Это было исправлено в разрабатываемой версии, доступной по адресу https://r-forge.r-project.org/R/?group_id=743.

library(TraMineR)
data(biofam)
b.seq <- seqdef(biofam[, 10:25])

## compute pairwise distances on a random subset
spl <- sample(nrow(b.seq),400)
bs.seq <- b.seq[spl,]
d.lcs <- seqdist(bs.seq, method="LCS", full.matrix=FALSE)

## cluster the random subset
bs.hclust <- hclust(as.dist(d.lcs), method="ward.D")
#plot(bs.hclust, labels=FALSE)
cl <- cutree(bs.hclust,k=4)

## plot clusters for random subset
seqdplot(bs.seq, group=cl, border=NA)

## Medoids of the clusters
c.cl <- disscenter(d.lcs, group=cl, medoids="first")
seqiplot(bs.seq[c.cl,]) # plot of the medoids

## distances to each medoids
dc <- matrix(0,nrow=nrow(b.seq),ncol=length(c.cl))
for (i in 1:length(c.cl)) {
  dc[,i] <- seqdist(b.seq,method="LCS",refseq=spl[c.cl[i]])
}

## cluster membership for the full sequence dataset
##  is for each row the column with the smallest distance
cl.all <- max.col(-dc) 

## now we can plot clusters for the whole dataset
seqdplot(b.seq, group=cl.all, border=NA)
...