Проблема с большими данными (?) При вычислении последовательных расстояний с использованием 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 ГБ ОЗУ, которая воспроизводила сообщение об ошибке. Кто-нибудь знает способ справиться с этой ошибкой? Кроме того, анализ для каждой отдельной страны с использованием одного и того же синтаксиса с индексом для страны работал хорошо и дал значимые результаты.

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам