Проблема с большими данными (?) При вычислении последовательных расстояний с использованием 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 последовательностей. Изучение такой важной выборки должно быть в значительной степени достаточным для выяснения характеристик ваших последовательностей, включая их разнообразие.
Чтобы улучшить репрезентативность, вы даже можете прибегнуть к некоторой стратифицированной выборке (например, по первому или последнему состоянию или по некоторым ковариатам, доступным в вашем наборе данных). Поскольку у вас есть исходный набор данных, вы можете полностью контролировать дизайн случайной выборки.