Кластерный анализ в 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.