2

我有一些真实和预测的标签

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 中为此推荐的策略是什么?

我总是可以通过更高阶的东西,但这似乎很笨拙。

4

2 回答 2

3

我有时也无法理解哪里outer出了问题。对于这个任务,我会使用 table 函数:

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

在这种情况下,您将测试多值向量是否是“==”到标量。

于 2013-07-30T22:07:07.080 回答
2

outer假设传递给的函数FUN可以接受向量参数并与它们一起正常工作。如果mn是传递给外部的两个向量的长度,它将首先创建两个长度的向量,m*n使得输入的每个组合都出现,并将它们作为两个新向量传递给FUN。对此,outer 预计 FUN 将返回另一个长度向量m*n

您的示例中描述的功能并没有真正做到这一点。事实上,它根本无法正确处理向量。

一种方法是定义另一个可以正确处理向量输入的函数,或者,如果您的程序实际上需要简单匹配,您可以使用table()@DWin 的答案

如果您正在重新定义您的函数,则外部期望一个将为输入运行的函数:

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

根据你的例子,应该返回,

c(3,1,2,4)

还有一个小问题是解码错误的实际含义:
同样,如果mn是传递给外部的两个向量的长度,它将首先创建一个长度向量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]
于 2013-07-31T09:26:30.323 回答