Проблема с большими данными (?) При вычислении последовательностей расстояний с помощью TraMineR

Я пытаюсь выполнить анализ оптимального соответствия с помощью TraMineR, но мне кажется, что у меня проблема с размером набора данных. У меня есть большой набор данных по европейским странам, в котором есть периоды трудоустройства. У меня более 57 000 последовательностей, длина которых составляет 48 единиц и которые состоят из 9 различных состояний. Чтобы получить представление об анализе, вот заголовок объекта последовательности employdat.sts:

[1] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-...  
[2] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-...  
[3] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-...  
[4] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-...  
[5] EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-EF-...  
[6] ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-ST-...  

В более коротком формате SPS это читается следующим образом:

Sequence               
[1] "(EF,48)"              
[2] "(EF,48)"              
[3] "(ST,48)"              
[4] "(ST,36)-(MS,3)-(EF,9)"
[5] "(EF,48)"              
[6] "(ST,24)-(EF,24)"

После передачи этого объекта последовательности в функцию seqdist() я получаю следующее сообщение об ошибке:

employdat.om <- seqdist(employdat.sts, method="OM", sm="CONSTANT", indel=4)    
[>] creating 9x9 substitution-cost matrix using 2 as constant value  
[>] 57160 sequences with 9 distinct events/states  
[>] 12626 distinct sequences  
[>] min/max sequence length: 48/48  
[>] computing distances using OM metric  
Error in .Call(TMR_cstringdistance, as.integer(dseq), as.integer(dim(dseq)),  : negative length vectors are not allowed

Связана ли эта ошибка с огромным количеством отдельных длинных последовательностей? Я использую x64-машину с 4 ГБ ОЗУ, и я также пробовал его на машине с 8 ГБ ОЗУ, на которой было воспроизведено сообщение об ошибке. Кто-нибудь знает, как решить эту ошибку? Кроме того, анализ для каждой отдельной страны с использованием одного и того же синтаксиса с индексом для страны работал хорошо и дал значимые результаты.


person non-numeric_argument    schedule 10.04.2013    source источник
comment
пожалуйста, покажите свой код   -  person sashkello    schedule 10.04.2013


Ответы (2)


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

  • используйте аргумент "full.matrix=FALSE" в seqdist (см. страницу справки). Он вычислит только нижнюю треугольную матрицу и вернет объект "dist", который можно использовать непосредственно в функции hclust.
  • Вы можете агрегировать идентичные последовательности (у вас есть только 12626 различных последовательностей вместо 57160 последовательностей), вычислять расстояния, кластеризовать последовательности с использованием весов (которые вычисляются в соответствии с количеством раз, когда каждая отдельная последовательность появляется в наборе данных), а затем добавлять кластеризацию вернуться к исходному набору данных. Это легко сделать с помощью библиотеки WeightedCluster. Первое приложение к Руководству по WeightedCluster предоставляет пошаговое руководство для этого (процедура также описана на веб-странице http://mephisto.unige.ch/weightedcluster).

Надеюсь это поможет.

person Matthias Studer    schedule 10.04.2013
comment
К сожалению, аргумент full.matrix = FALSE не решает проблему. Но я попробую метод взвешенного кластера, это действительно кажется очень многообещающим подходом, поскольку он уменьшает количество строк и столбцов более чем в 4 раза. - person non-numeric_argument; 10.04.2013
comment
Для моего набора данных сработала функция агрегирования и взвешивания пакета WeightedCluster. Описание в приложении к руководству действительно очень полезно. Спасибо! - person non-numeric_argument; 10.04.2013

Простое решение, которое часто хорошо работает, - это анализировать только выборку ваших данных. Например

employdat.sts <- employdat.sts[sample(nrow(employdat.sts),5000),]

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

Чтобы повысить репрезентативность, вы даже можете прибегнуть к некоторой стратифицированной выборке (например, по первому или последнему состоянию или по некоторым ковариатам, доступным в вашем наборе данных). Поскольку у вас есть исходный набор данных, вы можете полностью контролировать план случайной выборки.


Обновлять

Если целью является кластеризация и вам необходимо членство в кластере для каждой отдельной последовательности, см. https://stackoverflow.com/a/63037549/1586731 < / а>

person Gilbert    schedule 10.04.2013