Чтение верхней треугольной матрицы расстояний и генерация дендрограммы в R - PullRequest
0 голосов
/ 21 октября 2019

Моя проблема (сегодня) заключается в следующем:

У меня есть верхняя диагональная матрица расстояний в файле ("dist.dis") в текстовом формате (созданном программой третьей части), который яхочу прочитать в R, чтобы вычислить кластерный анализ и сгенерировать дендрограмму:

   0.36364   0.36364   0.27273   0.81818   0.54545   0.63636   0.36364   0.45455
   0.18182   0.63636   0.63636   0.36364   0.63636   0.54545   0.09091
   0.45455   0.63636   0.18182   0.63636   0.54545   0.27273
   0.81818   0.63636   0.81818   0.27273   0.72727
   0.45455   0.18182   0.63636   0.54545
   0.45455   0.54545   0.27273
   0.81818   0.54545
   0.45455

В отдельном текстовом файле ("dist.nam") у меня также есть список имен объектов, среди которыхрасстояния были вычислены:

COOKO-A
COOKO-B
COOKO-C
COOKO-D
COOKO-E
COOKO-F
COOKO-G
COOKO-H
COOKO-I

Вот мой код R для чтения вышеуказанной матрицы и генерации дендрограммы:

mat <- matrix(0, 9, 9)
mat[row(mat) >= col(mat)] <- scan("dist.dis")
hc <- hclust(as.dist(mat), method="average")
ppi <- 100
png("clus.png", width=6*ppi, height=6*ppi, res=ppi)
plot(as.dendrogram(hc), xlab="Distance", ylab="", main="UPGMA dendrogram", horiz=TRUE, edgePar=list(col="blue", lwd=3))
dev.off()

Этот код работает и генерирует нижеприведенную дендрограмму:

enter image description here

Однако я хочу, чтобы названия объектов (а не их номера) были на кончиках дендрограммы. Чтобы добиться этого, я попробовал код ниже:

names <- scan("dist.nam", what="character")
df.dist <- as.dist(mat)
df.dist <- as.matrix(df.dist, labels=TRUE)
colnames(df.dist) <- names
rownames(df.dist) <- names
hc <- hclust(as.dist(mat), method="average")

Но затем я получил ужасную ошибку: «Ошибка в том, что (is.na (n) || n> 65536L) stop (» размер не может бытьNA не превышает 65536 "): пропущенное значение там, где требуется TRUE / FALSE".

Может ли кто-нибудь помочь мне?

1 Ответ

1 голос
/ 21 октября 2019

Я подозреваю, что это связано с использованием hclust с матрицей, а не с dist объектом.

Я бы изменил имена матрицы mat и затем использовал бы as.dist (обратите внимание, что вам действительно нужно установить colnames, а не строки и столбцы). Дайте мне знать, если это работает для вас.

mat <- matrix(0, 9, 9)
mat[row(mat) >= col(mat)] <- scan("dist.dis")

names <- scan("dist.nam", what="character")

colnames(mat) <- names

df.dist <- as.dist(mat)

hc <- hclust(df.dist, method="average")
ppi <- 100
png("clus.png", width=6*ppi, height=6*ppi, res=ppi)
par(mar=c(4,4,4,4))
plot(as.dendrogram(hc), xlab="Distance", ylab="", main="UPGMA dendrogram", horiz=TRUE, edgePar=list(col="blue", lwd=3))
dev.off()

dendrogram with labels

...