12月22日の記事です。私の筋トレのデータをつかって状態空間モデルで遊んでみた、という内容です。今年は状態空間モデルの素晴らしい記事が多いので恐縮ですが。すみません、僕には筋肉しかないんです。基本的にHijiyamaR#finalでLTしたものと同じです。体を動かすことが好きで、院生の時は走ったりしていましたが、あまり時間が取れなくなり、短時間でちゃんと運動した感が得られる筋トレをしていました。最近はあまりトレーニングできていません。好きな種目はデッドリフトです。広島ベイズ塾の2016年の夏合宿で、山口大学の小杉先生から状態空間モデルを教えてもらいました。Calendarに小杉先生の書かれたStanで体重の推移をみつめてみた(状態空間モデル)という記事があります。面白いなと思って、それからトレーニングデータを記録しておくことにしました。今回あつかうデータは、デッドリフトの第一セットの使用重量と挙上回数の67時点のデータです。使用重量と挙上回数から最大挙上重量(1RM)が計算できるので、そのデータを使います。デッドリフトをするのはよくて週2回とかなのでデータがたまるまで結構かかってしまいました。あと、日付を記録しておくのを忘れていたため、時点の間隔が一定ではないのが問題です。Calendarで何回もでてきていますので、詳しくはそれらの記事を参照してください。ある時点の状態は1つ前の時点の状態から変動する、と考えます。状態空間モデルは筋トレを例にすると説明しやすい。状態=筋力、観測値=パフォーマンス、と考えればよいのです。最大挙上重量をプロットしたものが下の図です。筋力がそんなばらついているはずがない。?筋トレのパフォーマンスは結構ぶれます。同じ週でも、前回扱えた重量がめっちゃ重く感じたりします。睡眠不足だったり、疲れてたり、気分がのらなかったり、ご飯食べてなかったり、そんなこんなで、筋力の変動はある程度小さくても、パフォーマンスはわりと変動するのです。知りたいのは筋力の変動なので、パフォーマンスの変動と分けて考えれる状態空間モデルはとても便利。以下では、3つのモデルを扱います。間違いがあればご指摘ください。ローカル・レベル・モデル一番シンプルなモデルです。nに対して次のようにあらわせます(tは時点、yは観測値、μは状態)。状態のレベル要素が時点によって局所的に変動することを認めるので、ローカル・レベル・モデルといいます。nに対して次のようにあらわせます。レベルをモデル化するものと傾きをモデル化する式の2つの状態方程式があります。傾きの要素が時点によって局所的に変動することを認めるので、ローカル線形・トレンド・モデルといいます。グローバル・トレンド・モデルローカル線形・トレンド・モデルでは傾きの時点による変動を認めていますが、「傾きは固定」と考えることもできます。nに対して次のようにあらわせます。傾きの要素は時点によって局所的に変動することを認めない(=大域的に決まっていると考える)ので、グローバル・トレンド・モデルと呼んでおきます。なんと呼ぶのが一般的なのでしょうか。これら3つのモデルで分析した結果です。μtの80%信頼区間と予測分布をグラフにしたものです。StanとRでベイズ統計モデリングを参考にしております。おせわになっております。左からローカルレベル、ローカルトレンド、グローバルトレンド、で分析したグラフです。予測分布のかたちを見てください。ローカルレベルでは、前の状態に誤差がのっていくだけなので、予測分布の中央値(黒線)は推定された最後のデータ時点のμの中央値156.58からほとんど動いていません。これに対して、ローカルトレンドとグローバルトレンドでは、傾きの成分がありますので予測分布の中央値が上がっていっています。ローカルトレンドで推定された、最後のデータ時点のμの中央値は156.28で、νの中央値は0.56でした。グローバルトレンドで推定された、最後のデータ時点のμの中央値は156.38で、(時点で変動することを認めない)固定値としての傾きνの中央値は0.59でした。ローカルレベルでの最後の時点での傾きの推定値とグローバルトレンドでの固定した傾きの推定値がほとんど一緒の値なので、予測分布の中央値は同じような傾きになっています。ローカルトレンドでは、レベルの変動だけでなく傾きの変動も加わりますので、予測分布の広がりは傾きの変動を仮定しないグローバルトレンドよりもどんどん大きくなっていきます。ローカルトレンドとグローバルトレンドの違いが見えにくいかと思いますが、これはデッドリフトのデータがたまたま最後の傾きと全体的な傾きが似ていたことによります。オーバーヘッドプレスのデータ(87時点)があったので、このデータで分析した結果が下の図です。オーバーヘッドプレスはデータの最後の方は飽きがきていて、同じ重量で同じ回数こなす作業、という感じでした。そのため、グローバルトレンドではデータの最初の方の伸び率も含まれますので予測分布の中央値は上がっていますが、ローカルトレンドでは最後の方の作業感の影響をうけて傾きがない状態になっています。傾きの推定値の中央値は、グローバルトレンドでは0.21、ローカルトレンドでは-0.03(最後の時点の傾き)となっていました。筋トレのデータを3つの状態空間モデルで分析してみて、モデルの違いが実感できました。ここからは私の個人的な問題になるのですが、筋トレデータに状態空間モデルをあてはめて分析したいと思ったのは、推定された筋力に基づいて、今日のトレーニングの内容を決めたかったからです。筋肥大に適切な負荷は最大挙上重量の70%から85%(6回から12回ぎりぎり反復できる重さ)といわれています。重さは前回のトレーニングでどれくらいを扱えたのかを参考に「今日はこの重さで何回くらいかな」と決めるのですが、これをもっとちゃんと決めたい。あとは発生させたMCMCサンプルをつかって計算するだけなので簡単です。バーベルにつける重りは一番軽くて1.25kgです。2.5kgきざみでしか調整できません。細かい重量設定は個人的に結構めんどくさいのです(重りをつけるだけなんですが)。扱いたい重さを決めて、何回やればいいのかを提案してもらうようにしました。MCMCサンプルの平均値をつかって計算すると、120kgでトレーニングしたい場合には10回を目標にすればよいことがわかります。現時点での筋力が分布で得られているので、回数も分布で知りたいですよね。発生させたMCMCサンプルをすべて使って挙上回数を計算し、ヒストグラムにしたのが下の図です。「普段よりもちょっと負荷をあげる」という漸新性過負荷の原則に従えば、11回を目標にするとよいかもしれません。7回以上はほぼ確実に(99.5%)あがることがわかります。仮に、9回しかあがらなかったとしても、その確率は36.4%なので、まぁそんなもんかな、と思うこともできます。まとめこのように状態空間モデルをベイズでやることによって、今日のトレーニングで何回を目標にするのかが決めやすくなり、また挙上回数の変化に一喜一憂することもなくなるかと思います。ちなみに、今回のような使い方をするのであれば、ローカルレベルモデルで十分かなと思いました。ローカルトレンドモデルだと、特に傾きの変動の標準偏差の収束が悪く、結構時間がかかりました(といっても10分くらいなのですが)。今回扱ったモデルのコードは続きにおいています。StanとRでベイズ統計モデリングを参考にさせていただきました。私が手を加えた部分もありますので、間違いがあればご指摘ください。コメントをキャンセルメールアドレスが公開されることはありません。