裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:繰り返しをそのままプログラムすんな!

2012年06月07日 | ブログラミング

Rあんなときこんなとき(tokyo r#12)」にて

問題

答え

がっかりだなあ。少なくとも,ファイル名の文字ベクトルを作るときに,列挙はないだろう。
実際の場合に,ファイル名に何の規則性もないなんてことはないだろう(もし何の規則性もないならそちらの方が問題だ)。
fn.all <- c("a.r", "b.r", 中略, "z.r")
なんて書かずに,
fn.all <- paste(letters, "r", sep=".")
とか書いてあれば,「ファイル名の規則性を利用してプログラムを書くんだなあ」と初心者に感心されるだろう。

もっともよい対策は,読み込むべきファイルを cat コマンドなどで一つのファイルにまとめておき(要するに一つのファイルに様々な関数定義がごっちゃり入っているようにする),そのファイル1個だけを source で読む。

または,読むべきファイルを特定のディレクトリにまとめて入れておいて,そのディレクトリにある全部のファイルを source で読むようにする。そのようにしておけば,読むべきファイルがリストから漏れていたり余分なファイルを読んだりせずに済むだろう。

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ダメ出し:R を使う前に統計学をちゃんと使お!

2012年06月07日 | ブログラミング

統計学とRのはなしにて

スライド38で,普通に起こること95%を中央に設定したのが間違いの元。左側のみが5%になる-λを設定しないといけない。

プログラムで言えば,qnorm(0.025) ではなくて qnorm(0.05) とすべし。
また,r <- sample(1:100, 1) は r <- sample(0:100, 1) とすべし。

根本的に,こういう類の問題はシミュレーションで解くものではない(プログラムもへたくそでまずいけど)。
z=qnorm(0.05)  として (0.1-p)/sqrt{p(1-p)/100}=z を p について解けばよい。p=0.1603555 となる。
また,正規近似するのではなく,二項分布で正確に求めようとするならば,uniroot(function(p) pbinom(9, 100, prob=p)-0.05, c(0, 1)) で求める。この場合の答えは p=0.1518244

プログラムは,改造しようという気にもならない。

コメントを付けようと思ったけど,Facebook にログインしろだの SlideShare のアカウントは持っているかだの,小うるさいこというので,そこまでして教えてやる必要もないなあと思った次第。特殊なポリシーを持っていると,損するよね。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

定石を使おう

2012年06月04日 | ブログラミング

同じく「5/30 MIKUセミナー」について

result <- lapply(mapply(rep, 0, seqs), unique)

何をやろうとしているか,上のプログラムを見るだけでわかるだろうか?
私にはわからなかった。

result <- vector("list", seqs)

のようだ。

temp_res <- rep(0, use_amino)

これはよく見かけるけど,

temp_res <- numeric(use_amino)

がより直裁的。

コメント (1)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

プログラムも簡明に書く必要がある

2012年06月04日 | ブログラミング

5/30 MIKUセミナー」について


「21個のアミノ酸,コドンを一生懸命打ったのでメモ」ということだが,21個のアミノ酸というのは,

end <- c("T", "C", "A", "G")
codon <- list(paste("G", "C", end, sep=""),
            paste("T", "G", end[1:2], sep=""),
            paste("G", "A", end[1:2], sep=""),
            paste("G", "A", end[3:4], sep=""),
            paste("T", "T", end[1:2], sep=""),
            paste("G", "G", end, sep=""),
            paste("C", "A", end[1:2], sep=""),
            paste("A", "T", end[1:3], sep=""),
            paste("A", "A", end[3:4], sep=""),
            paste("C", "T", end, sep=""),
            paste("A", "T", end[4], sep=""),
            paste("A", "A", end[1:2], sep=""),
            paste("C", "C", end, sep=""),
            paste("C", "A", end[3:4], sep=""),
            paste("C", "G", end, sep=""),
            paste("T", "C", end, sep=""),
            paste("A", "C", end, sep=""),
            paste("G", "T", end, sep=""),
            paste("T", "G", end[4], sep=""),
            paste("T", "A", end[1:2], sep=""))

のあたりのことか?1000個あったら1000行書くか?そんなことないね。データ構造も考えて,以下のように。より簡単に,間違いが少なくなるようにプログラムすることも重要。同じようなことを何行も書くのはダメダメプログラム。間違いの入り込む余地も多くなるので避けるべし。

f1 <- c("G", "T", "G", "G", "T", "G", "C", "A", "A", "C", "A", "A", "C", "C", "C", "T", "A", "G", "T", "T")
s1 <- c("C", "G", "A", "A", "T", "G", "A", "T", "A", "T", "T", "A", "C", "A", "G", "C", "C", "T", "G", "A")
f2 <- c(1,1,1,3,1,1,1,1,3,1,4,1,1,3,1,1,1,1,4,1)
s2 <- c(4,2,2,4,2,4,2,3,4,4,4,2,4,4,4,4,4,4,4,2)
codon <- unname(mapply(function(x, y, i, j) paste(x, y, end[i:j], sep=""), f1, s1, f2, s2))

f1, s1 は文字列として入力(f1 <- "GTGG...GTT")して,バラしてから(f1 <- unlist(strsplit(f1, "")))使うようにすれば,入力はより簡単になる。f2, s2 も同じように文字列で入力してバラして整数化してから使えばよい。
mapply 関数もこんな場合には役に立つ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村