Функция dist в r (статистика) для кластеризации: я должен поместить свою переменную ID в row.names? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть фрейм данных с некоторыми числовыми столбцами и столбцом идентификатора, который является символом.Когда я передаю весь кадр данных в функции dist, он вычисляет матрицу расстояний, но когда я удаляю столбец ID и передаю его функции расстояния, я не получаю тот же результат.
1) Почему это странное поведение?
2) Как следует обрабатывать столбец «ID» при кластеризации в R?я должен опустить столбец идентификатора или поместить их в row.names.

PS Обычно я использую тиблы и инструменты в тидиверсе.

1 Ответ

0 голосов
/ 17 декабря 2018

Не очевидно, что произойдет, когда мы передадим фрейм данных, содержащий переменные фактора / символа, в dist.

Во-первых, если это символ числовых данных, например c("1", "2"),тогда он будет возвращен к числовым данным.В этом случае, если различия между идентификаторами не имеют смысла, вы явно не должны включать эту переменную.

Теперь давайте рассмотрим вопрос, что произойдет, если у нас есть коэффициент символа не такого типа, как указано выше.В исходном коде C мы находим несколько важных строк:

static double R_euclidean(double *x, int nr, int nc, int i1, int i2)
{
    double dev, dist;
    int count, j;

    count= 0;
    dist = 0;
    for(j = 0 ; j < nc ; j++) {
    if(both_non_NA(x[i1], x[i2])) {
        dev = (x[i1] - x[i2]);
        if(!ISNAN(dev)) {
        dist += dev * dev;
        count++;
        }
    }
    i1 += nr;
    i2 += nr;
    }
    if(count == 0) return NA_REAL;
    if(count != nc) dist /= ((double)count/nc);
    return sqrt(dist);
}

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

if(count != nc) dist /= ((double)count/nc);
return sqrt(dist);

, где nc - общее количество столбцов, а count - количество числовых столбцов.Мы можем проверить это:

k <- 20
df <- data.frame(a = sample(letters, k, replace = TRUE), 
                 b = sample(letters, k, replace = TRUE), 
                 c = rnorm(k), d = rnorm(k))

max(abs(as.matrix(dist(df)) * sqrt(2 / ncol(df)) - as.matrix(dist(df[, 3:4]))))
# [1] 7.467696e-09

То есть мы сравнили матрицу расстояний df без масштабирования (умножение на sqrt(2 / ncol(df))) и матрицу расстояний без двух факторных переменных.Кажется, что есть некоторые числовые ошибки, но матрицы в основном одинаковы.

Следовательно, это объясняет, почему результаты отличаются.Если вы собираетесь использовать одну матрицу, скажем, для кластеризации, то оставить коэффициенты / символы, кажется, хорошо, так как масштаб не должен иметь значения.Однако в тех случаях, когда масштаб имеет значение, вы должны сначала удалить столбцы коэффициентов / символов.(Использовать ли вашу переменную ID как имена строк или как отдельный вектор, не имеет значения и зависит от вас.)

...