4

kmeans を使用してビンの幅を決定し、連続測定値 (予測確率) を整数 (3 つのビンのうちの 1 つ) に変換する関数を作成しています。私のアルゴリズムがセット全体に対して同じ確率を (正しく) 予測できるエッジ ケースに遭遇しました。その状況を処理したいと考えています。rattleパッケージのbinning()関数を次のように使用しています。

btsKmeansBin <- function(x, k = 3, default = c(0, 0.3, 0.5, 1)) {
  result <- binning(x, bins = k, method = "kmeans", ordered = T)
  bins <- attr(result, "breaks")
  attr(bins, "names") <- NULL
  bins <- bins[order(bins)]
  bins[1] <- 0
  bins[length(bins)] <- 1
  return(bins)
}

でこの関数を実行すると、ステップでx <- c(.5,.5,.5,.5,.5,.5)エラーが発生します。これは、 が NULL になり、ベクトルではないためです。order(bins)bins

明らかに、x明確な値が 1 つしかない場合、kmeans は機能しません。defaultこの場合、ビン分割を返したいと思います。これが発生すると、binning「警告: 変数は考慮されません」というメッセージが表示されます。したがって、この警告を処理するために使用したいのですが、次のコードtryCatchで行を囲むresult <- ...と、期待どおりに機能しません。

...
tryCatch({
  result <- binning(x, bins = k, method = "kmeans", ordered = T)
}, warning = function(w) {
  warn(sprintf("%s. Using default values", w))
  return(default)
}, error = function(e) {
  stop(e)
})
...

を使用していないかのように警告が出力され、コードはステートメントをtryCatch超えて進行し、エラーが再びスローされます。たくさんのバリエーションを試しましたが、役に立ちませんでした。ここで何が欠けていますか??returnorder

4

1 に答える 1

8

調べてみると、表示される「警告」は経由ではなく、をbinning使用して生成されていることがわかると思います。そのため、警告は表示されません。の作者は、おそらくこの見落としのために濡れた麺で数回の固縛に値するでしょう。;)(または、ガラガラが機能する特定の方法のために意図的に行われる可能性があります。よくわかりません。)warning()cat()tryCatchbinning

これが発生すると戻るように見えるNULLので、手動で処理するだけで済みます。理想的ではありませんが、おそらく唯一の道です。

于 2012-11-16T18:35:18.477 に答える