2013-07-30 30 views
2

一個二維函數I具有一些真正的和預測的標籤矢量化中的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的函數可以接受向量參數並且可以正確地與它們一起工作。如果mn是傳遞給外部的兩個向量的長度,則它將首先創建兩個長度爲m*n的向量,以便發生每個輸入組合,並將這些向量作爲兩個新向量傳遞給FUN。對此,外界期望,FUN將返回另一個長度爲m*n

您示例中描述的函數並不是真的這樣做。事實上,它根本不能正確處理矢量。

的一種方法是定義可以處理向量輸入正確,或者,如果你的程序實際上需要一個簡單的匹配,你可以使用table()作爲@DWin的回答

如果你重新定義另一個函數你的功能,外期待,將用於投入運行的功能:

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

和按您的例子,應該返回,

c(3,1,2,4) 

還有解碼錯誤實際含義的小問題:
同樣,如果mn是傳遞給外部的兩個向量的長度,它將首先創建一個長度爲m*n的向量,然後使用它對其進行重新整形(基本上)

dim(output) = c(m,n) 

這是給出一個錯誤的行,因爲外試圖形狀,而函數f輸出到一個2×2矩陣(總共2×2 = 4項),假定沒有矢量化,已只給出1個輸出。因此,

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