我有一个看起来像这样的距离函数
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'
答案 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
。