2012-01-19 65 views
3

我正在使用R來執行分層聚類。作爲第一個方法,我使用hclust和執行的以下步驟:將pvclust R函數應用於預先計算的遠程對象

  1. 我導入的距離矩陣
  2. 我用as.dist功能在dist對象以轉換它
  3. 我的dist對象
  4. 上運行 hclust

這裏將R代碼:

distm <- read.csv("distMatrix.csv") 
d <- as.dist(distm) 
hclust(d, "ward") 

在這一點上我想做一些類似的功能pvclust;然而,我不能,因爲不可能通過預先計算的dist對象。考慮到我使用R的dist函數提供的距離中沒有的距離,我該如何繼續?

回答

1

我不清楚你是隻有距離矩陣,還是事先計算好它。在前一種情況下,正如@Vincent所建議的那樣,調整pvclust本身的R代碼不會太困難(使用fix()或其他;我在another question on CrossValidated上提供了一些提示)。在後一種情況下,作者pvclust提供example關於如何使用自定義距離功能,但這意味着您將不得不安裝他們的「非官方版本」。

+0

我見過非官方的版本,但是我寧願避免使用它。在發佈到stackoverflow後,我聯繫了pvclust函數的作者。這是他的答案:由於pvclust使用基於bootstrap的算法,原則上不可能使用預先計算的對象。我很抱歉,我無法幫助。 – rlar

2

如果數據集不是太大,可以將n個點嵌入維度爲n-1的空間中,並使用相同的距離矩陣。

# Sample distance matrix 
n <- 100 
k <- 1000 
d <- dist(matrix(rnorm(k*n), nc=k), method="manhattan") 

# Recover some coordinates that give the same distance matrix 
x <- cmdscale(d, n-1) 
stopifnot(sum(abs(dist(x) - d)) < 1e-6) 

# You can then indifferently use x or d 
r1 <- hclust(d) 
r2 <- hclust(dist(x)) # identical to r1 
library(pvclust) 
r3 <- pvclust(x) 

如果數據集很大,則可能需要檢查pvclust的實現方式。

+0

回想起來(即,在已回答我自己),我相信真的OP想要將距離矩陣傳遞給'pvclust',而'pvclust'需要一個data.frame或matrix對象。 – chl

+0

小心:pvclust()簇列,而不是行,因此,好的代碼是pvclust(t(x)),而不是pvclust(x) –

3

我測試過文森特的建議,你可以做以下的(我的數據集是相似矩陣):

# Import you data 
distm <- read.csv("distMatrix.csv") 
d <- as.dist(distm) 

# Compute the eigenvalues 
x <- cmdscale(d,1,eig=T) 

# Plot the eigenvalues and choose the correct number of dimensions (eigenvalues close to 0) 
plot(x$eig, 
    type="h", lwd=5, las=1, 
    xlab="Number of dimensions", 
    ylab="Eigenvalues") 

# Recover the coordinates that give the same distance matrix with the correct number of dimensions  
x <- cmdscale(d,nb_dimensions) 

# As mentioned by Stéphane, pvclust() clusters columns 
pvclust(t(x)) 
相關問題