-
0800 起床.
朝飯.
コーヒー.
0900 自宅発.
台風 15 号の雨.
0910 研究室着.
-
釧路雑用一件.
参加不可能になったヒトへの対応,
誰もやらないので私がやる.
しかしこのあたり systematic になっていないので,
ネット上の
「当日の変更点」
と当日に会場にはりだされるそれがどんどん乖離していってるような.
実行委員長殿が現時点において,
ポスター賞審査員さがしとか「座長」さがしに
熱中というか没頭していて
だいじょうぶなのだろうか?
-
また
自由集会
の多重比較がらみの関数かき.
試行錯誤は楽しくはある.
しかしながら,
こんなことにかまけていていいのか,
という気もする.
-
どうでもいいんだが,
R
の
merge()
と
expand.grid()
は似てる.
そして私がさがしてたのは
append()
だ.
> append(list(1:3), list(5:9))
[[1]]
[1] 1 2 3
[[2]]
[1] 5 6 7 8 9
あ,
でもこれって
c(list(1:3), list(5:9))
と挙動がまったく同じ,
に見える.
むだな探索だった.
そもそも何を期待していたんだ.
-
1150 よーやくにして部品の一部である
divide.set()
(名前はあとで変えるかも)
ができた
……
と思ったら「ばぐ」だらけ.
-
ぢたばたしてると,
中間さん
からメイルいただき,
たまたまそれはバグのひとつに関与するものだった
……
昨日,
joinstr()
なるヘンてこな関数つくったけど,
じつはそれは不要で,
たんに
paste(1:5, sep="", collapse="+")
とすれば
"1+2+3+4+5"
となる
……
-
えー,
なぜかしらしばらく前から,
R 日本語版などなどにたいへんな貢献をしておられる
中間さんとメイル雑談やりとり,
などやっていて,
いろいろと教えていただいております.
苫小牧直径モデルの推定で苦闘したので,
R で分散処理みたいなことやるにはどうしたらいいんでしょうか,
とお尋ねしたら,
snow
だの
Rmpi
だのといったライブラリがある,
と教えていただいた.
これはいずれ研究してみなくては
……
などと書いてたら,
なぜか私のことを有力な顧客候補と考えているらしい
並列計算機屋さん
HIT
の営業からお電話攻撃.
-
あらら,
またしても院試の試験監督がわりあてられる.
8/31 1300-1600.
専門科目.
まあ,
院試のそれは比較的気楽ではあるけどね.
-
釧路大会について以前からいろいろと心配していただいてる
竹中さん
から,
釧路大会はこういう
人員配置表
が無いんですか,
と驚かれてしまった.
たいへんたいへん不思議なことですが,
無いのです
(私の知る限り).
しかし
「勝手にしやがれ」
と傍観を決めこんでいても事態はますます悪化するばかりなので,
とりあえず釧路大会メイリングリストに問い合わせてみる.
もしかしたら,
すでに完備してるかもしれないし.
(後記:
これは現場あれこれ担当の生方さんが準備されていたようで
……
しかしまだ完成してない)
-
釧路雑用 wiki を見ると,
竹中さんから以前にわざわざご教示いただいた
大会直前準備進行管理表
とかも作っていないし
……
「これが,北海道だ」
というところだろうか.
北海道出身者でなくとも,
当地に長く暮らしていると次第に「のんびり」してくる,
とは院生たちの証言である.
まあ,
釧路大会実行委員会が北海道を代表する何かではないんだけど,
事務処理能力に関して褒められるべき部分を持たないのも事実だ.
-
1300 こんどこそバグとれたか?
こんな挙動だ.
まず準備として,
> partitions <- partition.int(4)
> sapply(partitions, function(p) paste(p, sep = "", collapse = ","))
[1] "4" "3,1" "2,2" "2,1,1" "1,1,1,1"
というふうに partitions
なる vector を定義しておくと
(上の例では処理に 4 水準あるときに,それを何とーりに分割できるか,
を示している),
> sapply(partitions, function(p)
+ sapply(divide.set(letters[1:4], p), function(s) get.group.tag(s)))
[[1]]
[1] "(a+b+c+d)"
[[2]]
[1] "(a+b+c)(d)" "(a+b+d)(c)" "(a+c+d)(b)" "(a)(b+c+d)"
[[3]]
[1] "(a+b)(c+d)" "(a+c)(b+d)" "(a+d)(b+c)" "(a+d)(b+c)"
[5] "(a+c)(b+d)" "(a+b)(c+d)"
[[4]]
[1] "(a+b)(c)(d)" "(a+c)(b)(d)" "(a+d)(b)(c)" "(a)(b+c)(d)"
[5] "(a)(b+d)(c)" "(a)(b)(c+d)"
[[5]]
[1] "(a)(b)(c)(d)"
というふうに展開できる,
というもの.
-
しかしながら,
これはまだ重複を含んでいる.
たとえば 2 個 + 2 個に分割するところだと,
(a+d)(b+c)
とか.
もともと
(b+c)(a+d)
で生成されたんだけど,
これまた自作の関数である get.group.tag()
内部で sort()
してるからこうなる.
なぜ sort()
してるかと言えば,
(b+c)(a+d)
は
(a+d)(b+c)
と同じ「グループ化」と判断して,
(あとから)
(b+c)(a+d)
削除するためだ.,
-
そこで,
「同じグループ」
は削除する関数
unique.group()
を定義してみる.
そのままだと
(つまり重複ありのままだと)
> sapply(divide.set(letters[1:4], c(2, 2)), function(g) get.group.tag(g))
[1] "(a+b)(c+d)" "(a+c)(b+d)" "(a+d)(b+c)" "(a+d)(b+c)"
[5] "(a+c)(b+d)" "(a+b)(c+d)"
4!/(2! 2!) = 6 とーりとなるわけだが,
ここでその
unique.group()
とやらを使って重複を取り除くと,
> sapply(unique.group(divide.set(letters[1:4], c(2, 2))), function(g) get.group.tag(g))
[1] "(a+b)(c+d)" "(a+c)(b+d)" "(a+d)(b+c)"
となる.
つまり c("a", "b", "c", "d")
4 つの「処理水準」
(水準間に上下関係ナシ)
を 2 個 + 2 個に分割する方法は,
上のごとく 3 とーりしかないわけだ.
-
時刻は 1350.
昼飯にしますかね.
あいかわらず雨.
昼飯後に釧路雑用少々.
といっても wiki 記録だけだが.
この wiki が無かったら,
状況はもっと無茶苦茶になっていたような気がする.
-
自由集会
の多重比較がらみの関数かきのつづき.
次は得られた「グループわけ」に対応する mapping だ.
-
1600 ひとまず,
ひとつのグループわけに関する mapping はできるようになった.
> map.list.set(list(c("a", "c"), c("b", "d")))
$tag
[1] "(a+c)(b+d)"
$map
a c b d
"(a+c)" "(a+c)" "(b+d)" "(b+d)"
というふうに (a+c)(b+d)
といったグループわけ用の map
を準備しておくと,
たとえば 4 標本の水準が
c("a", "b", "c", "d")
であるなら
> tag.map <- map.list.set(list(c("a", "c"), c("b", "d")))
> tag.map$map[c("a", "b", "c", "d")]
a b c d
"(a+c)" "(b+d)" "(a+c)" "(b+d)"
たとえば水準 a
ならば
(a+c)
水準とせよ,
といった「グループ化した水準」に射影できるわけだ.
-
で,
「すべてのグループわけに対して」
という処理は
lapply()
するだけなので簡単にできた
……
というところで集中力がとぎれた.
-
また,
再開.
こういう関数どもを呼び出していく
generate.groups()
なる関数
(あいかわらず名前がよくないな)
を作る.
こういうかんぢで.
> sapply(generate.groups(c("a", "b", "c")), function(g) g$tag)
[1] "(a+b+c)" "(a+b)(c)" "(a+c)(b)" "(a)(b+c)" "(a)(b)(c)"
あるいは,
同じことだけど
(ラベルの文字列を変えただけ)
……
> sapply(generate.groups(c("無処理", "処理A", "処理B" )), function(g) g$tag)
[1] "(無処理+処理A+処理B)" "(処理B)(無処理+処理A)"
[3] "(処理A)(無処理+処理B)" "(処理A+処理B)(無処理)"
[5] "(処理A)(処理B)(無処理)"
そうか,
それぞれの組みあわせごとに「いくつに分割したか」
も各グループの情報をおさめた list()
に同梱すべきだな.
-
1720 だいたいできた.
じつはこれはハナシの本筋とはあまり関係ない.
しかし
題名
が
「統計ソフトウェア R でやってみる多重比較」
となってしまっているので,
R でなきゃできない何か「芸」をしてみせなければならなかった次第.
たとえば 5 水準となると,
グループわけの方法は 52 とーりとなり,
人間がやる気がしないよね.
> sapply(generate.groups(1:5), function(g) g$tag)
[1] "(1+2+3+4+5)" "(1+2+3+4)(5)" "(1+2+3+5)(4)" "(1+2+4+5)(3)" "(1+3+4+5)(2)"
[6] "(1)(2+3+4+5)" "(1+2+3)(4+5)" "(1+2+4)(3+5)" "(1+2+5)(3+4)" "(1+3+4)(2+5)"
[11] "(1+3+5)(2+4)" "(1+4+5)(2+3)" "(1+5)(2+3+4)" "(1+4)(2+3+5)" "(1+3)(2+4+5)"
[16] "(1+2)(3+4+5)" "(1+2+3)(4)(5)" "(1+2+4)(3)(5)" "(1+2+5)(3)(4)" "(1+3+4)(2)(5)"
[21] "(1+3+5)(2)(4)" "(1+4+5)(2)(3)" "(1)(2+3+4)(5)" "(1)(2+3+5)(4)" "(1)(2+4+5)(3)"
[26] "(1)(2)(3+4+5)" "(1+2)(3+4)(5)" "(1+2)(3+5)(4)" "(1+2)(3)(4+5)" "(1+3)(2+4)(5)"
[31] "(1+3)(2+5)(4)" "(1+3)(2)(4+5)" "(1+4)(2+3)(5)" "(1+4)(2+5)(3)" "(1+4)(2)(3+5)"
[36] "(1+5)(2+3)(4)" "(1+5)(2+4)(3)" "(1+5)(2)(3+4)" "(1)(2+3)(4+5)" "(1)(2+4)(3+5)"
[41] "(1)(2+5)(3+4)" "(1+2)(3)(4)(5)" "(1+3)(2)(4)(5)" "(1+4)(2)(3)(5)" "(1+5)(2)(3)(4)"
[46] "(1)(2+3)(4)(5)" "(1)(2+4)(3)(5)" "(1)(2+5)(3)(4)" "(1)(2)(3+4)(5)" "(1)(2)(3+5)(4)"
[51] "(1)(2)(3)(4+5)" "(1)(2)(3)(4)(5)"
-
まあ,
自由集会とは関係なく,
以前からこういう関数はほしかったわけで.
自由集会という圧力を利用して,
めんどうなプログラムを完成させました,
というところか?
ぢつは,
これは水準間に順番がない場合なんだけど (名義尺度),
ほんとは順番がある場合 (順序尺度)
についても同様のことをやってくれる関数がほしいところだ.
しかし,
これはアルゴリズムがかなり異るので,
またあとで時間があったら,
にしませう.
-
ということで,
よーやくにして自由集会の発表準備に本格的にとりくめるわけだが.
えー,
上のような複雑なグループ化うんぬんは最後の
オマケにすぎづ,
ハナシの中心はもっとも単純なる 3 水準問題,
つまり
> sapply(generate.groups(c("A", "B", "C")), function(g) g$tag)
[1] "(A+B+C)" "(A+B)(C)" "(A+C)(B)" "(A)(B+C)" "(A)(B)(C)"
こういった事例だけを検討する.
-
釧路雑用,
懇親会のメニュー削除しろと言われて削除.
なーんか,
人数がまたしても不確定なんで,
内容が変わるかもとのこと.
-
1830 から 2200 ごろまで,
セミナー室で手巻ずしパーティー.
Matt 夫妻が月末に帰国するんで.
-
楽しいひとときをすごして,
片づけちょっと手伝って
2310 研究室発.
2320 帰宅.
-
えー,
22 日 (日)
は朝から晩まで北大全学停電.
北海道は未開地なので,
ときどき電力が足りなくなるのである.
-
[今日の運動]
-
[今日の食卓]
- 朝 (0820):
食パン.
- 昼 (1350):
研究室お茶部屋.
米麦 0.8 合.
コンブあえもの.
- 晩 (1830):
手巻ずしぱーてぃー.