首页 > 解决方案 > R中距离矩阵的概率权重

问题描述

正如 Anderberg (1973: 124-5) 所建议的,我正在尝试使用概率权重计算所有名义变量的距离矩阵。Anderberg (1973: 124) 认为,“赋予稀有类别额外权重的愿望经常出现在生物学文献中,尽管没有提供分配此类权重的系统方法。[...] 由于罕见事件的概率很低,因此事件的概率不是合适的权重;然而,概率的任何反函数都可能很有趣。

我将尝试使用 R 中的一个简单而小型的数据集来说明这种情况。

var_1 <- c('A', 'A', 'B', 'A')
var_2 <- c('C', 'C', 'D', 'E')
var_3 <- c('G', 'G', 'G', 'F')
print(test.df <- data.frame(var_1, var_2, var_3))

这将产生以下数据框

  var_1 var_2 var_3
1     A     C     G
2     A     C     G
3     B     D     G
4     A     E     F

我们可以使用 Gower 系数计算距离矩阵,如下所示。

library(cluster)
test.dist <- daisy(test.df, metric="gower")
round(test.dist,2)

这会产生以下矩阵。

     1    2    3
2 0.00          
3 0.67 0.67     
4 0.67 0.67 1.00

例如,我们可以看到,观察 1 和 2 对于三个变量是相同的,导致距离为 0。观察 1 和 3 不是;它们在三个变量中的两个(var_1var_2)上有所不同,导致距离为 2/3=0.67。

现在我的问题如下。在数据框中,我们可以看到Gin的值var_3占数据的 75%。我想使用此信息来调整此变量对相似性的贡献。换句话说,因为Gvar_3 中 的概率是 的概率的三倍,所以F包含在该变量中的两个观测值(行)F应该被认为比包含值 的两个观测值更相似G

只是为了提供一些背景信息:我的真实数据集中的一些变量具有高度倾斜的分布,其中一个值占该变量所有观察值的 80%,剩下的 20% 分布在其他三个值上。

(我知道我可以使用weights参数向菊花函数添加权重,但这些权重不依赖于特征值的分布,相反,这些权重对于变量中的所有值都是恒定的。)

标签: rmatrixdistanceweighted

解决方案


安德伯格的建议没有得到实施的原因可能表明这样做有多么困难。第一个问题是决定如何设置权重。您将它们基于类别的相对频率,但这会因样本而异,因此您将为不同的样本设置不同的权重。其次,Gower 度量已经在处理多种数据类型,因此您会使其更加复杂,但 Gower 是唯一尝试组合不同数据类型的距离度量。该实现在包中确实具有cluster可能与您想要的足够接近的功能。Gower 的其他实现可能具有更多功能(搜索 gower distance r 以获取其他实现 gower distance 的包)。在daisy有两种处理二进制数据的方法,对称和非对称。不同之处在于 '0-0' 以对称(又名简单匹配系数)计算,但不以非对称(又名 Jaccard)计算。使用非对称接近你想要的,但你必须将因子变量转换为二进制。daisy 函数实际上对分类变量执行此操作,但它不允许您为尚未二元的变量指定不对称。

A <- ifelse(test.df$var_1 == "A", 1, 0)
B <- ifelse(test.df$var_1 == "B", 1, 0)
C <- ifelse(test.df$var_2 == "C", 1, 0)
D <- ifelse(test.df$var_2 == "D", 1, 0)
E <- ifelse(test.df$var_2 == "E", 1, 0)
E <- ifelse(test.df$var_2 == "E", 1, 0)
F <- ifelse(test.df$var_3 == "F", 1, 0)
G <- ifelse(test.df$var_3 == "G", 1, 0)
dta <- cbind(A, B, C, D, E, F, G)

如果您要使用它,有办法自动化这个过程,但这是一个概念验证答案。您的示例数据集太小,无法显示两种方法之间的差异,但如果您在示例数据中增加样本量,您应该会看到差异。

daisy(dta, metric="gower")    # symmetric
daisy(dta, metric="gower", type=list(asymm=1:7))

当然,您始终可以编写自己的 Gower 距离版本,并结合自定义加权系统。R 中有一些通用距离函数,可让您编写自己的函数来计算两行之间的距离,并使用它来计算完整的距离矩阵。


推荐阅读