3

ctreeを使用してバイナリ分類ツリーを作成しました。各ターミナルノードに、そのノードに関連付けられた行名を含めたいと思います。どうすればこれを達成できますか?

たとえば、以下のデータセットの場合、左端のノードに23歳未満のすべての人の名前(AbnerからAbudemio)と右端のAbundiantusからAcelinの名前をそれぞれリストします。

      names       age height young   
1     Abner       18   76.1   yes
2     Abraham     19   77.0   yes
3     Abram       20   78.1   yes
4     Abrasha     21   78.2   yes
5     Absalom     22   78.8   yes
6     Abudemio    23   79.7   yes
7     Abundiantus 24   79.9    no
8     Acacio      25   81.1    no
9     Acario      26   81.2    no
10    Accursius   27   81.8    no
11    Ace         28   82.8    no
12    Acelin      29   83.5    no

ここに画像の説明を入力してください

4

1 に答える 1

5

これが1つのハッキーな解決策です。partyパッケージのプロット関数の元のソースコードをほとんど変更する必要はありません。ソースコードを読んで、結果が要因である場合にterminal_panel呼び出しているがあることに気づきました。node_barplot(ソースパッケージがインストールされている場合は、すべてがR/plot.R関数内にあります。)後で変更して、デフォルトの棒グラフにカスタムラベルを表示することができます。

Rプロンプトで次のコマンドを発行するだけです。

fixInNamespace("node_barplot", pos="package:party")

次に、必要なものを追加し始めます。

  1. labels = NULL, gp = NULLその関数の既存の引数リストに追加します。
  2. 関数本体の終わり近くの、の後grid.rect(gp = gpar(fill = "transparent"))に、次の行を追加します。

    if (!is.null(labels)) {
      labs <- as.character(labels[ctreeobj@where==node$nodeID])
      len <- length(labs)
      x <- unit(rep(0.5, len), "npc")
      y <- unit(0.5:len/len, "npc")
      for (i in 1:len) 
        grid.text(labs[i], x=x[i], y=y[i], just="center", gp=gp)
    }
    

    ここで重要なのは、選択したノード()に対応するラベルを選択することです。この情報は、オブジェクトnode$nodeIDのスロットから取得できます(これは、各ケースがどのノードで終了したかを示すベクトルです)。テストは、最初に記述されたとおりに関数を使用できることを確認するためだけのものです。引数を使用して、フォントのサイズや色を変更できます。wherectreeifgp

関数の一般的な呼び出しは次のようになります。

plot(cfit, tp_pars=list(labels=dfrm$names))

ここで、dfrm$namesは。という名前のデータフレームからのラベルの列ですdfrm。これがあなたのデータのイラストです:

cfit <- ctree(young ~ age, data=a, 
              controls=ctree_control(minsplit=2, minbucket=2))
plot(cfit, tp_args=list(labels=a$names, gp=gpar(fontsize=8, col="darkgrey")))

ここに画像の説明を入力してください

(これは、データセットを使用したオンラインの例でもテストしましたiris。)

于 2012-07-12T14:11:05.107 に答える