5

R に 24 行 10,000 列の数値行列があります。この行列の行名は基本的に、24 行のそれぞれに対応するデータを読み取ったファイル名です。これとは別に、24 個のファイルが属するグループを指定して、24 個の全体を含む別の因子リストがあります。アルコール、炭化水素、エステルの 3 つのグループがあります。名前と、それらが属する対応するグループは次のようになります。

> MS.mz
[1] "int-354.19" "int-361.35" "int-368.35" "int-396.38" "int-408.41" "int-410.43" "int-422.43"
[8] "int-424.42" "int-436.44" "int-438.46" "int-452.00" "int-480.48" "int-648.64" "int-312.14"
[15] "int-676.68" "int-690.62" "int-704.75" "int-312.29" "int-326.09" "int-326.18" "int-326.31"
[22] "int-340.21" "int-340.32" "int-352.35"

> MS.groups
[1] Alcohol     Alcohol     Alcohol     Alcohol     Hydrocarbon Alcohol     Hydrocarbon Alcohol    
[9] Hydrocarbon Alcohol     Alcohol     Alcohol     Ester       Alcohol     Ester       Ester      
[17] Ester       Alcohol     Alcohol     Alcohol     Alcohol     Alcohol     Alcohol     Hydrocarbon
Levels: Alcohol Ester Hydrocarbon

樹状図を生成して、マトリックス内のデータをどのようにクラスター化できるかを調べたいと思いました。したがって、次のコマンドを使用しました。

require(vegan)
dist.mat<-vegdist(MS.data.scaled.transposed,method="euclidean")
clust.res<-hclust(dist.mat)
plot(clust.res)

そして私は樹状図を得ました。ここで、樹状図のファイル名を、それらが属するグループ、つまりアルコール、炭化水素、またはエステルに応じて色付けしたいと考えています。フォーラムに投稿されたさまざまな例を見ました

rのラベルと色の葉樹状図

ape パッケージを使用した R の葉の樹状図のラベル付けと色付け

ブートストラップによるクラスタリング

、しかし私のデータには実装できませんでした。樹形図で色付きの名前を取得するために、row.names を MS.groups と関連付ける方法がわかりません。

( https://nycdatascience.com/wp-content/uploads/2013/09/dendextend-tutorial.pdfで説明されているように) dendextend を使用してツリーを生成すると、次のツリーが得られます。

ここに画像の説明を入力

これを生成するために使用されるコードは次のとおりです。

require(colorspace)
d_SIMS <- dist(firstpointsample5[,-1])
hc_SIMS <- hclust(d_SIMS)
labels(hc_SIMS)
dend_SIMS <- as.dendrogram(hc_SIMS)
SIMS_groups <- rev(levels(firstpointsample5[, 1]))
dend_SIMS <- color_branches(dend_SIMS, k = 3, groupLabels = SIMS_groups)
is.character(labels(dend_SIMS)) 
plot(dend_SIMS)
labels_colors(dend_SIMS) <- rainbow_hcl(3)[sort_levels_values(as.numeric(firstpointsample5[,1])[order.dendrogram(dend_SIMS)])]
labels(dend_SIMS) <- paste(as.character(firstpointsample5[, 1])[order.dendrogram(dend_SIMS)],"(", labels(dend_SIMS), ")", sep = "")
dend_SIMS <- hang.dendrogram(dend_SIMS, hang_height = 0.1)
dend_SIMS <- assign_values_to_leaves_nodePar(dend_SIMS, 0.5,"lab.cex")
par(mar = c(3, 3, 3, 7))
plot(dend_SIMS, main = "Clustered SIMS dataset\n (the labels give the true m/z groups)",horiz = TRUE, nodePar = list(cex = 0.007))
legend("topleft", legend = SIMS_groups, fill = rainbow_hcl(3))
4

3 に答える 3

10

あなたが探している関数は、またはのいずれかであると思われcolor_labelsますget_leaves_branches_col。最初のラベルの色に基づいてcutree( color_branchesdo のように)、2 番目の色では各葉の枝の色を取得し、それを使用して木のラベルに色を付けることができます (枝の色付けに通常とは異なる方法を使用する場合 (を使用した場合に発生しbranches_attr_by_labelsます。例:

# define dendrogram object to play with:
hc <- hclust(dist(USArrests[1:5,]), "ave")
dend <- as.dendrogram(hc)

library(dendextend)
par(mfrow = c(1,2), mar = c(5,2,1,0))
dend <- dend %>%
         color_branches(k = 3) %>%
         set("branches_lwd", c(2,1,2)) %>%
         set("branches_lty", c(1,2,1))

plot(dend)

dend <- color_labels(dend, k = 3)
# The same as:
# labels_colors(dend)  <- get_leaves_branches_col(dend)
plot(dend)

ここに画像の説明を入力

いずれにせよ、樹形図に何ができるかについてのアイデアを得るために、常にset関数を確認する必要があります (これにより、さまざまな関数名をすべて覚える手間が省けます)。

于 2015-07-11T16:36:26.963 に答える
1

この解決策を試すことができます。「MS.groups」で「labs」を変更し、「MS.groups」を数値に変換して(おそらくas.numericで)「var」のみを変更してください。これは、R で追加の因子変数によってデンドログラムのラベルに色を付ける方法から来ています。

## The data
df <- structure(list(labs = c("a1", "a2", "a3", "a4", "a5", "a6", "a7", 
"a8", "b1", "b2", "b3", "b4", "b5", "b6", "b7"), var = c(1L, 1L, 2L,     
1L,2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L), td = c(13.1, 14.5, 16.7, 
12.9, 14.9, 15.6, 13.4, 15.3, 12.8, 14.5, 14.7, 13.1, 14.9, 15.6, 14.6), 
fd = c(2L, 3L, 3L, 1L, 2L, 3L, 2L, 3L, 2L, 4L, 2L, 1L, 4L, 3L, 3L)), 
.Names = c("labs", "var", "td", "fd"), class = "data.frame", row.names = 
c(NA, -15L))

## Subset for clustering
df.nw = df[,3:4]

# Assign the labs column to a vector
labs = df$labs

d = dist(as.matrix(df.nw))                          # find distance matrix 
hc = hclust(d, method="complete")                   # apply hierarchical clustering 

## plot the dendrogram

plot(hc, hang=-0.01, cex=0.6, labels=labs, xlab="") 

## convert hclust to dendrogram 
hcd = as.dendrogram(hc)                             

## plot using dendrogram object
plot(hcd, cex=0.6)                                  

Var = df$var                                        # factor variable for colours
varCol = gsub("1","red",Var)                        # convert numbers to colours
varCol = gsub("2","blue",varCol)

# colour-code dendrogram branches by a factor 

# ... your code
colLab <- function(n) {
  if(is.leaf(n)) {
    a <- attributes(n)
    attr(n, "label") <- labs[a$label]
    attr(n, "nodePar") <- c(a$nodePar, lab.col = varCol[a$label]) 
  }
  n
}

## Coloured plot
plot(dendrapply(hcd, colLab))
于 2015-07-05T16:27:57.533 に答える