99ルール - ブートストラップは99回反復しろ!

今回は潜在クラス分析のBLRTのエントリの積み残しである。

RandomLCAパッケージを用いた潜在クラス分析とBLRT[R]

先のエントリーでは修正値を変更すればブートストラップの反復回数は連動して変えられるのでは?と書いていたが、修正値は1のままで、一般的にはブートストラップの反復回数を変化させるようである。

99ルールとはBoos(2003)で使われている言葉で99とはブートストラップの反復回数である。なぜ99回なのかというと、計算式の中で修正値として1を加算するため、99+1=100となるためである。Boosが呼んでいるだけで広く使われているわけではなさそうである。うっかり正式な場では使わないように気をつけたい。

projecteuclid.org

ブートストラップのP値はb / Bで計算する。bとは検証対象の仮説よりも、代替仮説の統計量の方が大きい数である。

潜在クラス分析でいうと、例えば2クラスモデルから3クラスモデルにしてモデルが改善したかを見る場合、3クラスモデルが検証対象の仮説になり、2クラスモデルが代替仮説になる。対数化して差を取るので尤度比の部分である。

Bはブートストラップの試行回数である。Davison & Hinkley(1997)の148ページの式を分割して書くと以下のようになる。

p_{B} =\frac{  \sharp \ T_i^* \geq T_0}{B} \tag{1}

 p_{boot} =\frac{(p_B +1)}{(B + 1)} \tag{2}

Boos(2003)によれば、一般的には(p_B +1) / (B + 1)というP値を使うそうだ。先ほどあげたブートストラップの代表的な教科書であるDavison & Hinkley(1997)でも書かれている内容である。

Bootstrap Methods And Their Application (Cambridge Series in Statistical and Probabilistic Mathematics)

Bootstrap Methods And Their Application (Cambridge Series in Statistical and Probabilistic Mathematics)

Efron & Tibshirani(1993)では異なったP値の考え方も紹介されているらしいが、それほど興味がないので、このくらいにしておこう。

An Introduction to the Bootstrap (Chapman & Hall/CRC Monographs on Statistics & Applied Probability)

An Introduction to the Bootstrap (Chapman & Hall/CRC Monographs on Statistics & Applied Probability)

潜在クラス分析のブートストラップの試行回数

こちらは潜在クラス分析のブートストラップを提案した論文に既に書いてあった。

rss.onlinelibrary.wiley.com G. J. McLachlan, 1987, "On Bootstrapping the Likelihood Ratio Test Statistic for the Number of Components in a Normal Mixture." Applied Statistics, Volume36, Issue3: 318-324.

McLachlan (1987)はシミュレーションをしてブートストラップの反復回数は最低99回必要だと述べている。

ということで、99を選択するのがよさそうである。

考察

Beathは999回を指定していたが、時間に余裕があるか、PCスペックに余裕のある時だけでよさそうだ。経験的には、反復回数を100から1000にしたからと言って、推定結果が大きく異なったということは、あまりないので、99ルールは妥当なところだと思う。

99ルールとは言っているものの、分母が割り切れる数であればいいので199回(+修正値1=200)でも問題はない。とりあえず、分数の分母に来た時に、1) 99回以上であり、2) 1を足して分母になった時に必ず割り切れる数となるようになればいいのだ。

フリーでアクセスできるものとしては、こちらの論文も参考になると思う。 europepmc.org

おまけ

先のエントリではCPUにRyzen 5 3600を搭載したPCで273.61秒と4分半くらいであった。
Ryzen 5 3600は2019年7月発売のCPUで研究者が一般的に使っているPCよりかなり処理速度が速いので、普段使っているノートPCでも同様のテストをしてみた。 CPUはIntelCore i5 7200Uである。

ベンチマークの結果は言うまでもなく、圧倒的にRyzen 5 3600が速い。 Please click the green button to continue. - UserBenchmark

f:id:iDES:20191126043835p:plain

Ryzenとは違って並列処理がされ始めた。びっくりした。

   ユーザ   システム       経過  
    396.83       1.21     424.18 

だいたい7分くらいかかっている。 性能差ほど時間差は出ていない。ユーザー時間がRyzenのシングルコア処理で272.84 だったので、並列処理がされていることも確認できる。

IntelのCPUの方がAMのCPUよりもRのブートストラップはうまく作動するのかもしれない。

少し世代は古いがSkyLake世代のPCもあるので、そちらでも計測してみた。
Core i7 6700である。Core i5 7200Uよりは古いが、性能的にはCore i7 6700の方が高い。
https://cpu.userbenchmark.com/Compare/Intel-Core-i7-6700-vs-AMD-Ryzen-5-3600/3515vs4040

f:id:iDES:20191126045848p:plain

いくつかのコアは使われているが、並列処理をしている感じではない。

   ユーザ   システム       経過  
    286.78       1.48     395.47 

6分半くらいである。ベンチマークの結果とも乖離していない結果である。こちらはユーザー時間からシングルコア処理であったことがわかる。
SkyLake世代は単純なシングルコア処理だが、KabyLake世代だとCPUの方でうまく並列処理をするようになっているのかもしれない。

ともあれRyzen 5 3600が最も速いことには違いがないので、できるだけ速いCPUでやった方がいいという、当たり前の結果ではあった。
個人的にはリモートで Ryzenを載せたPCに処理をさせようと思う。
もちろん速いCPUを使えるに越したことはないが、ここ2~3年くらいの間に作られたCoreシリーズかRyzenシリーズのPCで計算すれば問題なく使えるレベルだろう。