函数`dist`在缺少值的向量上表现不正常

时间:2013-08-08 02:53:42

标签: r

编辑:我想,从我在@joran下面的讨论中,@ joran帮助我弄清楚 dist如何改变距离值(它似乎是缩放的总和坐标的平方由值[总尺寸] / [非缺失尺寸],但这只是一个猜测)。如果有人知道的话,我想知道的是:那是真的发生了什么?如果是这样,为什么这被认为是合理的事情呢?是否可以,或者应该有dist选项以我提出的方式计算它(这个问题可能是模糊的或固执的性质来回答)。

我想知道dist函数如何在缺少值的向量上实际运行。下面是一个重新创建的例子。我使用dist函数和我认为应该是欧几里德距离与sqrt,sum和powers的定义的更基本的实现。我还预计,如果任一向量的一个分量为NA,那么该维度将被抛出总和,这就是我实现它的方式。但是您可以看到该定义与dist不一致。

我将使用我的基本实现来处理NA值,但我想知道dist当向量具有NA时它是如何实际到达某个值的,以及为什么它没有'我同意我的计算方法如下。我认为我的基本实现应该是默认/常用的,我无法弄清楚dist使用什么替代方法来获取它所获得的内容。

谢谢, 马特

v1 <- c(1,1,1)
v2 <- c(1,2,3)
v3 <- c(1,NA,3)

# Agree on vectors with non-missing components
# --------------------------------------------
dist(rbind(v1, v2))
#          v1
# v2 2.236068

sqrt(sum((v1 - v2)^2, na.rm=TRUE))
# [1] 2.236068



# But they don't agree when there is a missing component
# Under what logic does sqrt(6) make sense as the answer for dist?
# --------------------------------------------
dist(rbind(v1, v3))
#         v1
# v3 2.44949

sqrt(sum((v1 - v3)^2, na.rm=TRUE))
# [1] 2

1 个答案:

答案 0 :(得分:8)

是的,缩放的发生方式与您描述的完全相同。也许这是一个更好的例子:

set.seed(123)
v1 <- sample(c(1:3, NA), 100, TRUE)
v2 <- sample(c(1:3, NA), 100, TRUE)

dist(rbind(v1, v2))
#          v1
# v2 12.24745

na.idx <- is.na(v1) | is.na(v2) 
v1a  <- v1[!na.idx]
v2a  <- v2[!na.idx]

sqrt(sum((v1a - v2a)^2) * length(v1) / length(v1a))
# [1] 12.24745

缩放对我来说很有意义。在所有条件相同的情况下,距离随着尺寸数量的增加而增加。如果您的某个维度为NA维度为i,则对维度i的贡献的合理猜测是所有其他维度的平均贡献。因此线性放大。

虽然您建议在为NA找到i时,该维度不应对平方和作出贡献。这就像假设v1[i] == v2[i]完全不同。

总结dist正在进行某种类型的最大似然估计,而您的建议更像是最差(或最佳)的情况。