计算相似度百分比或计算两个以上对象之间的相关性

Har*_*hid 8 statistics r machine-learning

考虑我有四个对象(a,b,c,d),我要求五个人根据他们的外貌或其他东西来标记它们(类别1或2).五个人为这些物体提供的标签显示为

df <- data.frame(a = c(1,2,1,2,1), b=c(1,2,2,1,1), c= c(2,1,2,2,2), d=c(1,2,1,2,1))
Run Code Online (Sandbox Code Playgroud)

以表格格式,

 ---------
  a b c d
 ---------
  1 1 2 1
  2 2 1 2
  1 2 2 1
  2 1 2 2
  1 1 2 1
----------
Run Code Online (Sandbox Code Playgroud)

现在我想计算一组对象被赋予相同标签(1或2)的百分比.例如,对象a,b和d由5个人中的3个人给出相同的标签.所以它的百分比是3/5(= 60%).虽然对象a和d被所有人给予相同的标签,所以它的百分比是5/5(= 100%)

我可以手动计算这个统计数据,但在我的原始数据集中,我有50个这样的对象,人们是30,标签是4(1,2,3和4).如何自动为这个更大的数据集计算此类统计数据?是否有任何现有的包/工具R可以计算这些统计数据?

注意:组可以是任何大小.在第一个例子中,一个组由a,b和d组成,而第二个例子组由a和d组成.

ali*_*ire 4

这里有两个任务:首先,列出所有相关组合,其次,评估和聚合行相似性。combn可以开始第一个任务,但需要一些处理才能将结果排列成整齐的列表。第二个任务可以用 处理prop.table,但这里直接计算更简单。

在这里,我使用了tidyverse语法(主要是purrr,这对于处理列表很有帮助),但如果您愿意,可以转换为基本语法。

library(tidyverse)

map(2:length(df), ~combn(names(df), .x, simplify = FALSE)) %>%    # get combinations
    flatten() %>%    # eliminate nesting
    set_names(map_chr(., paste0, collapse = '')) %>%    # add useful names
    # subset df with combination, see if each row has only one unique value
    map(~apply(df[.x], 1, function(x){n_distinct(x) == 1})) %>% 
    map_dbl(~sum(.x) / length(.x))    # calculate TRUE proportion

##   ab   ac   ad   bc   bd   cd  abc  abd  acd  bcd abcd 
##  0.6  0.2  1.0  0.2  0.6  0.2  0.0  0.6  0.2  0.0  0.0 
Run Code Online (Sandbox Code Playgroud)