今回はちょっと調子に乗った課題を出しすぎてしまったためにミニップがげんなりしているように見えましたが、いろいろとやってみました。yoshid50の時間感覚が段々正確になってきているそうです。次回ではその汚名を覆してやろうと思います(ぇ。
ブログの前のほうにも書きましたが、今回はGnu Screenを使って、マルチセッション使って説明を行いました。はてなグループのプレゼンモードはすごい便利なのですが、説明後「ここコピペしてねー」というときにみんながどこにコードがあるか探さないといけないということがありました。これだとscreenからemacs開いておいて、リージョン選択とかやれば"ここ"が一発で分かるということですごく便利です。また、課題を出すときにもみんなに説明する用の解答が載っていないものと自分が課題の解答を説明するようのテキストを同じにできるので便利です。何か実験コードを付け加える必要が出てきてもemascにほげほげと書いてやれば大丈夫*1。
まあ、そんなわけで今回も使った説明資料をあげておきたいと思います。何か間違ったことをあげていても責任は負いません、と決まり文句。
R勉強会第五回
- Presented by 吉田康久
Rのグラフィックス特集
はじめに
- 今回は端末上で説明します
- どこをコピペすればいいかとかが分かやすいと思ったので
- 練習問題用のテキストと解答用のテキストを用意するのが面倒だったので
- 参考にしたい人がいるかもしれないので、終わったらネット上にアップします
- 途中で説明した付近までのところは随時あげます
画面の入りかた
- teratermを開く
- icho.ipe.sk.tsukuba.ac.jpにログイン
- s0511…でログイン
- パスワード分からなかったら言ってください
注意
- グラフィックスは結果が視覚的なので面白い
- グラフィックス作るのに夢中になって目的とかを忘れないでね
- オプションやまほどあるけど、覚える必要はない
- 「こういうのがあるんだー」ってくらいでいい
- 必要なときにヘルプを呼び出すとかが普通
- だけど、わりと頑張ったやつのプログラムとかはログに残しておくと後で楽をできる
内容
- グラフィックスのいろいろ
- Rのちょっと細かいけど、知ってると楽にできること
- ちょっとプログラムを書いて、楽にシミュレーションをやったり。
グラフィクスのための準備
- 準備しなくてもいいっちゃいいのだけれど
- グラフィックス関連はいろいろやり直しながらの作業が多い
- やることまとめてそれを読み込んだほうが便利
.Rファイルを準備
- Rのプログラム書いたもの
- 書くのは何でもいい
- 書いた.Rのファイルを置く場所に注意
- getwd
グラフィックスの話題に移るよ
作図関数について
- 大別して3種類くらい
- 高水準作図関数
- 低水準作図関数
- 対話的作図関数
高水準作図関数
- 一枚の完成された図を作成するためのもの
- 例えば
- 散布図
- ヒストグラム
- 多少設定できるけど、とりあえずplotとかhistってやってればできる
- 楽チン
低水準関数
- グラフの塗りつぶしとか自分でいろいろ設定するもの
- 面倒だけど、きちんとしたものを作りたいときには必須
- 今日はたぶんこの辺を中心に説明していくのではないかと思われ
- だってグラフィックス特集だもん←やってもらうことにしました
対話的作図関数
- マウスとかを使ってごにょごにょするやつ
- データ解析を取った人はidentifyとか
- 異常値の発見とかに役にたつ
array1<-c(1,2,3,4,5) array2<-c(5,4,3,2,1) array3<-c("yasuhisa","tantan","satou","onoue","miyaga") plot(array1,array2) identify(array1,array2,array3)
保存とか
- みんなwinとかだからコピペでいくのかもしれないけど…
- 画像ファイルとして保存するやり方
- pngで指定
- dev.offでもとの状態に戻す
- プロットはされないよ
png("yasuhisa.jpg") plot(array1,array2) dev.off()
便利な時
- 一枚とか書くときにはそれほど変わらないかもしれない
- シミュレーションで画像ファイルが30枚とか必要だったとき
- コピペだるい
- さっきのコマンドをforで回したりすると幸せになれます
- あとでやってもらうかも
高水準作図関数
- この辺にいる人たちはもう結構知っているはず
- lmの結果をplotとかqqnormとか
- 簡単だけど、あんまり知らない関数とかを紹介していくよ
関数のグラフ
正規分布を出力したりとか
curve(dnorm,-3,3)
X^2分布とか
curve(dchisq(x,3),0,15)
関数名と定義域を指定
- どんな関数があるの?
- この辺参照
http://www.okada.jp.org/RWiki/?R%A4%CB%A4%AA%A4%B1%A4%EB%B3%CE%CE%A8%CA%AC%C9%DB
- 自分で定義した関数を書くことももちろんできるよ
- マーケティング工学
棒グラフ
- ありがち
barplot(1:10) barplot(1:10,horiz=T,names=letters[1:10],las=1)
オプション
- lettersとかやってみよう
- lasとかの数字を変えてみる
horiz | 棒グラフを横にする |
names | 軸に名前を付ける |
las | 軸の文字を横で出す |
できあがり
進化
- こんなのも書けるよ
- 興味あるひとはyoshid50まで
3次元プロット
- まあ、いろいろあるんだけど
- 直観的にはこれが一番使い易いかな、と自分は思ってる
- persp関数
- outerは無名関数(?)っぽいものを作る
- 説明します
- for文の省略、速度の上昇
- thetaとかは角度を変える
x <- seq(-10,10,length=50) y <- x z <- outer(x,y,function(x,y){r <- sqrt(x^2+y^2);10**sin(r)/r}) persp(x,y,z) persp(x,y,z,theta=30,phi=30,expand=0.5,col=rainbow(50))
できあがり
低水準作図
- 簡単なところからいきましょう
- タイトル、サブタイトル
plot(rnorm(50),rnorm(50),xlab="あああ",ylab="いいい") title(main="正規乱数同士の散布図",sub="書いてみたよー")
凡例
- legend関数
legend(x,y,legend) | x,yは位置。legendは名前 |
lwd | 線や点の太さ |
lty | 線の種類 |
plot(1:10,1:10,type="l",lty=1) lines(((1:10)^2)/10,lty=2) legend(1,5,c("直線","二乗"),lwd=1,lty=c(1,2))
画面の分割
- mfrowにベクトルを与えてあげる
- 左上、右上、左下、右下の順
par(mfrow=c(2,2)) plot(sin) plot(cos) plot(tan) plot(dnorm)
できあがり
タイトルを枠の外に書く
- mtextで外にタイトルを
- lineはタイトルの位置とか(だと思う)
- outerは外に書くことを許すよってやつ
- sideは上に書くよっていっている
- 回る順番
par(mfrow=c(2,2)) plot(sin) plot(cos) plot(tan) plot(dnorm) mtext(side=3,line=1,outer=T,text="Title")
失敗…
余白が必要
- omaで余白の設定が必要
par(oma=c(0,0,4,0)) par(mfrow=c(2,2)) plot(sin) plot(cos) plot(tan) plot(dnorm) mtext(side=3,line=-3,outer=T,text="Title",cex=3)
できあがり
自由に画面分割
- cの順番に描画される
mat <- matrix(c(1,3,2,2),2,2,byrow=TRUE) mat layout(mat) plot(sin) plot(cos) plot(tan)
できあがり
自由に画面分割2
- もっと自由にすることもできるよ
par(oma=c(0,0,4,0)) mat <- matrix(c(1,1,1,2,3,4),2,3,byrow=TRUE) mat layout(mat) plot(sin) plot(cos) plot(tan) plot(dnorm) mtext(side=3,outer=TRUE,text="いろんな関数を描画してみる")
できあがり
課題を出します
- 準備
- lm関数でやったことを思い出そう
lm(speed~dist,data=cars) plot(lm(speed~dist,data=cars)) par(mfrow=c(2,2)) plot(lm(speed~dist,data=cars)) qqnorm(summary(lm(speed~dist,data=cars))$residuals) qqline(summary(lm(speed~dist,data=cars))$residuals) plot(predict(lm(speed~dist,data=cars)),summary(lm(speed~dist,data=cars))$residuals)
#課題
- これ書いてね♪
- 頑張って
par(oma=c(0,0,3,0)) par(mfrow=c(2,1)) qqnorm(summary(lm(speed~dist,data=cars))$residuals,main="Q-Q Plot") qqline(summary(lm(speed~dist,data=cars))$residuals,col="red") plot(predict(lm(speed~dist,data=cars)),summary(lm(speed~dist,data=cars))$residuals,main="残差プロット") mtext(side=3,outer=TRUE,text="モデルの診断に関するプロット")
画面分割を自在に使うとこんなことも
ソース
layout.plot.hist <- function(x,y, ratio1=c(3,1), ratio2=c(1,3)){ # (左下,左上,右下,右上)の順に(1,2,3,0) 0は描画しない 分割を縦横それぞれ設定 layout(matrix(c(2,0,1,3),2,2,byrow=TRUE), ratio1, ratio2, TRUE) # ヒストグラム情報を記録 x.counts <- hist(x, right=FALSE, plot=FALSE)$counts y.counts <- hist(y, right=FALSE, plot=FALSE)$counts # 左下画面 par(mar=c(3,3,1,1)) # 余白指定 plot(x, y, xlim=range(x), ylim=range(y)) # 散布図作成 # 左上画面 par(mar=c(0,3,1,1)) # 余白指定 barplot(x.counts, ylim=c(0,max(x.counts)), space=0, col=0) # 上ヒストグラム # 右下画面 par(mar=c(3,0,1,1)) # 余白指定 barplot(y.counts, xlim=c(0,max(y.counts)), space=0, horiz=TRUE, col=0) # 右ヒストグラム } x <- runif(100) # 一様分布の乱数 y <- rnorm(100) # 正規分布の乱数 layout.plot.hist(x,y) # 作図 layout.plot.hist(x,y,c(1,1),c(1,1)) # 作図
Rでグラフィックスを書く意味
- かなり私的な意見
- ただただ書きたいならexcelとかのほうがいい人もいるかもしれない
- 繰り返し処理で楽をしたいというためってのが結構ある
繰り返し処理のための準備
- for文
- Rのfor文は楽チンだよ
for(i in 1:10){ print(i) } x <- c() for(i in 1:10){ x[i] <- i } x cat(1:10,sep=",",fill=TRUE)
paste関数
- 文字列を結合させるための関数
a<-"yasuhisa" b<-"yoshida" paste(a,b) paste(a,b,sep=",") paste(a,b,sep="☆")
deparse関数とsubstitute関数
- こいつらはセットとかでよく使われている
- substitute関数は引数に使われている変数の中身、ではなくて変数の名前自身とかを返す
x<-"yasuhisa" substitute(x)
deparse関数
- 普通はdeparse関数をかぶせて使ってあげる
deparse(substitute(x))
同じじゃね?
- 何でこんなことする必要があるかっていうと返ってくる型が違うから
- name型っていうのはよく知らない
- だけど、欲しいのは大抵characterなので、deparseしとく
mode(substitute(x)) mode(deparse(substitute(x)))
こいつら使って楽をしようよ
- 例
- マーケティング工学のadbudg関数
- パラメータと範囲を変えてシミュレーションをしよう
adbudg<-function(x,a=2.3,b=0.5,c=5.28,d=2.6){ return(b+(a-b)**x^c/(x^c+d)) }
とりあえず一枚書いてみる
- パラメータcと定義域のxを指定
- パラメータの値とかを書いてあげる
- title関数を使ってやっても全然いい
png("x=100,c=0.5.png") curve(adbudg(x,c=0.5),0,100,main="ADBUDG反応関数",sub="パラメータはa=2.3,b=0.5,c=0.5,d=2.6",xlab="x",ylab="反応関数") dev.off()
できあがり
解答
for(x in c(10,100,200)){ for(c in c(5,0.9,0.5,0.1)){ png(paste(deparse(substitute(x)),"=",x,",",deparse(substitute(c)),"=",c,".png",sep="")) curve(adbudg(x,c=c),0,x,main="ADBUDG反応関数",sub=paste("パラメータはa=2.3,b=0.5,", deparse(substitute(c)),"=",c,",d=2.6",sep=""),xlab=paste(deparse(substitute(x))),ylab="反応関数") dev.off() } }
*1:さっそくやりました