5

Tôi đang phân cụm theo cấp bậc với gói R có tên pvclust, được xây dựng trên hclust bằng cách kết hợp bootstrapping để tính mức ý nghĩa cho các cụm thu được.Lỗi với phân cụm theo cấp bậc đa dạng trong R

Hãy xem xét các dữ liệu sau thiết lập với 3 kích thước và 10 quan sát:

mat <- as.matrix(data.frame("A"=c(9000,2,238),"B"=c(10000,6,224),"C"=c(1001,3,259), 
         "D"=c(9580,94,51),"E"=c(9328,5,248),"F"=c(10000,100,50), 
         "G"=c(1020,2,240),"H"=c(1012,3,260),"I"=c(1012,3,260), 
         "J"=c(984,98,49))) 

Khi tôi sử dụng hclust một mình, clustering chạy tốt cho cả hai biện pháp Euclide và các biện pháp tương quan:

# euclidean-based distance 
dist1 <- dist(t(mat),method="euclidean") 
mat.cl1 <- hclust(dist1,method="average") 

# correlation-based distance 
dist2 <- as.dist(1 - cor(mat)) 
mat.cl2 <- hclust(dist2, method="average") 

Tuy nhiên, khi sử dụng từng thiết lập với pvclust, như sau:

library(pvclust) 

# euclidean-based distance 
mat.pcl1 <- pvclust(mat, method.hclust="average", method.dist="euclidean", nboot=1000) 

# correlation-based distance 
mat.pcl2 <- pvclust(mat, method.hclust="average", method.dist="correlation", nboot=1000) 

... tôi nhận được các lỗi sau đây:

  • Euclide: Error in hclust(distance, method = method.hclust) : must have n >= 2 objects to cluster
  • Tương quan: Error in cor(x, method = "pearson", use = use.cor) : supply both 'x' and 'y' or a matrix-like 'x'.

Lưu ý rằng khoảng cách được tính bằng pvclust do đó không cần tính toán khoảng cách trước. Cũng lưu ý rằng phương thức hclust (trung bình, trung bình, v.v.) không ảnh hưởng đến vấn đề.

Khi tôi tăng thứ nguyên của tập dữ liệu thành 4, pvclust hiện hoạt động tốt. Tại sao tôi nhận được các lỗi này cho pvclust ở 3 kích thước và dưới đây nhưng không phải cho hclust? Hơn nữa, tại sao các lỗi biến mất khi tôi sử dụng một bộ dữ liệu ở trên 4 thứ nguyên?

Trả lời

2

Vào cuối chức năng pvclust chúng ta thấy một dòng

mboot <- lapply(r, boot.hclust, data = data, object.hclust = data.hclust, 
    nboot = nboot, method.dist = method.dist, use.cor = use.cor, 
    method.hclust = method.hclust, store = store, weight = weight) 

sau đó đào sâu hơn, chúng ta thấy

getAnywhere("boot.hclust") 
function (r, data, object.hclust, method.dist, use.cor, method.hclust, 
    nboot, store, weight = F) 
{ 
    n <- nrow(data) 
    size <- round(n * r, digits = 0) 
    .... 
      smpl <- sample(1:n, size, replace = TRUE) 
      suppressWarnings(distance <- dist.pvclust(data[smpl, 
       ], method = method.dist, use.cor = use.cor)) 
    .... 
} 

cũng lưu ý rằng giá trị mặc định của tham số r cho chức năng pvclustr=seq(.5,1.4,by=.1). Vâng, thực sự như chúng ta có thể thấy giá trị này đã được thay đổi ở đâu đó:

Bootstrap (r = 0.33)... 

vì vậy những gì chúng tôi nhận được là size <- round(3 * 0.33, digits =0) đó là 1, cuối cùng data[smpl,] chỉ có 1 hàng, đó là ít hơn 2. Sau khi sửa r nó trả về một số lỗi có thể vô hại và đầu ra cũng được cung cấp:

mat.pcl1 <- pvclust(mat, method.hclust="average", method.dist="euclidean", 
        nboot=1000, r=seq(0.7,1.4,by=.1)) 
Bootstrap (r = 0.67)... Done. 
.... 
Bootstrap (r = 1.33)... Done. 
Warning message: 
In a$p[] <- c(1, bp[r == 1]) : 
    number of items to replace is not a multiple of replacement length 

Hãy cho tôi biết nếu kết quả đạt yêu cầu.

+0

Thật tuyệt vời. Thay đổi 'r' làm thủ thuật. cảm ơn. – oisyutat