0

私はこのような距離関数を持っています

sed <- function(x, y){
x <- x / sum(x)
y <- y / sum(y)

x <- x[y > 0]
y <- y[y > 0]
y <- y[x > 0]
x <- x[x > 0]

xy <- x + y
a <- x / xy
b <- y / xy

w <- xy / 2
2 * prod(a^(a*w) * b^(b*w)) - 1

}

次のようなデータがあります。

> head(x)
             x         y
[1,] 0.5836377 0.8120142
[2,] 0.4642154 0.8857223
[3,] 0.8707579 0.4917120
[4,] 0.4688734 0.8832654
[5,] 0.8105051 0.5857316
[6,] 0.6409956 0.7675446

各行は x 座標と y 座標を持つ点です。したがって、sed は行間の距離を計算します。

距離関数を使用してヒートマップをプロットしたいのですが、次のエラーが表示されます。これを修正するにはどうすればよいですか?

> heatmap(as.matrix(x), distfun=as.dist(sed))
Error in as.vector(x, mode) : 
  cannot coerce type 'closure' to vector of type 'any'
4

1 に答える 1

2

引数には、によって返されるdistfunクラスのオブジェクトを返す関数が必要です。関数は、観測値の各ペアの非類似度のセット全体ではなく、2 つのベクトル間の距離を計算します。正しいタイプのオブジェクトを返すことはできません。また、入力データ内の行のすべてのペアを反復処理するために必要なすべての足場がなければ、返すこともできません。"dist"dist()

CRAN で利用可能なプロキシ パッケージを介してヘルプが手元にあるため、心配する必要はありません。これにより、作成したのとまったく同じ種類の関数を提供でき、非類似度行列を生成するために必要なすべての足場が提供されます。

関数を怒りで使用する前に、関数をプロキシに登録する必要があります。

## create a new distance measure
mydist <- function(x,y) x * y

## create a new entry in the registry with two aliases
pr_DB$set_entry(FUN = mydist, names = c("mydist"))

関数名に置き換えるだけmydistで、プロキシ データベースに入力するときに任意の名前を付けることができます。この例を続けると、次を使用dist()して非類似度行列を計算します。

dist(X, method = "mydist")

これがニーズに合っているかどうかを確認するには

install.packages("proxy")
require("proxy")

次に、?distと を読みます?pr_DB

于 2012-09-12T15:04:27.040 に答える