質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1800閲覧

ランダムフォレストで部分従属プロットを書きたいです

NatsukiA

総合スコア16

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2020/04/23 08:41

編集2020/04/26 08:42

前提・実現したいこと

約2000名分のデータを使って、ランダムフォレストの結果を部分従属プロットにしたいです。
しかし、partial_dependence関数を使うと以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Error in `[.data.frame`(data, , !apply(data, 2, function(x) all(x == fit$y))) : undefined columns selected

該当のソースコード

R

1#書いたコードをすべて加筆しました 2n <- ncol(alldata) 3ix <- 1:n 4data1 <- lapply(alldata[ix], as.numeric) #alldataが元データの名前です 5data1$SEX <-as.character(data1$SEX) #性別をcharacterにする 6 7data1 <-as.data.frame(data1) 8is.data.frame(data1) 9 10data1$変数A <- rowMeans(data1[,c("A1","A2","A3","A4","A5","A6","A7","A8","A9","A10","A11","A12","A13")],na.rm = T) 11data1$変数B <- rowMeans(data1[,c("B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11","B12")],na.rm = T) 12data1$変数Ca <- rowSums(data1[,c("C1","C3","C6","C7","C9","C13","C14")],na.rm = T) 13data1$変数Cb <- rowSums(data1[,c("C2","C4","C11","C12","C17")],na.rm = T) 14data1$変数Da <- rowMeans(data1[,c("D1","D2","D3","D4","D5","D6","D7","D8")],na.rm = T) 15data1$変数Db <- rowMeans(data1[,c("D9","D10","D11","D12","D13","D14","D15")],na.rm = T) 16data1$変数Dc <- rowMeans(data1[,c("D16","D17","D18","D19","D20")],na.rm = T) 17data1$変数Dd <- rowMeans(data1[,c("D21","D22","D23","D24","D25","D26","D27")],na.rm = T) 18data1$変数De <-rowMeans(data1[,c("D28","D29")],na.rm = T) 19 20#クラスタの作成 21library(dplyr) 22ABC_s <- data1 %>% select(変数Da,変数Db,変数Dc,変数Dd,変数De) 23distance <- dist(ABC_s) 24hc <- hclust(distance, method="ward.D2") 25plot(hc) 26cluster <- cutree(hc, k=4) #クラスタ数の指定 27cluster 28cluster <- as.factor(cluster) #Factor型に変更 29data1$cluster <- cluster 30class(data1$cluster) 31 32df <- data1 33df <- mutate(df,cluster_N = if_else(cluster == 3,true = 1,false = 0)) 34data1$cluster_N <- df$cluster_N 35data1$cluster_N <- as.factor(data1$cluster_N) 36 37#最後の行を実行するとエラーが出ます-------------- 38 39library(randomForest) 40set.seed(1) 41df.rows = nrow(data1) 42train.rate = 0.6 43train.index <- sample(df.rows,df.rows * train.rate) 44df.train = data1[train.index,] #訓練データ 45df.test = data1[-train.index,] #テストデータ 46cat("train =",nrow(df.train),"test= ",nrow(df.test)) 47 48#分類モデルの作成 49model.rf <- randomForest(ABC ~ 変数A + 変数B + 変数Ca + 変数Cb, data = df.train) 50#分類モデルの確認 51model.rf 52 53library(edarf) 54pd <- partial_dependence(model.rf,vars = c("変数A","変数B","変数C","変数D"),data = as.data.frame(df.train))

試したこと

①partial_dependenceの引数dataはdata.tableではなく、data.frameでなければならないのでdf.trainをdata.frameにして実行してみましたがエラーがでてしまいます(上記のコードはすでに修正したものです)

②df.trainの行数が列数よりもかなり大きいこと、そして、NAの欄がかなりあることが何か問題を引き起こしている可能性があるのかな…?と思ったのですが調べてもわかりませんでした。すみません…。

③他のデータ(300名ほどのデータ、NAがわずか)で実行するとエラーがでませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shimiken

2020/04/24 03:13

そのエラーメッセージから原因はわからないのですが、 data1の中身がわかれば推測できるかもしれません。
guest

回答1

0

ベストアンサー

https://stackoverflow.com/questions/8370455/how-to-use-random-forests-in-r-with-missing-values

randomForestでNAは扱えないそうです。

rpartという別のツールを使うか
rfImpute関数でNAを列ごとのmedianに置換すればよいみたいです。

投稿2020/04/24 05:23

shimiken

総合スコア368

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NatsukiA

2020/04/24 05:51

ご丁寧にありがとうございます。質問内容にデータ内容の補足を加えました。 ご回答いただいた内容(のリンク先)はrandomForestを使うには「欠損値代入する必要がある」ということだと思うのですが、randomForestは、NAを.(ピリオド)に変換しても実行可能だと思っていたのですが違うのでしょうか…? 300名ほどのデータではNAをピリオドにすると実行できました、と書いたところで2000名データの中身を確認したところNAの処理を忘れておりました…凡ミスで申し訳ありません。これからNAを処理して実行してみます。
NatsukiA

2020/04/24 11:14

欠損値を処理して実行してみたのですが前回と同じエラーが出てしまいました。もう少し調べてみたいと思います。ご回答いただきありがとうございました。
shimiken

2020/04/24 11:33

rfImpute関数でNAを置換した場合も同じエラーが出ますか?
NatsukiA

2020/04/25 10:37

確認したところrfImpute関数でNAを置換した場合も同じエラーがでました。欠損値の問題ではないのかもしれません。
shimiken

2020/04/25 10:52

なるほど。 こちらで2100行5列のテストデータで実行してみましたエラーはでませんでした。 つまり、エラーの原因はNAのせいでも、行数のせいでもなさそうです。 他にエラーがでるデータとエラーがでないデータの違いはありませんか? あるいはそれらのデータの中身を全て見れば原因が推測できるかもしれません。
NatsukiA

2020/04/25 11:46

エラーが出ないデータと出るデータを見比べましたが、私にはわかりませんでした。 いろいろ調べてくださってるのになんだかすみません…。 データの中身を見るということはデータ(とコード)を共有するということだと思うのですが、これができる方法がGithubしか存じ上げません。他に何か方法を知ってらしたらご教示いただけますと幸いです。
shimiken

2020/04/25 11:53

データを共有するいい方法は自分もわからないのですが、例えばここのコメント欄にそのままコピペしたら こっちでタブ切りあるいはスペース区切りのtableとして読み込めると思います。
NatsukiA

2020/04/25 12:07

データ数が多いのでここに貼り付けると大変な気がします。それでもよければ貼りつけますが、一時的にGithubにコードとデータをあげることもできます。 どちらがやりやすいでしょうか?
shimiken

2020/04/25 12:11

Githubにあげてください
shimiken

2020/04/25 12:23

ダウンロードしました。削除してください
NatsukiA

2020/04/25 12:30

ありがとうございます。削除しました。
shimiken

2020/04/26 06:27

pd <- partial_dependence(model.rf,vars = c("FNE","DDF","stress","DIF"),data = df.train[,c(126,127,129,130)]) これでどうでしょう
NatsukiA

2020/04/26 08:28

ありがとうございます。まわりました! 今後の勉強のために[,c(126,127,129,130)]の部分について教えていただきたいのですが、これは何を指しているのでしょうか?
shimiken

2020/04/26 08:34

df.trainの中のFNE,DDF,stress,DIFの値が入っている列だけを取り出しています
NatsukiA

2020/04/26 08:38

なるほど、勉強になりました。とても親身になっていただき感謝しております。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問