2

我已经工作了足够长的时间来看到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)

在我看来,从这里开始应该有一个相当简单的方法(可能是使用byplyr函数),但除了使事情复杂化之外,我没有成功。

4

2 回答 2

2

你在找这个吗?(这是一种快速而肮脏的方法)

  library(plyr)
  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, test2, test3)
  num<-list(1,2,3)
  kk<-Map(function(x) ddply(all.data[[x]],.(trueClass),summarize,sam1=unique(ifelse(trueClass %in% c("A","B"),sample(score,2),sample(score,3)))),num)



 > kk
[[1]]
  trueClass sam1
1         A   10
2         A    7
3         B    8
4         B    5
5         C   12
6         C    7
7         C    6

[[2]]
  trueClass sam1
1         A    5
2         A    8
3         B    4
4         B    9
5         C    8
6         C    3

[[3]]
  trueClass sam1
1         A    0
2         A    2
3         B    4
4         B    2
5         C    3
6         C    0



kkk<-ldply(kk)
kkk$test<-with(kkk,rep(c("test1","test2","test3"),c(nrow(kk[[1]]),nrow(kk[[2]]),nrow(kk[[3]]))))
> kkk
   trueClass sam1  test
1          A    7 test1
2          A   10 test1
3          B    8 test1
4          B    5 test1
5          C   12 test1
6          C    8 test1
7          C    7 test1
8          A    8 test2
9          A    5 test2
10         B    9 test2
11         B   12 test2
12         C    8 test2
13         C    3 test2
14         A    2 test3
15         A    5 test3
16         B    2 test3
17         B    4 test3
18         C    3 test3
19         C    0 test3

你可以用reshape得到你想要的。

于 2013-08-20T22:18:13.397 回答
2

可能是一个相当复杂的答案,但它完成了工作。

cutlist <- lapply(all.data,
  function(x)
  do.call(rbind,
    sapply(names(mins), function(y) {
       subs <- x[x$trueClass==y,]
       subs[sample(1:nrow(subs),mins[y]),]
       },
    simplify=FALSE
    )
  )
)

cbind(cutlist[[1]]["trueClass"] , sapply(cutlist,"[[","score",simplify=TRUE))

结果:

    trueClass  1 2 3
A.1         A  7 8 2
A.2         A 10 5 5
B.5         B  8 4 4
B.4         B  4 9 2
C.7         C  6 3 3
C.9         C  7 8 0
C.8         C  8 8 3
于 2013-08-20T23:34:09.943 回答