web-dev-qa-db-ja.com

Rで関数呼び出しとして「hclust」を使用する方法

次の方法で、クラスタリングメソッドを関数として構築しようとしました。

mydata <- mtcars

# Here I construct hclust as a function
hclustfunc <- function(x) hclust(as.matrix(x),method="complete")

# Define distance metric
distfunc <- function(x) as.dist((1-cor(t(x)))/2)

# Obtain distance
d <- distfunc(mydata)

# Call that hclust function
fit<-hclustfunc(d)

# Later I'd do
# plot(fit)

しかし、次のエラーが発生する理由:

Error in if (is.na(n) || n > 65536L) stop("size cannot be NA nor exceed 65536") : 
  missing value where TRUE/FALSE needed

それを行う正しい方法は何ですか?

18
neversaint

使用する関数のヘルプを読んでください。 ?hclustは、最初の引数dが非類似度オブジェクトであり、行列ではないことを明確に示しています。

Arguments:

       d: a dissimilarity structure as produced by ‘dist’.

更新

OPが質問を更新したので、必要なのは

hclustfunc <- function(x) hclust(x, method="complete")
distfunc <- function(x) as.dist((1-cor(t(x)))/2)
d <- distfunc(mydata)
fit <- hclustfunc(d)

元の

あなたが欲しいのは

hclustfunc <- function(x, method = "complete", dmeth = "euclidean") {    
    hclust(dist(x, method = dmeth), method = method)
}

その後

fit <- hclustfunc(mydata)

期待どおりに動作します。これで、非類似度係数メソッドをdmethとして、クラスタリングメソッドに渡すことができます。

25
Gavin Simpson