Как создать матрицу путаницы, содержащую несколько суждений в R?

У меня есть набор данных от двух оценщиков, оценивающих набор видеоклипов по нескольким (бинарным) критериям. Я хотел бы построить матрицу путаницы, чтобы лучше понять их согласие/несогласие. Но все примеры, которые я нашел до сих пор, относятся к случаям, когда каждый судья оценивает клип только по одному критерию. В моем случае судьи оценивают все критерии для каждого клипа.

Скажем, у меня есть 4 бинарных критерия (A_Con..A_Mod), оцененных двумя оценщиками (A и B) для набора видеоклипов (в данном случае 80):

str (mydata)
'data.frame':   160 obs. of  6 variables:
 $ A_Con: int  0 0 0 0 0 0 0 0 0 0 ...
 $ A_Dom: int  0 0 0 1 0 0 0 0 0 0 ...
 $ A_Met: int  0 0 0 0 0 0 1 0 0 1 ...
 $ A_Mod: int  0 0 0 1 0 1 0 0 0 1 ...
 $ Rater: Factor w/ 2 levels "A","B": 2 2 2 2 2 2 2 2 2 2 ...
 $ Clip : int  1 2 3 4 5 6 7 8 9 10 ...

Я могу расплавить это в:

> str(mymolten)
'data.frame':   640 obs. of  4 variables:
 $ Rater   : Factor w/ 2 levels "A","B": 2 2 2 2 2 2 2 2 2 2 ...
 $ Clip    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ variable: Factor w/ 4 levels "A_Con","A_Dom",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ value   : int  0 0 0 0 0 0 0 0 0 0 ...

Но я не могу понять, как преобразовать его в матрицу путаницы, которая подсчитывала бы комбинации (которые далеко не так совершенны, как эта):

                        Rater B
              A_Con  A_Dom  A_Met  A_Mod
         A_Con  19      1      0      0
Rater A  A_Dom   1     20      0      0
         A_Met   0      0     20      5
         A_Mod   0      2      0     20

Кажется, что функция table() — это то, что нужно, но как отформатировать данные?


person anthill    schedule 19.02.2012    source источник


Ответы (1)


Это может быть не самое простое решение. Вы можете разделить данные для двух оценщиков и merge результирующих data.frames.

# Sample data
n <- 80
d0 <- data.frame(
  A_Con = round(runif(2*n)),
  A_Dom = round(runif(2*n)),
  A_Met = round(runif(2*n)),
  A_Mod = round(runif(2*n)),
  Rater = rep(c("A","B"), n),
  Clip = rep(1:n,each=2)
)

library(reshape2)
library(plyr)
d <- melt(d0, id.vars=c("Rater","Clip"))
d <- d[ d$value==1, ]
A <- d[d$Rater=="A",] 
B <- d[d$Rater=="B",]
A <- data.frame( Clip=A$Clip, A=A$variable )
B <- data.frame( Clip=B$Clip, B=B$variable )
d <- merge(A, B, all=FALSE)
d <- ddply( d, c("A", "B"), summarize, n=length(Clip) )
dcast( d, A ~ B )
person Vincent Zoonekynd    schedule 19.02.2012
comment
Спасибо! Единственная загвоздка в том, что если один оценщик не использует определенный критерий, то в матрице путаницы отсутствует столбец. Можно исправить, изменив вызов ddply на d ‹- ddply( d, c(A, B), summ, n=length(Clip), .drop = FALSE) - person anthill; 20.02.2012