jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

2要因の分散分析での交互作用効果と単純主効果検定の関係

今回は、2要因の分散分析をするときの交互作用と単純主効果について説明します。ややこしい話題ですが、具体的なストーリーで説明して、ちょっとでもわかりやすくと思っています。

想定例:学生の専門分野による文章内の図表の挿入効果の違い

今回は、ある文章を読んだ後の理解成績を興味の対象(つまり従属変数)にします。このとき、文系学生(20人)と理系学生(20人)に参加してもらい、文系理系という専門分野の違いが理解成績に影響するかを調べます。

また、文章に関して、図表の有無が操作されていました。これについて図表の有無が理解成績に影響するかを調べます。というわけで、今回は専門分野(理系、文系)と図表(あり、なし)という2つの要因を設定し、従属変数である理解成績に及ぼす影響を2要因分散分析で検討します *1。なお、それぞれの要因の組み合わせの参加人数はそれぞれ10人とします。

主効果

先ずは普通の主効果を考えましょう。図表の有無で理解成績が異なるかを調べます。主効果を検討する場合は、図表の有無のみを考え、学生の専門分野は無視します。つまり、図表ありの文章を読んだ20人の学生と図表なしの文章を読んだ20人の成績を比較します。平均成績を求めたところ、図表なしは平均80点、図表ありは平均85点でした。同じ方式で、専門分野による理解成績の違いの主効果も検討できます。

f:id:jnobuyuki:20160601132654j:plain

交互作用

次に交互作用について考えみましょう。交互作用は組み合わせ次第で生じる効果の大きさの違いに注目します。今回の例では、図表の有無による違いの大きさに着眼します。組み合わせによる効果は、図表の有無による理解成績の違いの大きさが文系学生と理系学生とで異なるかを意味します。

以下では、交互作用の出現パターンに関して3つのストーリーを考えてみます。

交互作用なしの場合

最初に交互作用が全くない場合を考えます。このとき、図表の有無による違いの大きさが、文系学生と理系学生で全く同じであるということになります。ちょっとややこしいのですが、違いの大きさが同じであれば、図表による違いがあってもなくてもどちらでも良いです。今回の例では、こうなりました。

f:id:jnobuyuki:20160601133000j:plain

どちらの専門の学生も、オンデマンド講義を受けた後の成績が対面講義を受けた後の成績よりも5点高いというわけです。

文系では図表の有無による違いがなく、理系だと違いがある場合

次は、いよいよ交互作用がある場合です。先ほど交互作用がない場合で確認した通り、交互作用効果がないというのは、図表の有無による違いの大きさが専門分野で異ならない状態です。そうではないというためには、専門分野で図表の有無による違いの大きさが異なるか調べます。異なるといっても、色々な事なり方があります。このセクションでは、文系だと図表の有無による違いが見られないが、理系だと図表があることによって理解成績が伸びるというシナリオを示します。

f:id:jnobuyuki:20160601133250j:plain

グラフが示すように、文系学生は、図表に有無に関係なく理解成績は80点でした。一方、理系学生は、図表なしの文章についての理解成績は80点でしたが、図表のある文章についての理解成績は90点です。この場合、図表の有無による違いは、理系学生のみに有効だとなります。確認ですが、文系学生の場合、図表の有無による違いは0点、理系学生の場合は10点です。このように図表の有無による違いの大きさが異なる場合に、分散分析の交互作用が有意となります。

文系と理系それぞれ図表に有無による違いがあるが、効果の出方が逆な場合

授業方法による違いが、逆向きの効果で現れるような場合にも、分散分析の交互作用効果が有意となります。グラフで示すと、二つの線が交差するので、目立ちます。

f:id:jnobuyuki:20160601134418j:plain

ここで示されているように、文系学生の場合、図表なしだと85点、図表ありだと80点で図表がない方が理解成績が高いです。一方、理系学生の場合、図表なしだと75点、図表ありあと90点で図表があった方がよいとなります。これも、図表の有無による違いの大きさが専門分野によって異なるので交互作用は有意になります。

ここまでのまとめ

