Не очевидно, что произойдет, когда мы передадим фрейм данных, содержащий переменные фактора / символа, в 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 как имена строк или как отдельный вектор, не имеет значения и зависит от вас.)