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(truth,pred)   # arguably a lot less clumsy than your effort.
     pred
truth - +
    - 4 2
    + 1 3

この場合、多値ベクトルが「==」からスカラーかどうかをテストします。

于 2013-07-30T22:07:07.080 に答える
2

outerFUNに渡された関数がベクトル引数を取り、それらを適切に処理できると仮定します。mnが、outer に渡される 2 つのベクトルの長さである場合、まずm*n、入力のすべての組み合わせが発生するような長さの 2 つのベクトルを作成し、これらを 2 つの新しいベクトルとして に渡しFUNます。これに対して、外部は、FUN が別の長さのベクトルを返すことを期待しています。m*n

あなたの例で説明されている関数は、実際にはこれを行いません。実際、ベクトルをまったく正しく処理しません。

1 つの方法は、ベクトル入力を適切に処理できる別の関数を定義することです。あるいは、プログラムが実際に単純なマッチングを必要とする場合はtable()、@DWin の回答のように使用できます。

関数を再定義している場合、outer は入力に対して実行される関数を期待しています。

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

そしてあなたの例によれば、戻るべきです、

c(3,1,2,4)

エラーの実際の意味をデコードするという小さな問題もあります:
繰り返しますが、mnが outer に渡された 2 つのベクトルの長さである場合、最初に length のベクトルを作成し、m*n次に (基本的に) を使用してそれを再形成します。

dim(output) = c(m,n)

これは、outer が出力を 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 に答える