2要因分散分析における交互作用とは、ある要因の効果(今回の例では図表の有無による違い)の大きさが、他方の要因の水準次第で(例では文系か理系か)異なるかどうかを示しています。交互作用が現れるパターンを2つ示しましたが、他にも色々なパターンがあります。そして、気づいて欲しいのは、交互作用が有意になったからといって、どの条件とどの条件に差があるのかを直ちに決定できないことです。これを明らかにするために、次から説明する単純主効果検定を実施します。

単純主効果検定

単純主効果検定では、1つの要因について、ある水準だけの場合を取り上げて、そのデータの範囲内で、もう一方の要因の効果の有意性を検証します。今回の例では、文系の場合、もしくは理系の場合のデータというように、データを一旦分割して、分割されたそれぞれのデータを用いて、図表の有無による違いの検定(この例ならt検定)を行います。ここで、2回のt検定を行うので、有意水準に関する調整が必要です。調整しないと、実際には差がないのにもかかわらず、検定の中で誤って有意差ありとなってしまう可能性が高まります。調整方法はいろいろありますが、しばしば用いられるBonferroni法では、p値に検定する回数をかけて、それでも5%未満になるかを検証します。

注意:分散分析と単純主効果検定の順序

ここで注意して欲しいのは、分散分析が必ず先行します。さらに、分散分析で交互作用が有意になった場合にだけ、単純主効果検定を行うのが一般的です。(研究仮説として、どうしても細かい場合分けを見なければならない場合には、交互作用効果が有意にならなくても、単純主効果検定を実施することがあります。)

*1:この時点で訳がわからないと後半は苦しいです

多重共線性によって重回帰分析の推定は不安定になる(のはなぜか?)

今回は、回帰分析を実用する上で気をつけたい問題の1つである多重共線性について考えます。

多重共線性って?

回帰分析では、一つの従属変数(予測される変数)に対して一つ以上の独立変数(予測する変数)を構成して予測モデルとします*1。このとき、予測する変数を「独立変数」と呼ぶように、予測する変数の間には関連性がない(つまり独立)ことが想定されています。複数の変数で予測するなら似たような者同士ではなく、異なるもので予測したほうが意味があると思えるので、この想定は納得のいくものです。

しかし、社会科学領域でしばしば起こるのですが、何かの調査項目同士にはある程度相関関係が見られます。

ここで相関が少しでも高いと直ちに回帰モデルが作れないわけではなく、ある程度は独立変数間に相関があっても分析可能です。しかし、独立変数間に極端に高い相関があると、予測そのものが不安定になることがあります。例えば、独立変数について推定される回帰係数の正負が直感と反するというようなことが起きます。このような不安定な予測状況を多重共線性による問題があるという言い方をします。

定義から考える原因

推定の不安定さという問題をまずは推定式から考えてみます。2つの独立変数式による回帰モデルの推定は、次のウエブサイトを参考にしました。
http://www.ritsumei.ac.jp/se/rv/dse/jukai/MRA.html

まず、yを予測するためのx1,x2という回帰モデルを考えます。
 y = b_0 + b_1 x_1 + b_2 x_2

この中のb1を推定する式は以下の通りです。証明は、参考ウエブサイトをぜひご覧ください。

 b_1 = \frac{S_{1y}S_{22} - S_{2y}S_{12}}{S_{11}S_{22} - (S_{12})^2}

この式の構成を考えてみましょう。S11とS22はx1とx2の偏差平方和(つまり変数のばらつきの大きさ)です。S1yとS2yはそれぞれx1とy、x2とyの偏差積和(つまり共変する大きさ)です。そしてS12がx1、x2の偏差積和です。

さて、ちょっとだけこの式を離れてx1とx2の相関を示す式を考えます。なぜかというと多重共線性が独立変数間の相関が高いときに生じるからです。
 \frac{\sum_i^n (x_i - \overline{x})(y_i - \overline{y})}{\sqrt{\sum_i^n {(x_i - \overline{x})^2}}\sqrt{\sum_i^n {(y_i - \overline{y})^2}}}

この式を先ほどの推定式の形式で書き換えると次のようになります。

 \frac{S_{12}}{\sqrt{S_{11}}\sqrt{S_{22}}}

