применение функции pvclust R к предварительно вычисленному объекту dist - PullRequest
3 голосов
/ 19 января 2012

Я использую R для выполнения иерархической кластеризации. В качестве первого подхода я использовал hclust и выполнил следующие шаги:

  1. Я импортировал матрицу расстояний
  2. Я использовал функцию as.dist, чтобы преобразовать ее в dist объект
  3. Я запускаю hclust на dist объекте

Вот код R:

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

В этот момент я хотел бы сделать что-то похожее с функцией pvclust; однако я не могу, потому что невозможно передать предварительно вычисленный dist объект. Как я могу продолжить, учитывая, что я использую расстояние, недоступное среди тех, которые предусмотрены функцией dist в R?

Ответы [ 3 ]

3 голосов
/ 26 ноября 2014

Я проверил предложение Винсента, вы можете сделать следующее (мой набор данных представляет собой матрицу различий):

# 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))
2 голосов
/ 19 января 2012

Если набор данных не слишком большой, вы можете встроить свои 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.

1 голос
/ 19 января 2012

Мне не ясно, есть ли у вас только матрица расстояний или вы рассчитали ее заранее.В первом случае, как уже было предложено @Vincent, не составит труда настроить R-код самого pvclust (используя fix() или что-то еще; я дал несколько советов по еще один вопрос по CrossValidated ).В последнем случае авторы pvclust предоставляют пример о том, как использовать пользовательскую функцию расстояния, хотя это означает, что вам придется установить их "неофициальную версию".

...