2011-01-24 27 views
5

Tôi tự hỏi những gì người khác đang làm với K-means cluster order. Tôi đang tạo bản đồ nhiệt (chủ yếu là số liệu ChIP-Seq) và nhận được các số liệu đẹp mắt với chức năng heatmap tùy chỉnh (dựa trên chức năng bản đồ nhiệt tích hợp của R). Tuy nhiên, tôi muốn có hai cải tiến. Thứ nhất là sắp xếp các cụm của tôi dựa trên giá trị trung bình giảm. Ví dụ: mã sau:Kmeans inter and inter cluster order

fit = kmeans(data, 8, iter.max=50, nstart=10) 
d = data.frame(data, symbol) 
d = data.frame(d, fit$cluster) 
d = d[order(d$fit.cluster),] 

cho tôi một data.frame đặt hàng trên cột cụm. Cách tốt nhất để đặt hàng các hàng như vậy mà 8 cụm là theo thứ tự của phương tiện tương ứng của họ là gì?

Thứ hai, bạn có đề xuất sắp xếp các hàng WITHIN mỗi cụm từ giá trị trung bình cao nhất đến thấp nhất không? Điều này sẽ áp đặt một cái nhìn có tổ chức hơn vào dữ liệu, nhưng có thể đánh lừa một người quan sát không thận trọng để suy ra một cái gì đó mà ông có lẽ không nên. Nếu bạn đề nghị điều này, làm thế nào bạn sẽ làm điều đó một cách hiệu quả nhất?

+0

phương tiện gì? Một trong các biến được sử dụng để phân cụm hoặc một biến khác? –

+0

Phương tiện của các giá trị trong mỗi cụm. Ví dụ, nếu mỗi cluster là 30 hàng trong một data.frame và data.frame có 10 cột mà trên đó k-means clustering được thực hiện, tôi muốn giá trị trung bình của 300 giá trị trong mỗi cluster. Cũng có thể sử dụng centroid. –

+0

Trọng tâm không phải là một số cho mỗi cụm, nó là một điểm trong không gian 10-d và do đó mỗi trung tâm cụm có 10 tọa độ. –

Trả lời

4

Không phải là câu trả lời chính xác cho những gì bạn yêu cầu, nhưng có lẽ bạn có thể xem xét tính thanh khoản thay vì nhóm k-means. Nó giống như sự phối hợp hơn là phân cụm, nhưng một kết quả cuối cùng là một bản đồ nhiệt của dữ liệu được dàn âm thanh giống như những gì bạn có vẻ đang làm với k-means, theo sau là một bản đồ nhiệt đặt hàng cụ thể.

Có một gói R cho seriation, gọi seriation và nó có một số họa tiết, mà bạn có thể nhận được directly from CRAN

tôi sẽ trả lời chi tiết cụ thể của Q sau khi đã nấu chín lên một ví dụ để thử.

Ok - câu trả lời đúng theo sau từ nhận xét của bạn ở trên. Đầu tiên một số dữ liệu giả - 3 cụm 10 mẫu mỗi, trên mỗi 3 biến.

set.seed(1) 
dat <- data.frame(A = c(rnorm(10, 2), rnorm(10, -2), rnorm(10, -2)), 
        B = c(rnorm(10, 0), rnorm(10, 5), rnorm(10, -2)), 
        C = c(rnorm(10, 0), rnorm(10, 0), rnorm(10, -10))) 

## randomise the rows 
dat <- dat[sample(nrow(dat)),] 
clus <- kmeans(scale(dat, scale = FALSE), centers = 3, iter.max = 50, 
       nstart = 10) 

## means of n points in each cluster 
mns <- sapply(split(dat, clus$cluster), function(x) mean(unlist(x))) 

## order the data by cluster with clusters ordered by `mns`, low to high 
dat2 <- do.call("rbind", split(dat, clus$cluster)[order(mns)]) 

## heatmaps 
## original first, then reordered: 
layout(matrix(1:2, ncol = 2)) 
image(1:3, 1:30, t(data.matrix(dat)), ylab = "Observations", 
     xlab = "Variables", xaxt = "n", main = "Original") 
axis(1, at = 1:3) 
image(1:3, 1:30, t(data.matrix(dat2)), ylab = "Observations", 
     xlab = "Variables", xaxt = "n", main = "Reordered") 
axis(1, at = 1:3) 
layout(1) 

yielding:

Original and reordered heatmaps

+0

Tuyệt vời! Tôi muốn thử và đảm bảo rằng tôi không gặp phải bất kỳ vấn đề nào trước khi tôi chấp nhận. Cảm ơn rất nhiều vì đã quay lại! –

+0

Không có probs @Ron đăng một bình luận hoặc chỉnh sửa Câu hỏi của bạn và tôi sẽ thấy nó như tôi đã yêu thích-d Q –

+1

Tôi vừa có ai đó đến với tôi cố gắng để làm điều này, nhưng không nhận được kết quả họ mong đợi. Tôi nghĩ rằng chúng ta có thể cần một thứ tự (xếp hạng ('thay vì' thứ tự (thứ tự. Ví dụ nếu chúng ta có 'mns <- c (0,18, 0,19, -0,27, 0,24, 0,32, -0,05) 'chúng ta' d muốn nhóm thứ ba được liệt kê đầu tiên, và nhóm thứ 5 được liệt kê cuối cùng, nếu chúng ta có 'clus <- 1: 6' thì' clus [order (order (mns) [clus])] 'cho phần tử thứ 2 cuối cùng, nhưng 'clus [thứ tự (thứ hạng (mns) [clus])]' cho chính xác phần tử thứ 5. Chúng ta muốn sắp xếp dữ liệu theo thứ hạng trung bình cụm. Tôi biết đó là câu trả lời cũ, nhưng mọi người vẫn nhìn –