2つの変数の相関が極端に高い場合、つまり1に近い場合は上の式の分子と分母がほぼ同じ値になることを意味します。これを利用して、
最初の式の分母を考えてみましょう。式の分母はそれぞれの変数の偏差平方和の積から二つの変数の偏差積和の2乗を引いたものです。つまり、相関係数が1に近いときには分母全体が0に近づきます。一般に分母が0に近づいていくときには分数全体の値が大きくなります。

次に分子をみてみると観測された従属変数と2つの独立変数との偏差積和が出てきます。観測された値は、母集団からのサンプルとみなされるので、観測のたびにばらつきます。先ほど考えた分母が0に近い状況を思い出すと、このばらつきの影響がより強調されると考えられます。

ここまでを要約すると、2つの独立変数間に高い相関がみられる場合には、回帰モデルにおいて推定された回帰係数のばらつきが大きくなります。推定値のばらつきの大きさは、予測の不安定さと言い換えても良いように思えます。というわけで、ここに多重共線性の不安定さが現れると考えられます。

シミュレーションで確かめる

上記のように回帰モデルの推定式から多重共線性における推定の不安定さを考えてみましたが、どうにも抽象的でわかりにくいです。そこで、実際の数値例を利用して上記の考えを確かめてみたいと思います。なお計算にはR言語を用います。

最初に平均100、標準偏差10の正規分布からランダムに1000個のデータをサンプルして従属変数とします。

DependentVar <- rnorm(1000,100,10)

さらに固有値分解という技術を使って、任意の相関係数を持つ2変数を作ります。今回は非常に高い正の相関がみられる場合としてr = 0.95のときと低い相関がみられる場合としてr = 0.1のときを考えましょう。HighCorrVarsにはr = 0.95となる2変数、LowCorrVarsにはr = 0.1となる2変数がそれぞれ含まれています。ケース数は従属変数と同じく1000です。ここで重要なことは、従属変数と独立変数の間には仮想的に無相関となるようなデータ作成法をしていることです。つまり、独立変数は従属変数に対して有意な寄与がない(つまり予測できない)はずです。

ここで交差妥当化の考え方に従って、回帰モデルの安定性を考えてみます。今、ランダムにサンプルされた1000ケースから、さらにランダムに100ケースを選んで回帰モデルのデータとしてみます。これを1000回繰り返すことで、回帰係数のばらつきを評価してみたいと思います。

#1つの独立変数の回帰係数を保存するための配列
#高い相関の場合用
HighCoefArr <- rep(NA, 1000)
#低い相関の場合用
LowCoefArr <- rep(NA, 1000)


for (i in  1:1000){
  #選ぶケース番号をランダムに設定
  randomCaseNum <- sample(1:1000, 100)
  #高い相関を持つ独立変数による回帰分析
    resHigh <- lm(DV[randomCaseNum] ~HighCorrVars[randomCaseNum,1] + HighCorrVars[randomCaseNum,2])
  #低い相関を持つ独立変数による回帰分析
    resLow <- lm(DV[randomCaseNum] ~ LowCorrVars[randomCaseNum,1] + LowCorrVars[randomCaseNum,2])
 #1つめの独立変数の回帰係数を保存
    HighCoefArr[i] <- resHigh$coefficients[2]
    LowCoefArr[i] <- resLow$coefficients[2]
}

このような計算をした結果、回帰係数の分布は以下のようになりました。

f:id:jnobuyuki:20160529072731j:plain

黒が高い相関がみられる独立変数で回帰分析した場合、赤い線は低い相関がみられる独立変数で回帰分析した場合です。分布から明らかなように、高い相関がみられる独立変数を用いると推定された回帰係数の取りうる範囲が広がります。つまり、極端な値が出る可能性が相対的に高く、推定が不安定であると考えられます。

まとめ

今回は、回帰分析の多重共線性の問題を数式とシミュレーションから考えてみました。その結果、多重共線性の問題が回帰係数の推定の不安定さにつながっていることを確認しました。統計学の教科書には、たいてい多重共線性の話題が取り上げられていますが、どうして推定が不安定なのかを述べられることは稀です。しかし、R言語を利用すればシミュレーションを簡単に設定してこういった問題を確認することができます。

*1:従属変数を応答変数、独立変数を予測変数と呼ぶこともあります

標準偏差と平均偏差の使い分け

本日は、割と当たり前に使っていた統計の知識でも、「なぜ」そうするのかを知らなかったという話です。統計学は、実学としての側面を持っているので、こんなことが起きるんですよね。

