第4回演習に対する質問やコメントに答えて

質問

白井先生のホームページにある分散を求めるための項目と全く同じことを行なっ たのですが、なぜか違う数値が出てくることが有ります、どうしてなのでしょうか。

回答: 演習1のあたりの以下のコードのことかと思います。

data <- rnorm(30,0,1)		# rnorm(n,m,d) は平均0、分散1の正規分布から乱数をn個生成する関数
これは乱数を用いて数を30個生成し、dataという変数に記憶しています。 この『乱数生成』においては、予めある仕掛けをしておかないと、 「同じ乱数が生成されない」、 つまり「このウェブページとは異なる乱数が作られ」ます。 それについては過去の記事を御覧ください。そして、乱数を使っている場合では、 同じ結果にならなくても心配しないでください。

解決できないエラー

今回の授業では実行文をRに入力してもエラーしか出ず、戸惑ってしまっった。
> samples <- sample(1:150,75)
> head(samples)
[1]  14   8 150 145  33  83
> iris.train <- iris(samples)
 エラー:  関数 "iris" を見つけることができませんでした
> iris.train <- iris(samples,]
  エラー:  予想外の ']' です  in "iris.train <- iris(samples,]"

回答: ここらへんはプログラミング言語Cと似ているので、C言語にたとえて説明します。 funcをCの関数とし、a,b,cを変数とすれば、 funcを呼び出す(関数funcの実行)は func(a,b,c) と書きますよね。また、arを配列の変数とすれば、配列の要素は ar[3]のように表しましたね。
このようにC言語では、関数の引数には丸括弧(と)を使い、配列のインデックスには角括弧[と]を使いました。

Rでも同様です。sample関数 ですから、sample(1:150,75)のように、1:150と 75という引数を丸括弧でかこみます。
また、irisデータフレーム (C言語における配列(の拡張版))を値とする変数から、 samplesで指定された要素を取り出すには、 角括弧を使わないといけません。つまりここは、以下のように書かないといけません。

> iris.train <- iris(samples)   ではなく
> iris.train <- iris[samples]      とする
そして
> iris.train <- iris(samples,]  ではなく
> iris.train <- iris[samples,]  とする
括弧には意味があるのです。 プログラミング言語においてはどの括弧を使っても良い、ということはありません。

演習問題3(2)

乱数を用いた5等分の仕方がわからなかった

回答: 多くの方がこれで詰まっていましたが、これに対する方策を与えた方も多かったです (過去の講義を参考にした方もいるようです)。
講義で述べた方法の応用として以下のように書くことができます。 ただしここでは、irisデータが、1~50がsetosa, 51~100がversicolor、101~150がvirginicaという3種のデータから構成されているということを使っています。

all <- 1:50     # 1~50番目までのデータを考える

g1 <- sample(all,10)         # 10個乱数で選ぶ
#  g1 = 16  6 28 26 38 47 22 12 33 35
g2 <- sample(all[-g1], 10)   # g1以外のデータから10個乱数で選ぶ
# g2 = 45 15 40 20  7  1 36 39 19  2
g3 <- sample(all[-c(g1,g2)],10)   # g1, g2以外のデータから10個乱数で選ぶ
# g3 = 31 18 13 42 14 41 49  5 32 44
g4 <- sample(all[-c(g1,g2,g3)],10)   # g1, g2, g3以外のデータから10個乱数で選ぶ
# g4 = 34 43 29  8 48 25 11 46 27  9
g5 <- all[-c(g1,g2,g3,g4)]
# g5 = 3  4 10 17 21 23 24 30 37 50
#### ここまでが準備

# irisデータを5等分する
Group1 <- iris[c(g1, g1+50, g1+100),]
Group2 <- iris[c(g2, g2+50, g2+100),]
Group3 <- iris[c(g3, g3+50, g3+100),]
Group4 <- iris[c(g4, g4+50, g4+100),]
Group5 <-iris[ c(g5, g5+50, g5+100),]
別解: (T114***さんによるもの)
A <- sample(1:50,50)
B <- sample(51:100,50)
C <- sample(101:150,50)
Group1 <- iris[c(A[1:10],B[1:10],C[1:10]),]
Group2 <- iris[c(A[11:20],B[11:20],C[11:20]),]
Group3 <- iris[c(A[21:30],B[21:30],C[21:30]),]
Group4 <- iris[c(A[31:40],B[31:40],C[31:40]),]
Group5 <- iris[c(A[41:50],B[41:50],C[41:50]),]

演習問題3(2)

最初はnnetを利用してデータを5分割するところまでは出来たものの、それを 機械学習にかける段階でつまづいてしまった。 ネットを利用して交差検証を調べたら"e1071"パッケージを利用することで、 楽に交差検証が行えるとのことだったのでそれを利用して評価値を導出した。

回答: ネットで調べてみるのは良いことです。ただし、このパッケージは SVM(サポートベクターマシン)という、ニューラルネットとは別の分類器の ためのものです。ですから、課題の主旨からは外れています。

質問

演習2をしていて次のようなメッセージを受け取った:
>  test <- function(x){#関数の書き直し
+ setwd("R")
+ z <- readLines("x")
+ return(z)
+ }
> test(test.txt)
 setwd("R") でエラー:  作業ディレクトリを変更できません #作業ディレク
 トリを「ドキュメント」にしていなかった
 > test(test.txt)
file(con, "r") でエラー:  コネクションを開くことができません
追加情報:  警告メッセージ:
file(con, "r") で:
   ファイル 'x' を開くことができません: No such file or directory

#存在しないファイル名を指定してしまった
> test <- function(x)#関数の書き直し
+ setwd("R")
+ x <- readLines("test.text")
+ }
> test <- function(x){#関数の書き直し
+ setwd("R")
+ x <- readLines("test.txt")
+ return(x)
+ }
> text(z)
 text.default(z) でエラー: plot.new has not been called yet
file(con, "r") でエラー:  コネクションを開くことができません
   追加情報:  警告メッセージ:
↑このエラーの理由がわかりませんでした
また、 最後のに実行した時、plotのグラフが表示された理由もわかりませんでした。
回答: 「追加情報:警告メッセージ」とあるのは、その前に『エラー』メッセージを 出しているので、それだけで修正するのに必要な情報は提示してあるが、 さらに「追加して」警告メッセージを出した、というものです。 見れば分かるように、ほとんど同じ内容なので、余計といえば余計ですね。
また、「plotのグラフが表示された」とありますが、そんなことはありませんよね? 示されたメッセージは「plot.new has not been called yet」であって、 これは「plotが呼ばれていないのに text 関数を呼ぶのは駄目」 という意味です。 よくよくみると、この人が定義しようとした関数の名前は test であって、 text ではありません。またtext というのはplotなどを使って描かれた グラフに文字データを埋め込む(注釈をつける)ための関数です。 だからエラーが出たのです。

コメント

講義は難しいところが多く、 Rの機能についても知らないことが多くこれからが心配である。

回答: ちょっと駆け足的にRについて紹介してきましたが、 次回からはRのプログラムを書いたりすることはあまりなく、 用意されたR関数を動かす程度なので、あまり心配することはありません。 それでも予習、復習はしっかりしておきましょう。