r - 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_1
和var_2
)上有所不同,导致距离为 2/3=0.67。
现在我的问题如下。在数据框中,我们可以看到G
in的值var_3
占数据的 75%。我想使用此信息来调整此变量对相似性的贡献。换句话说,因为G
var_3 中 的概率是 的概率的三倍,所以F
包含在该变量中的两个观测值(行)F
应该被认为比包含值 的两个观测值更相似G
。
只是为了提供一些背景信息:我的真实数据集中的一些变量具有高度倾斜的分布,其中一个值占该变量所有观察值的 80%,剩下的 20% 分布在其他三个值上。
(我知道我可以使用weights
参数向菊花函数添加权重,但这些权重不依赖于特征值的分布,相反,这些权重对于变量中的所有值都是恒定的。)
解决方案
安德伯格的建议没有得到实施的原因可能表明这样做有多么困难。第一个问题是决定如何设置权重。您将它们基于类别的相对频率,但这会因样本而异,因此您将为不同的样本设置不同的权重。其次,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 中有一些通用距离函数,可让您编写自己的函数来计算两行之间的距离,并使用它来计算完整的距离矩阵。
推荐阅读
- office365 - 日历访问期间的 MailboxNotHostedInExchangeOnline 错误
- c - 非常昏昏欲睡的分析器将单纯的变量混淆为函数,以及其他问题
- typescript - 出现错误:错误:执行“protractor ./conf.ts --suite homepage”时找不到模块'src/core/configurations/configFunctions
- reactjs - 在按钮上打开相机点击反应原生博览会
- ios - 如果他们不是服务工作者,pwa 是否使用浏览器缓存
- python - 在写入文件之前将内容保存在内存中
- html - url 中的 Slash(/) 返回 500 服务器错误,如何重定向?
- postgresql - 在 pgAdmin 4 中创建触发器函数
- oracle - 在 oracle 中使用 CTE 内的变量时遇到错误
- android - 如何在 kotlin 中编写此 Richpath 代码?