標準偏差と平均偏差

標準偏差と平均偏差はどちらもデータのばらつきの指標です。下の定義式を見てもらえば分かりやすいと思います。
標準偏差は、代表値からのズレを2乗したものを足し合わせて、データの個数(またはデータの個数−1)で割ったものの平方根です。

 {SD_x = \sqrt{\frac{\sum_{i = 1}^n {(x_i - \overline{x})^2}}{n}}}

一方、平均偏差は代表値からのズレの絶対値を求めて、すべてのデータの個数(またはデータの個数−1
)で割ったものです。
 {AD_x = \frac{\sum_{i=0}^n {|x_i - \overline{x}|}}{n}}

平均偏差を使わないのはなぜ?

一般的にばらつきの指標は標準偏差が利用されます。平均偏差は使われるのを見たことがありません。検索サイトなどで調べると計算の便利さをとって標準偏差が用いられるとあります。確かに、絶対値は場合分けが実際の計算で場合分けが必要になるので、自乗した和の平方根を取る手続きの方が簡単です。

しかし、よく調べてみるとそれだけではないことがわかりました。以下のサイトでは、各データ要素について代表値からのずれを評価する方法として損失関数というアイデアを挙げています。実証的なデータに統計学を利用する場合、データサンプルもしくは母集団の代表値として最も妥当な値を1つ選びます。その妥当性を評価する上で、損失関数を設定する分けです。

tsujimotter.hatenablog.com


詳しくは、ぜひリンク先を見て欲しいのですが、ここで損失関数として標準偏差のようにずれの自乗を計算するか、平均偏差のようにずれの絶対値をとるかで代表値の推定が異なることが指摘されています。ずれの自乗を計算する場合は、いわゆる最小二乗法なので、平均値が代表値となります。一方、ずれの絶対値を計算すると、最も損が少ない値はデータの中央値になるということです。

シミュレーションで確認してみる

では、簡単な数値シミュレーションをして、標準偏差と平均偏差が最も小さくなるときの代表値がそれぞれ平均値と中央値になることを確かめましょう。
検証にはR言語を使います。今回の検証では、確率分布からデータをランダムに発生させます。ここで正規分布を採用すると、平均値と中央値のずれがほとんどないと予想できるので、あえて違う確率分布(対数正規分布)を用います。

# データの生成
simData <- rlnorm(1000)

シミュレーションでは、生成したデータの最低値と最高値を計算します。最初に最低値を分布の代表値と仮定し、標準偏差と平均偏差をそれぞれ求めます。次に、最低値よりも少しだけ大きな値を代表値にします。そして、データの最大値を代表値とする場合まで、次々に繰り返します。
最後に、すべての計算結果からいつ標準偏差と平均偏差が最小になるかを調べてみましょう。

#最小値と最大値の取得
minData <- min(simData)
maxData <- max(simData)

#繰り返しの回数を求める
numIteration<- round((maxData - minData)/0.0001)

#計算結果の保存用配列を作成
## 標準偏差用
arrSD <- NULL
## 平均偏差用
arrAD <- NULL

for (i in 1:numIteration){
  
  repData <- minData + 0.0001 * i

  resSD <- sqrt(sum((simData - repData)^2)/length(simData))
  resAD <- sum(abs(simData - repData))/length(simData)

  arrSD <- c(arrSD, resSD)
  arrAD <- c(arrAD, resAD)
}

一度手元のPCで計算してみたところ*1、minDataは0.04240865、maxDataは65.70159、numIterationは656592となりました。
標準偏差と平均偏差を保存したデータの中かからいつ値が最小になったのかを求めます。

# SDが最小となるような代表値
minData + 0.0001 * which.min(arrSD)
# ADが最小となるような代表値
minData + 0.0001 * which.min(arrAD)

計算の結果、SDが最小となるような代表値は1.708909、ADが最小となるような代表値は0.9827087でした。
では、最後にこのデータの平均と中央値を計算してみます。

mean(simData)
median(simData)

計算結果は、平均値が1.708862、中央値が0.9834444でした。正確な一致ではありませんが、おおよそ標準偏差が最小となるような代表値は、データの平均値であり、平均偏差が最小となるような代表値はデータの中央値であることがわかります。

