1

我一直在使用 R 中的代理包来实现距离度量,该度量通过每个单独点的传播误差来加权欧几里得距离。这样做的公式是

sqrt((x i - x j ) 2 ) + (y i - y j ) 2 ) + ...(n i - n j ) 2 ) ÷ sqrt((σx i 2 + σx j 2 ) + (σy i 2 + σy j 2 ) + ...(σn2 + σn j 2 ))。

我能够让代理在基本意义上为我工作(参见R 中的代理包,无法使其工作)并复制了普通的欧几里德距离功能,对于业余爱好者来说万岁。

然而,一旦我开始编写误差加权距离的函数,我立即遇到了一个难题:我需要将误差与点区分开来,并对其进行明确处理。

我知道 R 具有非常强大的功能,我确信它可以做到这一点,但对于我的生活,我不知道如何做到这一点。看起来代理dist可以处理两个矩阵输入,但是我如何告诉它矩阵 X 是点,矩阵 Y 是错误,然后在最终组合成距离测量之前让每个都转到函数的适当部分?

4

1 回答 1

0

我一直希望直接使用代理,但我也意识到它看起来我不能。我相信我能够想出一个有效的功能。一、距离函数:

DistErrAdj <- function(x,y) {
sing.err <- sqrt((x^2) + (y^2))
sum(sing.err)
}

紧随其后的当然是

library(proxy)
pr_DB$set_entry(FUN=DistErrAdj,names="DistErrAdj")

然后,我从 augix ( http://augix.com/wiki/Make%20trees%20in%20R,%20test%20its%20stability%20by%20bootstrapping.html ) 中获取了已经友好编写的代码,并根据我的需要进行了修改,以机智:

boot.errtree <- function(x, q, B = 1001, tree = "errave") {
library(ape)
library(protoclust)
library(cluster)
library(proxy)
    func <- function(x,y) {
        tr = agnes((dist(x, method = "euclidean")/dist(q, method = "DistErrAdj")), diss = TRUE, method = "average")
        tr = as.phylo(as.hclust(tr))
        return(tr)
    }
    if (tree == "errprot") {
        func <- function(x,y) {
            tr = protoclust((dist(x, method = "euclidean")/dist(q, method = "DistErrAdj")))
            tr = as.phylo(tr)
            return(tr)
        }
    }
    if (tree == "errdiv") {
        func <- function(x,y) {
            tr = diana((dist(x, method = "euclidean")/dist(q, method = "DistErrAdj")), diss=TRUE)
            tr = as.phylo(as.hclust(tr))
            return(tr)
        }
    }
tr_real = func(x)
    plot(tr_real)
    bp <- boot.phylo(tr_real, x, FUN=func, B=B)
    nodelabels(bp)
    return(bp)
}

它似乎工作。

于 2013-07-31T20:41:31.710 回答