筋トレと状態空間モデルと私



この記事は Stan Advent Calendar 2017 の12月22日の記事です。私の筋トレのデータをつかって状態空間モデルで遊んでみた、という内容です。今年は状態空間モデルの素晴らしい記事が多いので恐縮ですが。すみません、僕には筋肉しかないんです。

基本的にHijiyamaR#finalでLTしたものと同じです。#ありがとうぞうさん

 

筋トレと私

体を動かすことが好きで、院生の時は走ったりしていましたが、あまり時間が取れなくなり、短時間でちゃんと運動した感が得られる筋トレをしていました。最近はあまりトレーニングできていません。好きな種目はデッドリフトです。

 

状態空間モデルと私

広島ベイズ塾の2016年の夏合宿で、山口大学の小杉先生から状態空間モデルを教えてもらいました。昨年のStan Advent Calendarに小杉先生の書かれたStanで体重の推移をみつめてみた(状態空間モデル)という記事があります。面白いなと思って、それからトレーニングデータを記録しておくことにしました。今回あつかうデータは、デッドリフトの第一セットの使用重量と挙上回数の67時点のデータです。使用重量と挙上回数から最大挙上重量(1RM)が計算できるので、そのデータを使います。デッドリフトをするのはよくて週2回とかなのでデータがたまるまで結構かかってしまいました。あと、日付を記録しておくのを忘れていたため、時点の間隔が一定ではないのが問題です。次から気をつけます。

 

筋トレと状態空間モデル


状態空間モデルは今年のStan Advent Calendarで何回もでてきていますので、詳しくはそれらの記事を参照してください。
状態と観測値をわけて、1) ある時点での観測値はその時点での状態に誤差がのってあらわれてくる、2) ある時点の状態は1つ前の時点の状態から変動する、と考えます。


状態空間モデルは筋トレを例にすると説明しやすい。と私は思います。状態=筋力、観測値=パフォーマンス、と考えればよいのです。
最大挙上重量をプロットしたものが下の図です。けっこうガタガタです。筋力がそんなばらついているはずがない。ですよね?


筋トレのパフォーマンスは結構ぶれます。たとえば同じ週でも、前回扱えた重量がめっちゃ重く感じたりします。睡眠不足だったり、疲れてたり、気分がのらなかったり、ご飯食べてなかったり、そんなこんなで、筋力の変動はある程度小さくても、パフォーマンスはわりと変動するのです。知りたいのは筋力の変動なので、パフォーマンスの変動と分けて考えれる状態空間モデルはとても便利。

 

以下では、3つのモデルを扱います。


内容についてはJ.J.F. コマンダーの状態空間時系列分析入門を参考にしております。間違いがあればご指摘ください。


ローカル・レベル・モデル


一番シンプルなモデルです。t = 1,…, nに対して次のようにあらわせます(tは時点、yは観測値、μは状態)。状態のレベル要素が時点によって局所的に変動することを認めるので、ローカル・レベル・モデルといいます。


ローカル線形・トレンド・モデル


ローカル・レベル・モデルに傾き(トレンド)の要素 (νt) を加えたものです。t = 1,…, nに対して次のようにあらわせます。レベルをモデル化するものと傾きをモデル化する式の2つの状態方程式があります。傾きの要素が時点によって局所的に変動することを認めるので、ローカル線形・トレンド・モデルといいます。


グローバル・トレンド・モデル


ローカル線形・トレンド・モデルでは傾きの時点による変動を認めていますが、「傾きは固定」と考えることもできます。t = 1,…, 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でベイズ統計モデリングを参考にさせていただきました。私が手を加えた部分もありますので、間違いがあればご指摘ください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です