如何在R中实现dist

时间:2012-09-12 14:02:51

标签: r distance heatmap

我有一个看起来像这样的距离函数

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'

1 个答案:

答案 0 :(得分:2)

distfun参数需要一个函数,该函数将返回由"dist"返回的类dist()的对象。您的函数计算两个向量之间的距离,而不是每对观察值的整个不相似度。它不会返回正确类型的对象,也不能在没有所有脚手架的情况下迭代输入数据中的所有行对。

尽管通过代理 package available on 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