COLOR(red){SIZE(25){R プログラミング  定石集}}

R でプログラミングする際役に立つと思われる「定石」を脈絡無く集めます。
#contents
~
*調整累積度数

ある階級未満の累積度数と当該階級の半分の和を累積度数とする。for を使わないバージョン

 > ob <- c(4,1,2,12,97) 
 > oc <- ob 
 > for (i in 1:length(ob)) { oc[i] <- sum(ob[1:i])-ob[i]/2 } 
 > oc
 [1]  2.0  4.5  6.0 13.0 67.5
 > oc <- cumsum(c(0, ob[-length(ob)]))+ob/2
 > oc
 [1]  2.0  4.5  6.0 13.0 67.5

*テキスト出力をグラフィックに描画
行間隔は画面の高さを調整することで対処(みんな同じことを考えるようだ)

 plot.texts <- function(out)
 {
 	nr <- length(out)
 	nl <- max(sapply(out, nchar))
 	plot(c(0, nl), c(0, -nr), type="n", xaxt="n", yaxt="n", xlab="", ylab="", bty="n")
 	text(rep(0, nr), 0:(-nr), out, pos=4)
 }
 x <- rnorm(20)
 plot.texts(capture.output(stem(x)))
#ref(out1.png)
 > plot.texts(capture.output(t.test(1:5, c(3,2,5,6))))
#ref(out2.png)

*α±βのような形式の二値を計算するとき
αやβが長いときそれぞれ前もって変数に付値しておいてから,α+β,α-βとして二変数に結果を付値しても良いが,要素を2つ持つベクトルに付値するという手もある

二次方程式の解を求める(以下のように公式をそのまんま適用するのは好ましくはないが)
 # a*x^2+b*x+c=0 の解
 > a <- 2
 > b <- 3
 > c <- -2
 > x1 <- (-b+sqrt(b^2-4*a*c))/(2*a)
 > x2 <- (-b-sqrt(b^2-4*a*c))/(2*a)
 > x1;x2
 [1] 0.5
 [1] -2
 > x <- (-b+c(-1,1)*sqrt(b^2-4*a*c))/(2*a)
 > x
 [1] -2.0  0.5

*[i] はベクトルオブジェクトなら使える

a <- c(3,2,5,4) としてから a[i] のようにしなくても,c(3,2,5,4)[3] のように使える
 > lines(x, y[,1], lty=1, col="green") 
 > lines(x, y[,2], lty=2, col="blue") 
 > lines(x, y[,3], lty=2, col="red") 
の3行を,わかりやすいかどうかは別として
 > sapply(1:3, lines(x, y[,i], lty=c(1,2,2)[i], col=c("green", "blue", "red")[i]))
のようにも使える

*ベクトル演算を有効利用する

 n <- 10
 p <- numeric(n+1)
 for (i in 0:n) {
 	p[i+1] <- choose(n,i)*(0.2^i)*(0.8^(n-i))
 }
 以下のように
 n <- 10
 i <- 0:n
 p <- choose(n,i)*(0.2^i)*(0.8^(n-i))

*フィッシャーのZ変換とその逆変換

統計学の教科書では log と exp を使った公式が書いてあるが,コンピュータでは数学関数1つで簡単に求めることができる
 # フィッシャーのZ変換
 > Fisher.trans <- function(r) 0.5*log((1+r)/(1-r))
 > z1 <- Fisher.trans(0.5)
 > z2 <- atanh(0.5)
 > cat(z1, z2)
 0.5493061 0.5493061
 # フィッシャーのZ変換の逆
 > Fisher.trans.inv <- function(z) (exp(2*z)-1)/(exp(2*z)+1)
 > r1 <- Fisher.trans.inv(z1)
 > r2 <- tanh(z1)
 > cat(r1, r2)
 0.5 0.5


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS