在R语言中的属性值频率(分类变量中的异常值)

5
我正在尝试在R中实现AVF算法以检测分类数据中的异常值(A. Koufakou,E.G. Ortiz等http://www.enriquegortiz.com/publications/outlierDetection_ictai07.pdf)。 我的数据集大约有500,000行,13个变量(全部为分类变量)。
伪代码非常简单:
# Label all data points as non-outliers
# calculate frequency of each attribute value
# foreach point x
#   AVFscore = Sum(frequency each attrib. value in x)/num.attribs
# end foreach
# return top k outliers with minimum AVFscore

为了获取每个属性值的频率,我使用了
freq_matrix <- apply(mydata, MARGIN = 2, FUN = count) # from plyr

这给了我一个数据框列表,每个变量都有一个数据框,其中包含每个变量的频率。到目前为止还不错。

我卡在如何迭代每一行并获取“AVFscore”上 - 我确定我需要使用apply(),但无法理解它应该如何工作。基本上,对于每一行,我需要查找freq_matrix中每个值的频率并将它们相加,然后除以变量数量(即13)。

例如:

Country_cde    Flag1     Flag2      Score
IE               A         X         9/13
IE               B         X         7/13
US               A         X         8/13
US               A         Y         6/13
IE               C         Z         5/13

我知道country_cde的IE频率为3,US为2。对于Flag1,A为3,B为1,C为1等。 在这个例子中,最后一行得分最低,因此很可能是异常值。


我不明白为什么要把所有东西都除以同一个数字,如果目标是得到最低的结果,那么这种除法就是多余的(但我可能会错过原因,因为我不是统计学家)。 - Tensibai
1
同意,我也不明白原因 - 我也不是统计学家,所以我只是按照食谱做... - xythum
1个回答

6

基础R方法:

mydata <- read.table(text="Country_cde    Flag1     Flag2
IE               A         X
IE               B         X
US               A         X
US               A         Y
IE               C         Z",header=T,stringsAsFactors=F)

freq_matrix <- table( unlist( unname(mydata) ) ) # Other way to count the occurrences

mydata[,"Score"] <- apply( mydata,1, function(x) { paste0( sum(freq_matrix[x]) ,"/", length(x) )}) # Do the sum, paste with number of cols (should be computed outside to avoid cache miss)

输出:

> mydata
  Country_cde Flag1 Flag2 Score
1          IE     A     X   9/3
2          IE     B     X   7/3
3          US     A     X   8/3
4          US     A     Y   6/3
5          IE     C     Z   5/3

如果您想要实际的除法值,请将paste0删除,像这样:
mydata[,"Score"] <- apply(mydata,1,function(x) { sum(freq_matrix[x]) / length(x) })

1
非常感谢您的帮助,这个完美地解决了问题! - xythum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接