我已经工作了足够长的时间来看到a)可能有一种简单的方法可以做到这一点,并且b)一组新的眼睛可能会在我之前看到它。所以这里..
进行了两次或多次测试以将项目分为两个或更多类别。我们假设更可靠的测量将来自使用分类器的组合。为了测试这一点,我们需要看看预测是如何相互协调的,而不是仅仅汇总单个测试的结果。此分析的第一步是通过将测试结果分组为观察结果来同时模拟来自所有测试的测量结果。
set.seed(103)
test1 <- data.frame(trueClass=rep(c('A','B','C'), times=c(2,3,4)), score=rpois(9,10))
test2 <- data.frame(trueClass=rep(c('A','B','C'), times=c(3,3,3)), score=rpois(9,5))
test3 <- data.frame(trueClass=rep(c('A','B','C'), times=c(4,2,3)), score=rpois(9,2))
all.data <- list(test1=test1, test2=test2, test3=test3)
我们将观察定义为一个有序的三元组,其中包含score
来自相同的每个测试的一个trueClass
。理想情况下,最后我们会有一个data.frame
看起来像
>observation.df
test1 test2 test3 trueClass
1 11 6 2 A
2 16 4 4 A
3 6 9 2 B
4 ...
困难在于观察的数量受到测试中类的最少表示数量的限制。在这种情况下,最小值是
mins <- c(A=2, B=2, C=3)
所以,我想从每个测试中抽取 2 个测试结果trueClass = A
,其中 2 个trueClass = B
,以及 3 个,trueClass = C
并将它们存储在observation.df
.
显然,创建观察的函数需要从中学习测试和类的名称all.data
。
test.names <- names(all.data)
class.names <- unique(as.vector(sapply(all.data, function(i) i$trueClass)))
要获取要采样的每个类的数量:
library(plyr)
count.table <- laply(all.data, function(i) table(i$trueClass))
mins <- apply(count.table, 2, min)
在我看来,从这里开始应该有一个相当简单的方法(可能是使用by
或plyr
函数),但除了使事情复杂化之外,我没有成功。