*1:乱数の生成がコードに含まれています。よって計算結果は毎回異なります。

R言語で区切り文字による文字列の分割

今回は、区切り文字を指定して、文字列を分割してリスト化する方法を紹介します。

strsplit関数

strsplit関数を使うと任意の文字を区切り文字として、文字列を分割できます。例えば以下のように使います。

input <- "abc def ghi"
res <- strsplit(input, " ")

区切り文字は正規表現

区切り文字はスペースやタブ(\t)などを指定しますが、実は、正規表現の扱いになっています。なので、+(1文字以上の繰り返し)のような表現を加えると、スペースやタブスペースが連続して入っている箇所を1回の区切りとして扱えます。

#abcの後にはスペースが一つ、defの後にはスペースが2つ入っています。
input2 <- "abc def  ghi"

res2 <- strsplit(input2, " ")
#これだとabc, def,その後に空要素、そしてhgiが続きます。

res3 <- strsplit(input2, " +")
#これだとabc, def, hgiだけになります。スペース2文字を区切り文字扱いするので、空要素ができません。

unlist関数でリスト内容にアクセス

strsplit関数の出力結果は、リストオブジェクトです。このオブジェクトだと、要素数が1で、分割した文字列にアクセスできません。そこでunlist関数を利用して、出力結果を配列にします。

input <- "abc def ghi"
res <- strsplit(input, " ")
length(res)#1がかえります
res2 <- unlist(res)
length(res2)#3がかえります。インデックスで[1]から[3]を指定すると各要素にアクセスできます。

研究者とは何をする人か?それに必要な資質は?

今回は、「研究者って何か?」を考えます。一応研究者であるので、職業としての研究者や自分の経歴を紹介する機会があります。しかし、先日のそのような機会では、そもそも研究者が何かをうまく語れなかったんです。なので、反省文も兼ねて、研究者やその資質について思うことをまとめておきます。

研究って何?

あらためて「研究とは?」と考えてみると、意外に定義が難しいのですが、なるべく短い言葉で言うなら「新たな知の創造」だと思います。今まで誰も知らなかった問題の答えを見つける。または、ある現象を今まで誰も考えなかった方法で説明するといった感じです。言葉としては短いですが、これを成し遂げるのはなかなか大変です。なぜなら、それが信頼できる知識であることを周りに認めてもらわなければならないからです。例えば、新しい知識を裏付けるきちんとした証拠が必要です。それが、実験や調査によって得られるものであれば、誰がやっても結果を再現できるだけの必要十分な手続きの記述がいります。また、結果の解析方法やその解釈に論理の飛躍があってはなりません。そういった一連の作業をまとめ上げたものが論文となります。

次に、知の創造をもう細かく考えると2種類別れると思います。1つは「新しい価値の創造」で、新たな知見が世の役に立つような場合です。もう一つは「新たな知識の創造」で、役に立つかどうかはおいておいて、今までわかっていなかったことを知識として定着させるような場合です。ただし、この2つは排他的なものではなく、両者を兼ね備えることも可能だと思っています。これについては、「パスツールの象限」という記事を以前に書きました。

webbeginner.hatenablog.com


また、「新たな」知の創造となるためには、「今までに何がわかっているか」をきちんと把握することも重要です。よく言われる「巨人の肩に乗る」という言葉が表しているように、歴史を作ってきた大研究者やその人たちが作ってきた知識体系に敬意を払い、さらに自分で新しい何かをそこに加えていくのが研究者なのかなと思います*1

研究者ってどうやってなるもの?

研究さえしていれば、研究者なので、どうやってという問いは本来成り立たないかもしれないですね。しかし、職業としての研究者を目指すのであれば、基本的には大学学部の卒業に加えて、修士または博士課程の大学院を修了する必要があるでしょう。特に、大学でのポストを望むのであれば、最近は博士号取得がほぼ必須になっています。ただし分野によっては、一度専門職として社会に出てから、研究者として大学・研究所に入るようなキャリアパスも考えられます。

研究者として重要な資質は何?

