读取上三角距离矩阵并在 R 中生成树状图
Reading an upper triangular distance matrix and generating a dendrogram in R
我的问题(今天)如下:
我在文件 ("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()
此代码有效,并生成以下树状图:
但是,我想在树状图的顶端显示对象的名称(而不是它们的编号)。为此,我尝试了以下代码:
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")
但后来我得到了一个可怕的错误:"Error in if (is.na(n) || n > 65536L) stop("size cannot be NA nor exceed 65536") : missing value where TRUE/FALSE needed".
有人可以帮帮我吗?
我怀疑这与使用矩阵 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()
我的问题(今天)如下:
我在文件 ("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()
此代码有效,并生成以下树状图:
但是,我想在树状图的顶端显示对象的名称(而不是它们的编号)。为此,我尝试了以下代码:
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")
但后来我得到了一个可怕的错误:"Error in if (is.na(n) || n > 65536L) stop("size cannot be NA nor exceed 65536") : missing value where TRUE/FALSE needed".
有人可以帮帮我吗?
我怀疑这与使用矩阵 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()