「医学・薬学・生命科学を学ぶ人のための 統計学入門 ―基礎の基礎からデータ解析の実際まで―」1.4 検定って?
http://d.hatena.ne.jp/foo22222/20121018
随所に不適切,誤った記述がある。だめだなあ。
「R で 25%、50%、75% 分位点ごとの点を plot する。」にて,
http://d.hatena.ne.jp/kingqwert/20121017/p1
> ちょっと意味がわかりにくいかもしれませんが。。。
プログラムが冗長なので,かえってわかりにくかった。
X<-runif(100000)
Y<-round(runif(100000,max=100)) # <-- sample 関数を使おう
Z<-cbind(X,Y)
l25<-aggregate(Z[,1],list(Z[,2]),function(x) quantile(x,probs = 0.25)) # <-- probs を指定しなければ,結果として求めたいものが 3 つはいっている。
l50<-aggregate(Z[,1],list(Z[,2]),function(x) quantile(x,probs = 0.5)) # quantile を 3 回も呼ぶ必要はない
l75<-aggregate(Z[,1],list(Z[,2]),function(x) quantile(x,probs = 0.75))
l<-merge(l25,l50,by="Group.1") # <- 別々に求めて,また一緒にするとは
l<-merge(l,l75,by="Group.1") # Group.1 ごとに整理するという意味合いはあるけど,そうしなくてはならなくなったのが敗因
ではどうやるかといわれれば,
X <- runif(100000)
Y <- sample(0:100, 100000, replace=TRUE) # 要するに X を 0~100 のグループに分類する
a <- split(X, Y) # Y の順序は関係しないので split で十分(本当は Y すら必要ないが)
ll <- sapply(a, quantile) # ll の 2 行目が 25%tile, 3 行目は 50 %tile,4 行目が 75 %tile
plot(0:100, ll[3,], type="n", ylim=c(0, 1)) # 内部を塗りつぶしたいというので面倒くさい
polygon(c(0:100, 100:0), c(ll[2,], rev(ll[4,])), col="aliceblue", border=NA)
for (i in 2:4) lines(0:100, ll[i,]) # これくらいなら for を使っても良いだろう
要するに,一様乱数を 101 組作って,それぞれの 25, 50, 75 %tile を描くということだから,101 組のラベル付けなど最初から不要(101 組である必要もない。100組でよいわけだし,各組の一様乱数の個数だって,乱数で決めなくてもよい)。
所要時間は,後者のプログラムの方が 7 倍ほど速い。
> ggplot2 を久しぶりに用いてきれいなグラフを書こうと努力しましたが、なかなか難しいですね。
ggplot2 を使う必要性がない。graphics パッケージで十分キレイな図が,しかも簡単に描けるのだから。