世の研究者のイメージとしては「勉強が得意・大好きな人」なのかなと思います。確かにそういう人が多いです。でも、勉強が得意・好きなだけでは、「研究者」としてやっていけるかどうかはわからないと思います。私が、研究者になくてはならない資質の一つとして考えるのは、「批判的精神をもっていること」です。ここでいう批判とは、理屈もなく他を否定することでもないですし、揚げ足取りをすることでもないです。上記のような、新たな知となる可能性があるものを「本当にその説明でいいのか」疑ってかかる精神のことを指しています。これは、他に向かうばかりでなく、ときには自分の考え、データ、解析方法も批判的に見る必要があります。例えば、どんなに業績のある人が言ったことでも、教科書に載っていることでも「本当にそれでいいか」自分の頭で一度考えてみるのが、批判的精神です。常に疑ってかかるという意味では、かなり面倒臭い人です。でも、それがあることで、真摯な研究が成り立ちます。

ただ、誤解して欲しくないのは、批判的な精神は、もとからある性格のようなものではなく、トレーニングによって習得するものだと思います。なので、これから研究者を目指すあなたが現時点で批判的精神を持ち合わせていなくても大丈夫。徐々に的確な批判ができるように訓練していきましょう。

*1:google scholar という学術文献検索のサービスのページに「巨人の肩に乗る」という言葉があるのはこの意味でしょう

Dockerを利用してRStudioのRマークダウンファイルを使う

今回は、かなり技術的な内容です。Dockerを利用しながら、RStudioのRマークダウンファイルによる解析環境を構築します。ポイントは、日本語フォントが入っていてもきちんとPDF出力がなされるところです。

Dockerって?

Docker社が提供しているサービスです。 PC内に仮想のコンテナをつくって、コンテナ内でいろいろな情報処理を行います。いわゆる仮想PCと違うのは、必要なサービスだけを高速かつ少ない容量で仮想化しているところです。Docker自体の説明は、詳しいページがいくらでも検索できるのでそちらをごらんください。

bufferings.hatenablog.com

使用環境

今回はMac OSXに Docker Toolboxをインストールした環境で実施しています。 Docker Toolboxは更新が頻繁にあるようで、しかも更新によって動かなかった機能が動くようになっているので、できるだけ最新を使ったほうが良さそうです。

  • Mac OSX 10.10.5(Yosemite)
  • Docker Toolbox 1.10.1a

Dockerfileで環境構築

Dockerfileやベースとなるイメージもすでにきちんと動いているものを利用します。この点もDockerのメリットの1つですね。
RStudioが動くイメージの一つにrocker/rstudioがあります。このイメージでは、ベースのRとRstudioがdebianというLinux OSの中で動きます。

https://hub.docker.com/r/rocker/rstudio/

さらにrocker/rstudioから派生したrocker/hadleyverseというイメージファイルがあります。このイメージのDockerfileを今回利用します。

github.com


このDockerfileをdocker-machineの中でビルドすれば、当然ちゃんと動きます。しかし、実際にやってみたところ、日本語フォントがうまく読めないようです。そこでDockerfileを修正しながら、日本語フォントでもきちんと動作することを目指します。

Hadleyverseというイメージとの差分

  • manというパッケージのインストールを省略(エラーがでたため)
  • texlive-xetex, texlive-luatexをインストール(後でRマークダウンファイルをPDFに変換するのに使います)
  • texlive-font-extraをインストール(rocker/hadleyverseの作成者はファイルが思いので嫌がっていますが、日本語フォントの表示には必要そうです)
  • multcompというRのパッケージのインスールを省略(エラーがでたため)
  • IPAフォントのインストール(Debianの中で使用可能な日本語フォントが不明だったので、ダウンロードして使います)
  • 言語環境を英語から日本語に変更

出来上がったDockerfile

Dockerfileは"Dockerfile"という名前で保存する必要がありそうです。

FROM rocker/rstudio

MAINTAINER "jnobuyuki" 


RUN apt-get update 
RUN apt-get install -y --no-install-recommends \
    ibus-mozc \
    manpages-ja 

