我有一些真实和预测的标签
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中推荐的策略是什么?
我总是可以通过更高级别的东西,但这看起来很笨拙。
答案 0 :(得分:3)
我有时也无法理解outer
出错的地方。对于这个任务,我会使用表函数:
> table(truth,pred) # arguably a lot less clumsy than your effort.
pred
truth - +
- 4 2
+ 1 3
在这种情况下,您将测试多值向量是否为标量“==”。
答案 1 :(得分:2)
outer
假设传递给FUN
的函数可以使用向量参数并与它们一起正常工作。如果m
和n
是传递给外部的两个向量的长度,它将首先创建两个长度为m*n
的向量,这样每个输入组合都会发生,并将这两个向量传递给两个向FUN
的新向量。对此,外部期望FUN将返回另一个长度为m*n
您的示例中描述的功能并不是真的这样做。事实上,它根本无法正确处理向量。
一种方法是定义另一个可以正确处理矢量输入的函数,或者,如果你的程序实际上需要一个简单的匹配,你可以在@DWin的答案中使用table()
如果你正在重新定义你的函数,外部期望一个将为输入运行的函数:
f(c("+","+","-","-"), c("+","-","+","-"))
根据你的例子,应该回来,
c(3,1,2,4)
解码错误的实际含义还有一个小问题:
同样,如果m
和n
是传递给外部的两个向量的长度,它将首先创建一个长度为m*n
的向量,然后使用(基本上)
dim(output) = c(m,n)
这是给出错误的行,因为外部试图将输出整形为2x2矩阵(总共2 * 2 = 4项),而函数f(假设没有矢量化)仅给出1个输出。因此,
Error in outer(levels(x), levels(x), f) :
dims [product 4] do not match the length of object [1]