Кластеризация с значениями NA в R

Я был удивлен, узнав, что clara из library(cluster) допускает NA. Но функциональная документация ничего не говорит о том, как она обрабатывает эти значения.

Итак, мои вопросы:

  • Как clara обрабатывает NA?
  • Можно ли это как-то использовать для kmeans (не разрешено)?

[Обновить] Итак, я нашел строки кода в clara:

inax <- is.na(x)
valmisdat <- 1.1 * max(abs(range(x, na.rm = TRUE)))
x[inax] <- valmisdat

которые заменяют отсутствие значения на valmisdat. Не уверен, что я понимаю причину использования такой формулы. Есть идеи? Было бы более "естественным" рассматривать НС по каждому столбцу отдельно, возможно, заменяя средним/медианным?

Ответ 1

Хотя явным образом не указано, я считаю, что NA обрабатываются способом, описанным на странице справки ?daisy. В разделе "Сведения":

В алгоритме маргаритки отсутствующие значения в строке x не включаются в различия с этой строкой.

Учитывая внутренне тот же код будет использоваться clara(), как я понимаю, что NA в данных может обрабатываться - они просто не участвуют в вычислении. Это достаточно стандартный способ продолжения в таких случаях и, например, используется в определении обобщенного коэффициента подобия Гаувера.

Обновление Источники C для clara.c ясно указывают, что это (выше), как NA обрабатывается clara() (строки 350-356 в ./src/clara.c):

    if (has_NA && jtmd[j] < 0) { /* x[,j] has some Missing (NA) */
        /* in the following line (Fortran!), x[-2] ==> seg.fault
           {BDR to R-core, Sat, 3 Aug 2002} */
        if (x[lj] == valmd[j] || x[kj] == valmd[j]) {
        continue /* next j */;
        }
    }

Ответ 2

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

В kmeans есть два шага;

  • вычисление расстояния между наблюдением и исходным средним кластером.
  • обновление нового значения кластера на основе недавно вычисленных расстояний.

Когда у нас отсутствуют данные в наших наблюдениях: Шаг 1 можно обработать, отрегулировав метрику расстояния соответствующим образом, как в пакете clara/pam/daisy. Но шаг 2 может быть выполнен только в том случае, если у нас есть какое-то значение для каждого столбца наблюдения. Поэтому вменение может быть следующим лучшим вариантом для kmeans для обработки отсутствующих данных.

Ответ 3

Посмотрев на код Clara c, я заметил, что в алгоритме clara, когда в наблюдениях отсутствуют значения, сумма квадратов "уменьшается" пропорционально числу отсутствующих значений, что, я думаю, неверно! строка 646 clara.c похожа на "dsum * = (nobs/pp)", которая показывает, что подсчитывает количество не пропущенных значений в каждом пара наблюдений (nobs), делит ее на число переменных (pp) и умножает на сумму квадратов. Я думаю, это должно быть сделано иначе, то есть "dsum * = (pp/nobs)".