2016-04-15 3 views
2

У меня есть основной компонент, называемый pca. Я хочу найти центроид, используя все компоненты (центр галактического пространства) и найти расстояние от каждого образца Sample от этого центра. Как я могу это сделать в R?Как определить центроид PCA

pca<-structure(list(Sample = c("1", "2", "4", "5", "6"), PCA.1 = c(0.00338, 
-0.020373, -0.019842, -0.019161, -0.019594), PCA.2 = c(0.00047, 
-0.010116, -0.011532, -0.011582, -0.013245), PCA.3 = c(-0.008787, 
0.001412, 0.003751, 0.00371, 0.004242), PCA.4 = c(0.011242, 0.000882, 
-0.003662, -0.002206, -0.002449), PCA.5 = c(0.055873, -0.022664, 
-0.014058, -0.024757, -0.020033), PCA.6 = c(-0.001511, 0.006226, 
-0.005417, 0.000522, -0.003114), PCA.7 = c(-0.056734, -0.007418, 
-0.01043, -0.006961, -0.006006), PCA.8 = c(0.005189, 0.008031, 
-0.002979, 0.000743, 0.006276), PCA.9 = c(0.008169, -0.000265, 
0.010893, 0.003233, 0.007316)), .Names = c("Sample", "PCA.1", 
"PCA.2", "PCA.3", "PCA.4", "PCA.5", "PCA.6", "PCA.7", "PCA.8", 
"PCA.9"), row.names = c(NA, 5L), class = "data.frame") 
+0

То, что я пробовал, получает эвклидовое расстояние от одной точки до другой, но я не знаю, как мы можем получить центроид, используя все компоненты. – MAPK

ответ

2

Предполагая, что вы ищете Euclidean distance, вы можете найти среднее для каждой переменной и у вас есть центроид. Используя простые математические данные, расстояние между любой точкой и центроидом является квадратным корнем из сумм квадратов различий n-мер (надеюсь, я получил это право, см. Формулу в ссылке, которую я выше).

centroid <- sapply(pca[, -1], mean) 
pt <- pca[, -1] 

sqrt(apply((pt - centroid)^2, MARGIN = 1, sum)) 

     1   2   3   4   5 
0.08777085 0.03572868 0.04321890 0.04162779 0.02065304 
+0

@MAPK проанализируйте пример. 'centroid' вычисляет среднее значение для каждой переменной (' sapply' работает в столбцах). Это точка в n-мерном пространстве. Расстояние до каждой точки имеет размерность 1, поэтому ожидаемый выход должен быть такой же длины, что и строки - 5. –

+0

'(pt-centroid)^2' выглядит не так. Разве это не должно быть (t (pt) - центроид)^2'? Кроме того, 'apply (..., 1, sum)' намного хуже, чем 'rowSums'. – nicola

+0

Спасибо, это правильно, но как вы вычисляете многомерное расстояние? Объединение нескольких центральных точек (объединение центра нескольких компьютеров в одну точку)? – MAPK