RUN apt-get install -y --no-install-recommends imagemagick \
	lmodern \
	texlive \
	texlive-lang-cjk \
    texlive-luatex \
    texlive-xetex \
	xdvik-ja \
	dvipsk-ja \
	gv \
	texlive-fonts-recommended \
	texlive-fonts-extra \
	&& apt-get clean \
	&& cd /usr/share/texlive/texmf-dist \
	&& wget http://download.forest.impress.co.jp/pub/library/i/ipafont/10483/IPAfont00303.zip \
	&& unzip IPAfont00303.zip \
	&& echo "Map zi4.map" >> /usr/share/texlive/texmf-dist/web2c/updmap.cfg \
  	&& mktexlsr \
  	&& updmap-sys




## Install some external dependencies. 
RUN apt-get update \
  && apt-get install -y --no-install-recommends -t unstable \
    default-jdk \
    default-jre \
    gdal-bin \
    icedtea-netx \
    libatlas-base-dev \
    libcairo2-dev \
    libgsl0-dev \
    libgdal-dev \
    libgeos-dev \
    libgeos-c1v5 \
    librdf0-dev \
    libssl-dev \
    libmysqlclient-dev \
    libpq-dev \
    libsqlite3-dev \
    libv8-dev \
    libxcb1-dev \
    libxdmcp-dev \
    libxml2-dev \
    libxslt1-dev \
    libxt-dev \
    netcdf-bin \
    qpdf \
    r-cran-rgl \
    ssh \
  && R CMD javareconf \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/ \
  && rm -rf /tmp/downloaded_packages/ /tmp/*.rds

## Install the Hadleyverse packages (and some close friends). 
RUN install2.r --error \
    broom \
    DiagrammeR \
    devtools \
    dplyr \
    ggplot2 \
    ggthemes \
    haven \
    httr \
    knitr \
    lubridate \
    packrat \
    pryr \
    purrr \
    reshape2 \
    rmarkdown \
    rmdformats \
    rticles \
    rvest \
    readr \
    readxl \
    testthat \
    tibble \
    tidyr \
    tufte \
    shiny \
    stringr \
    xml2 

## Manually install (useful packages from) the SUGGESTS list of the above packages.
## (because --deps TRUE can fail when packages are added/removed from CRAN)
RUN install2.r --error \
    -r "https://cran.rstudio.com" \
    -r "http://www.bioconductor.org/packages/release/bioc" \
    base64enc \
    BiocInstaller \
    codetools \
    covr \
    data.table \
    downloader \
    gridExtra \
    gtable \
    hexbin \
    Hmisc \
    htmlwidgets \
    jpeg \
    Lahman \
    lattice \
    lintr \
    MASS \
    PKI \
    png \
    microbenchmark \
    mgcv \
    mapproj \
    maps \
    maptools \
    mgcv \
    nlme \
    nycflights13 \
    quantreg \
    Rcpp \
    rJava \
    roxygen2 \
    RMySQL \
    RPostgreSQL \
    RSQLite \
    testit \
    V8 \
    XML \
  && r -e 'source("https://raw.githubusercontent.com/MangoTheCat/remotes/master/install-github.R")$value("mangothecat/remotes")' \
  && r -e 'remotes::install_github("wesm/feather/R")' \
  && rm -rf /tmp/downloaded_packages/ /tmp/*.rds

RUN echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

Dockerでの手順

1. Docker-machineを起動する
2. cd で Dockerfileがあるディレクトリに移動する
3. 以下のようにDockerfileからイメージをビルドする

docker build -t <レポジトリ名/イメージ名> .

4. 以下のようにイメージを起動する。-p オプションはホスト側とコンテナ側のポート番号のマッピングです。両方8787でオッケーです。

docker run -d -p 8787:8787 <レポジトリ名/イメージ名>

5. webブラウザを起動し、Docker-machineのIP:8787 でRstudioのログインが出てきます。デフォルトはID,PASSともにrstudioです。

以上でRSutdioが起動すると思います。

RStudioでの手順

1. New FileでRmarkdown形式のファイルを作る
2. Global optionのSweave項目でviewerをデフォルトのRstudio viewerからSystem Viewerに変更する *1
3. preamble(ヘッダのような部分)を以下のようにします。タブスペースの個数がポイントです。

---
title: "Document Title"
author: "autho"
date: "****/**/**"
output:
  pdf_document:
    latex_engine: xelatex
monofont: IPAPGothic
mainfont: IPAPGothic
---

このDockerイメージはIPAフォントをダウンロード・インストールしているので、これを使います。latex_engineはlualatexかxelatexが使えます。
5. knit PDFのボタンを押すか、ショートカット(Command + Shit + k)を実行します。

考察:Dockerを使うメリットとデメリット

手順は以上ですが、 Dockerを利用して解析することのメリットとデメリットを考えておきましょう。

メリット
  • 突然母艦 PCが亡くなっても、1時間あれば解析環境が完全復活する。
  • 共同研究者に同一解析環境を丸ごと渡せる。
  • 授業で学生に開発環境をデータ込みで配布できる。
  • 古いバージョンのアプリケーションによる解析環境を安全に保存できる。
デメリット
  • 別に仮想環境がなくてもmacで十分動くものについてわざわざコンテナを組むのは多少面倒
  • 共同研究者にDockerのメリットを理解してもらい、最低限のコマンドを覚えてもらうよう説得しなければならない。
  • ダブルクリックと比較するとCUIで RStudioを実行するのは面倒

今のところ、多少の学習コストとタイピングを我慢すれば、大きなメリットを得らえる気がします。macはどんなに良い製品であっても、使い続ければ必ずダメになる日が来るので、その時の手間を大幅に節約できるだけでも便利な気がします。

*1:RStudio viewerは日本語フォントが文字化けする気がします

学会・研究会における保育サービスについて思うこと

今回は、子育て世代研究者あるあるのような話題で、それについて思うことを書きます。

学会における保育サービス

学会や研究会において、子連れでの参加を促すために保育サービスが提供されることがあります。子育て世代の研究者にとって、このサービスはその学会への参加を大いに助けてくれる貴重なものだと言えます。しかし、実際にサービスを利用できるかは、料金次第であるというのが本音です。

サービスの使用料金はいろいろ

まず、このようなサービスは学会・研究会参加者全員へのサービスではないので、受益者負担が生じるのはしかたないと思います。それにもかかわらず、日本教育心理学会第57回総会や第79回日本心理学会大会のように無料でサービスが提供されることもあります*1
confit.atlas.jp
実際には、いくらか利用料がかかることがほとんどです。高くて利用できなかった例としては、1時間当たり1500円と言われたことがあります*2

学会でサービスが提供されない場合

大きな学会では、保育サービスは当たり前になりつつあると思いますが、小さな研究会ではまだ少ないです。それでもどうしても参加したい研究会があります。では、どうするか?私の場合は、所属している企業・大学の福利厚生サービスの利用を考えます。実際に、提携している認証保育所へ一時間300円で預かってもらったこともあります。差額を企業の福利厚生サービスで負担してくれているわけです。1時間当たり300円なら半日預けても2000円もかからないので、負担可能な範囲かなと思います*3

現状の問題とそれへの提案

学会が提供するサービスや会社の福利厚生サービスは、貴重なのですが、それが受けられないケースは結構あると思います。例えば、大学院生は福利厚生サービスを受けられないと思うので、学会が保育サービスを提供していないといきなり行き詰まります。あとは、福利厚生サービスを利用できたとしても、何をどうやって利用するかの手続きが煩雑な場合がほとんどです。学会発表、宿泊先の確保に加えて、保育サービスの手配とその助成手続きとなるので、手続きのための時間を確保できないことがあります。このような問題が生まれる背景として、大学や企業による保育サービスへの支援が、個人を対象としていることが挙げられます。
例えばこれを、保育サービスを提供しようとしている学会・研究会を対象にしたとします。すると、サービスを利用したいと考えている人たちをより確実にサポートできる気がします。では、どうすればこれを確立できるか?最近の学会では、使用費目を明らかにしたスポンサー企業があるようです。
http://www.anlp.jp/nlp2016/#sponsor
上記の懇親会・茶菓スポンサーと同様の扱いで「保育サービススポンサー」を募るのはどうでしょうか?スポンサー企業によっては、保育サービススポンサーになることの宣伝効果を期待できる場合がある気がします。もちろん文部科学省がこのような保育サービス支援助成金の制度を作ることもありだと思います。

*1:本年開催の日本教育心理学会第58回総会でもこのサービスは無料で提供されるようです

*2:もちろんないよりずっと良いですが、5時間預けて7500円は負担としてかなりのものとなるでしょう

*3:何を高いまたは安いと思うかは当然個人によります