状態空間モデル(カルマンフィルタ+トレンド・季節性を考慮したローカルレベルモデルによる予測)を使って、血圧値をフィルターしてみた
最近、ストレスが多いのか血圧が高くなりまして、去年の7月の健康診断で様子見指示、そして今年の1月に「循環器内科に行け」と言われてしまいました。
ただ、循環器内科へ行ったのはこの春の連休の5月1日のことでして、そこからなんとなーく下がったかなぁとは思ってるんですが、どうも血圧の値って乱高下しやすくて、よくわからないんです。
そういえば、その血圧対策のために1月に、サイクリングマシーンを買ってるんですよね。
なぜか急にサイクリングマシーンを買ってしまいまして: EeePCの軌跡
これの効果も出ているのかどうかも含めて、血圧値を評価してみました。
なお、血圧値は去年の7月3日からほぼ毎日2回、朝晩に測定してます。
こんな感じのフォーマットです。
上の値を見ると分かるんですが、結構変動が激しいんですよね。最高血圧値が150いったり、120を切ってたりと。
こういう誤差の大きな測定値から、正しい「状態」を推測するのが「状態空間モデル」といい、比較的簡単な式でその状態を推測するのが「カルマンフィルター」と呼ばれる手法です。
ということで、早速カルマンフィルターにこの血圧値を通してみようかと思ったのですが、面倒なのでGemini Advancedの2.5 Proに次のようなプロンプトを使って作ってもらいました。
次の血圧値を読み取り、カルマンフィルタを適用してフィルタ適用後のグラフを書くpythonプログラムを記述してください。
【条件】
・パラメータ調整により、フィルタ後のデータを調整できるようにする
・「pykalman」というライブラリを使用する
加えて、
上記のプログラムに、以下の機能を追加してください。
・ 10日先までの波形予測を、ローカルレベルモデルを用いて行う。
・予測波形には、95%信頼幅も表示する
・最後に画像を表示させる。
さらに、
上記のプログラムで、季節性、トレンドを考慮した予測波形を導出するプログラムに変更できますか?
と投げかけて、出てきたプログラムが出力したのが以下のグラフです。
小さすぎて、分からりにくいですが。
まず上段:最高血圧値、下段:最低血圧値 で、それぞれギザギザしているのが測定値です。
そこから推測される「状態」が、それぞれ赤、黒線であらわされてます。
こうしてみると、測定値は結構変動幅が大きいのがわかります。
なお、1週間の周期性(季節性)がありそうなので、季節性のサイクルを14ステップ(1日2回測るので、7日分の測定値)としました。
で、最後に出てくる線と薄い赤色、緑色で塗られた部分が、今後10日分の予測値となってます。
これを見ると分かることは、
・ 波打ちながらも、徐々に血圧値が上昇気味だったが、真ん中ちょっと過ぎた辺り(2月上旬)からガクッと下がっている
(サイクリングマシーンを買って半月くらい経った時期)
・ グラフの一番左端から一つ手前の線がちょうど5月1日の線で、そこから緩やかに血圧が下がり、低値安定となっている
(まさに血圧の薬を飲み始めた後)
でしょうか。
もちろん、気温の上昇で血圧は下がりやすいらしいので、そういう影響もあるんでしょうけど、真夏だったこのグラフの開始点(7月3日)と今を比べても、全然値の高さが違います。
サイクリングマシーンと血圧降下剤の効果が、それぞれ出てるってところですかね。
ただ、今飲んでいる血圧の薬ですが、かなり弱いものだそうです。
ただ下げればいいってもんじゃないらしく、健康診断の結果を見て、腎臓の値が悪いということで、そちらに配慮した薬を選んだ結果、めちゃくちゃ血圧値を下げるものにはされませんでした。
まあ、直前でちょっと下がり気味だったこともあるんですが。
しかし、最後の予測のグラフで薄い赤と緑の領域ですが、95%信頼区間での予測のばらつきを表してます。
このばらつき具合の幅の大きさを見るや、いかに血圧の測定値がばらついてるかがよくわかりますね。
にしても、こういう時はやっぱり生成AI、役に立ちます。特にGemini Advancedの2.5 Proはかなり優秀です。ちょっと手直しはしたものの、ほぼそのままのコードで動きました。
(線種を多少変えたり、カルマンフィルターのパラメーター値を少しいじったくらいです)
ChatGPTとGeminiが競い合ってますけど、個人的にはGeminiの方が使いやすいかなぁと感じてますね。そこは人それぞれでしょうが。
ちなみに会社のCopilotが一番使いにくくて・・・社内のデータを扱える分には便利なんですけど、やっぱりGemini辺りと比べてもちょっと回答精度が悪いんですよね。いつも素っ気ないというか、なかなか音が伝わらないし。
いずれ、改良されていくんでしょうけど、もうちょっと何とかならないかと思ってます。
![]() |
最近のコメント