Кластерный анализ в R с отсутствующими данными

Поэтому я потратил много времени, пытаясь найти ответ, как это сделать. Единственный ответ, который я нашел до сих пор, здесь: как выполнить кластеризацию, не удаляя строки, где NA присутствует в R

К сожалению, это не работает для меня.

Итак, вот пример моих данных (d в этом примере):

Q9Y6X2           NA -6.350055943 -5.78314068
Q9Y6X3           NA           NA -5.78314068
Q9Y6X6  0.831273549  4.875151493  0.78671493
Q9Y6Y8  4.831273549  0.457298979  5.59406985
Q9Y6Z4  4.831273549  4.875151493          NA

Вот что я попробовал:

> dist <- daisy(d,metric = "gower")
> hc <- hclust(dist)
Error in hclust(dist) : NA/NaN/Inf in foreign function call (arg 11)

Насколько я понимаю, маргаритка должна иметь возможность обрабатывать значения NA, но я все еще получаю сообщение об ошибке при попытке кластеризовать мои результаты.

Благодарю.

4 ответа

Решение

Если вы посмотрите на матрицу dist, вы увидите, что присутствует NA, потому что образцы Q9Y6X3 и Q9Y6Z4 не перекрываются. Это приводит к NA в вашей матрице dist, что не нравится hclust. Вы могли бы потенциально заставить NA иметь значение 0 или что-то в этом роде, но я не уверен, что это не оставит статистический уклон.

Модели смесей допускают кластеризацию набора данных с отсутствующими значениями, предполагая, что значения полностью отсутствуют случайным образом (MCAR). Более того, информационные критерии (например, BIC или ICL) позволяют выбрать количество кластеров. Вы можете использовать R-пакет VarSelLCM для кластеризации этих данных (есть приложение Shiny для интерпретации результатов). Учебник этого пакета доступен здесь

Во втором ответе на следующий пост: Как выполнить кластеризацию, не удаляя строки, в которых NA присутствует в R, сообщалось о такой ошибке в функции "daisy". Ранее функция была закодирована:

if (any(ina <- is.na(type3))) 
stop(gettextf("invalid type %s for column numbers %s", 
    type2[ina], pColl(which(is.na))))

Предполагаемое сообщение об ошибке не было напечатано, поскольку (is.na) был неправильно использован вместо которого (ina).

Автор этой функции, содержащейся в пакете "cluster", признал проблему и исправил код еще в июне 2015 года. http://svn.r-project.org/R-packages/trunk/cluster/R/daisy.q

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

Если у вас очень мало пропусков (скажем, <1%), вы можете выполнить простое вменение по среднему или медианному значению доступных значений или случайное вменение (например, выборка случайным образом среди доступных значений). Если вы обнаружите переменные с большим количеством пропущенных значений, но гистограммы теперь показывают разницу, то ваши данные полностью отсутствуют случайным образом, поэтому случайное вменение также подойдет.

В большинстве случаев пропуски зависят от других переменных в вашем наборе данных или даже от ненаблюдаемой информации. В этом случае обычно лучше всего использовать множественное вменение. Очень хорошая книга об этом: https://stefvanbuuren.name/fimd/ Это от автора пакета mice . Существуют и другие отличные пакеты вменения, например, missRanger использует быструю реализацию случайного леса для вменения (например, оценки) пропущенных значений.

В любом случае вам следует протестировать различные подходы (и повторять недетерминированные) на предмет их влияния на результат кластеризации. FeatureImpCluster (автор - я) предоставляет глобальную меру важности для каждой переменной. Если переменная, независимо от результата вменения, неактуальна, возможно, вам не придется беспокоиться о методе вменения, который вы используете.

Наконец, специально для пропущенных значений в кластеризации k-средних я написал пакет ClustImpute , он не требует, чтобы вы заранее вменяли NA.

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