2013-07-30 4 views
2

У меня есть некоторые истинные и предсказывала этикеткувекторизовать двумерный функция R

truth <- factor(c("+","+","-","+","+","-","-","-","-","-")) 
pred <- factor(c("+","+","-","-","+","+","-","-","+","-")) 

, и я хотел бы построить матрицу путаницы. У меня есть функция, которая работает на одинарных элементов

f <- function(x,y){ sum(y==pred[truth == x])} 

однако, когда я применяю его к внешнему продукту, чтобы построить матрицу, R, кажется несчастным.

outer(levels(truth), levels(truth), f) 
Error in outer(levels(x), levels(x), f) : 
    dims [product 4] do not match the length of object [1] 

Какова рекомендуемая стратегия для этого в R?

Я всегда могу пройти через материал более высокого порядка, но это кажется неуклюжим.

ответ

3

Я иногда не понимаю, где outer идет не так. Для решения этой задачи я использовал бы табличную функцию:

> table(truth,pred) # arguably a lot less clumsy than your effort. 
    pred 
truth - + 
    - 4 2 
    + 1 3 

В этом случае, вы тест ли многозначное вектор «==» в скаляр.

+0

Я также опубликую материал более высокого порядка. – nicolas

2

outer предполагает, что функция, переданная в FUN, может принимать векторные аргументы и работать с ними надлежащим образом. Если m и n - это длины двух векторов, переданных внешнему, сначала создаются два вектора длины m*n, так что каждая комбинация входов происходит и передает их как два новых вектора в FUN. Для этого внешний ожидает, что FUN вернет другой вектор длины m*n

Функция, описанная в вашем примере, на самом деле не делает этого. Фактически, он вообще не обрабатывает векторы.

Один из способов определить другую функцию, которая может обрабатывать векторные входы должным образом, или в качестве альтернативы, если ваша программа на самом деле требует простого согласования, вы можете использовать table() как в ответе @DWin «s

Если вы переопределение ваша функция, внешний ожидает функцию, которая будет работать для входов:

f(c("+","+","-","-"), c("+","-","+","-")) 

и на ваш пример, должен вернуться,

c(3,1,2,4) 

Существует также небольшой вопрос о расшифровке фактического значения ошибки: Опять же, если m и n - это длины двух векторов, переданных внешнему, сначала создается вектор длины m*n, а затем преобразует его с помощью (в основном)

dim(output) = c(m,n) 

Это линия, которая выдает ошибку, потому что внешний пытаются формировать выходной сигнал в виде матрицы 2х2 (всего 2 * 2 = 4 единиц) в то время как функции F, при условии отсутствия векторизации, имеет только 1 выход. Следовательно,

Error in outer(levels(x), levels(x), f) : 
    dims [product 4] do not match the length of object [1] 
Смежные вопросы