В R, как я могу построить матрицу сходства (например, блок-график) после кластеризации данных? - PullRequest
3 голосов
/ 12 апреля 2011

Я хочу создать график, который показывает корреляцию между кластеризованными данными и матрицей подобия.Как я могу сделать это в R?Есть ли какая-либо функция в R, которая создает график, как изображение в этой ссылке?http://bp0.blogger.com/_VCI4AaOLs-A/SG5H_jm-f8I/AAAAAAAAAJQ/TeLzUEWbb08/s400/Similarity.gif (только что гуглил и получил ссылку, которая показывает график, который я хочу произвести)

Заранее спасибо.

1 Ответ

12 голосов
/ 13 апреля 2011

Общие решения, предложенные в комментариях @Chase и @ bill_080, нуждаются в небольшом улучшении, чтобы (частично) удовлетворить потребности ОП.

Воспроизводимый пример:

require(MASS)
set.seed(1)
dat <- data.frame(mvrnorm(100, mu = c(2,6,3), 
                          Sigma = matrix(c(10,   2,   4,
                                            2,   3, 0.5,
                                            4, 0.5,   2), ncol = 3)))

Вычислить матрицу различий стандартизированных данных с использованием эйсильдовских расстояний

dij <- dist(scale(dat, center = TRUE, scale = TRUE))

, а затем рассчитать иерархическую кластеризацию этих данных с использованием метода среднего по группе

clust <- hclust(dij, method = "average")

Далее мы вычисляем порядок отсчетов на основе формирования 3 ('k') групп из дендрограммы, но мы могли бы выбрать что-то еще здесь.

ord <- order(cutree(clust, k = 3))

Далее вычисляем различия между образцами на основе дендрограммы, копенетических расстояний:

coph <- cophenetic(clust)

Вот 3 изображения:

  1. Исходная матрица различий, отсортированная по группам кластерного анализа,
  2. Копенетические расстояния, снова отсортированные как выше
  3. Разница между исходными различиями и копенетическими расстояниями
  4. Шепардоподобный график, сравнивающий исходные и копенетические расстояния; чем лучше кластеризация при захвате исходных расстояний, тем ближе к линии 1: 1 будут лежать точки

Вот код, который создает вышеприведенные графики

layout(matrix(1:4, ncol = 2))
image(as.matrix(dij)[ord, ord], main = "Original distances")
image(as.matrix(coph)[ord, ord], main = "Cophenetic distances")
image((as.matrix(coph) - as.matrix(dij))[ord, ord], 
      main = "Cophenetic - Original")
plot(coph ~ dij, ylab = "Cophenetic distances", xlab = "Original distances",
     main = "Shepard Plot")
abline(0,1, col = "red")
box()
layout(1)

, который производит это на активном устройстве:

plots of original and cophenetic distances

Сказав все это, однако, только график Шепарда показывает «корреляцию между кластеризованными данными и матрицей сходства», и это не график изображения (уровень графика). Как бы вы предложили вычислить корреляцию между двумя числами для всех парных сравнений копенетического и исходного [dis] сходства?

...