JuliaからRCallを使ってANOVA君を呼び出す

ANOVA君は、井関龍太氏が開発している、Rで動作する分散分析プログラムです。様々な実験計画に対応できるようになっており、分散分析に加えて多重比較や単純主効果の検定もやってくれます。自分ではlm()とかaov()なども使ってはいますが、ANOVA君は一回の関数呼び出しですべてを面倒見てくれるのでとても重宝します。

riseki.php.xdomain.jp

数年前に僕がPythonに移行できなかった理由の一つに「まともな分散分析ツールがない」ということがありました。1要因や簡単な2要因のものくらいなら見つかるのですが、3要因以上だったり2要因でも混合計画のものは見つからず、かといって自分で作るのも車輪の再発明をしているかんじでイヤだったのです。Juliaに移行するにあたっても同じ理由でRを捨てられずにいます。

しかし、JuliaはPythonともRとも親和性が高く、それらで書かれたプログラムも簡単に呼び出すことができます。今日は、JuliaでRを呼び出してANOVA君を使う例を紹介します。

続きを読む

本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2017-09-15 10004.7 3.09 123.96 53.03 2.34
2017-10-04 10152.2 2.08 125.96 70.91 1.78
2017-10-18 10314.9 3.42 125.73 47.57 2.64
2018-05-05 10499.5 3.18 137.74 58.05 2.37
2019-06-08 10607.9 2.40 148.75 45.17 3.29
2019-07-13 10753.3 3.20 137.81 45.44 3.03
2020-02-22 10890.0 2.67 141.95 51.20 2.77

本当に久しぶりに給油。2018年は185 km、2019年は250 kmていどしか走っていない……。

Land of Lisp第7章

Land of Lispを読んでいます。日本語版も英語版も英語電子版も持っているのに、読み終わる前に投げ出して、また最初から読み始めるということを何度も繰り返しています。以下、日本語版と英語Kindle版へのアフィリンクです。

本書で使用しているCommon Lisp処理系はCLISPなのですが、ネットで見かけるLisperたちは「開発段階ではコンパイルの速いClozure Lisp、デプロイはSBCL」と言っていることが多いので、僕もSBCLを使って読み進めています。

第7章でdot->pngという関数が登場するのですが、その中(p.115の7行目)に

(ext:shell (concatenate 'string "dot -Tpng -O " fname))

という部分があります。ここで使われているext:shellCLISP独自の命令なので、SBCLで動かすには書き換えないといけません。

さいわい少し調べただけで、SBCLでシェルからプログラムを実行するにはsb-ext:run-programを使えばよいと分かりました(SBCLマニュアルより7.7.3 Running external programs)。sb-ext:run-programは実行するプログラム名とそのプログラムへの引数リストの2つを指定して呼び出します。プログラム名はフルパスで書く必要があるようです(シェルからサーチパスを取ってくるなどすればよいのかもしれませんが……)。

最初は

(sb-ext:run-program "/usr/local/bin/dot" '("-Tpng" "-O" fname))

でいけると勘違いしていたのですが、これだとfnameに入っているファイル名が展開されないので、

(sb-ext:run-program "/usr/local/bin/dot" `("-Tpng" "-O" ,fname)))

とquasi-quoting(準クォート)してやることで解決しました。

結果として、SBCLで動くdot->pngは以下のようになりました。

(defun dot->png (fname thunk)
  (with-open-file (*standard-output*
                   fname
                   :direction :output
                   :if-exists :supersede)
    (funcall thunk))
  (sb-ext:run-program "/usr/local/bin/dot" `("-Tpng" "-O" ,fname)))

-Tpng-Tpdfとかにすると、さらにきれいなグラフが得られます。


……と、作業し終えたところで下のようなページを見つけました。同じくsb-ext:run-programを使っていますがdotを直接起動するのではなくshを通して起動するようになっていて、僕のコードよりも環境非依存に近いかと思います。

lambdacadabra.blogspot.com

続 Wikipediaのフォントを変えてみた

数年前に、Wikipediaを読みやすくするためにCSSをいじって調整しました。

marui.hatenablog.com

今日は、英語版と日本語版とでハイフネーションの挙動を変えてみました。具体的には以下のようになっています。:lang(en)を使って英語版では両端揃えでハイフネーション有り、日本語版(というより英語以外)ではデフォルトのまま左揃えでハイフネーション無しになるようにしています。

p:lang(en), dd:lang(en), li:lang(en){
    -webkit-hyphens: auto; -ms-hyphens: auto; hyphens: auto;
    text-align: justify;
}

Juliaパッケージのインストール・スクリプト

新しい環境にJuliaをインストールするときに、自分が使うパッケージ群をまとめてインストールしたいことがあります。

僕の場合、以前はテキストファイルに

add Atom
add Juno
add IJulia

のように書いたものを準備しておいて、Pkgモードにコピペするようにしていました。パッケージの数が少ないときはそれでいいのですが、パッケージをインストールする順序によって成功・不成功が変わったりする問題に遭遇しました(→Julia 1.3.1にSampledSignalsをインストールした - 丸井綜研)。さらにコピペするのも面倒ですし、インストール作業の再現性なども考慮すると、すべてを自動化できるのが理想的です。

そのため、パッケージ群をインストールするスクリプトを作っておいて、まっさらなJulia上でそれを実行することで「いつもの作業場」が再現できるようにしています。以下、僕が使っているスクリプトです。julia13_install.jlというファイル名で保存してあれば、

julia> include("julia13_install.jl")

と読み込むだけで、パッケージのインストールとプリコンパイルをしてくれます。

続きを読む

2019年に買って良かったもの(アフィ注意!)

2019年にAmazonで買ったものから、買ってよかったなーと思ったものを書き残しておこうかと思います。

(TLDR; ホットクック、Skyrimウクレレベイズモデリングの本、教育心理学の本、でした)

※商品画像込みで簡単にリンクを付ける方法が分からなかったので、以下のリンクは全部Amazonアソシエイトによるアフィリエイト・リンクになってしまっています。アフィリエイトが嫌いな方は踏まないようにご注意ください。

続きを読む

Julia 1.3.1にSampledSignalsをインストールした

先日のアドベントカレンダーへのエントリ中で、「今回のエントリはJulia 1.0.5用に書いています。というのも、Julia 1.2や1.3あたりからLibSndFileなどのインストールがうまくいかない状況になっているからです」と書きましたが、それが解決できたので記録を残しておきます。

marui.hatenablog.com

(TLDR; SampledSignalsの前にUnitfulをインストールしないこと)

続きを読む