ダイエットとStataの使い方 1

今回のポイント

時系列データの認識方法
時系列の折れ線グラフの基礎

本文

唐突ではあるが、現在ダイエットをしている。

学部生の頃に「これ以上体重を増やすとまずいですよ」と言われてから10kg以上増加している。体重が増える原因として一番大きいのは、修士論文を書いている時期に毎日9時ぐらいに牛丼を食べていたことである。この時期に2か月で5kgは増加した。あとは卒論の時期にも体重が増えた気がする。

体重を減らさないといけないと思っていたので去年とりあえずジムに入会した。隣の駅の近くで歩いて30分程度でも行くことができる。電車で行っても待ち時間や徒歩を含めて20分ぐらいかかっていたから歩きで行くことが多かった。これが間違いだった。

ジムから家まで15分ぐらい歩いたところにスーパーが1軒あったのだ。ちょうど疲れたころにスーパーがあるので寄らないわけにはいかない。そして、大学帰りにジムに行っていたのでちょうど半額の総菜と寿司が置いてあるのだ。

はじめのうちはやる気があったので我慢していたし、週に3回はジムに行っていた。なので体重は少し減っていたが、運動だけでは思ったほど体重は減らない。ダイエットは食事が9割らしいがそんなことは知らなかったので食生活はそんなに変えていなかった。

思ったよりも体重が減らないことも合わさり、途中からジムに行くことが目的化してスーパーで半額の寿司を買って帰ってから食べるようになった。たまにから揚げも買っていた。

当然そのようなことをすればジムに行った分以上のカロリーを摂取するので体重は減らない。それを表したのが下のグラフである。

画像1

横軸に日付、縦軸にBMIをとっている。BMIが30を超えるとWHOの基準でも肥満になってしまうため非常にまずい状態である。(逆に言うと、世界ではBMIが29.9までは肥満ではない)

このグラフでは欠損値を空白にしているが、8月から欠損値が増えていてやる気が下がっていることを示している。

このグラフを作成するためのデータセットとして、日付(date)とBMI(bmi)の入ったexcelファイルを用意する。エクセルで作成すると、2022/2/1のように入力すると勝手に日付と認識してくれる(設定になっている人が多い)。

なお、データの取り方についてであるが他の条件を一定にするために朝食後に測定している。

このデータをStataに読み込ませるのが下のコードである。

import excel "体重管理.xlsx", sheet("Sheet1") clear firstrow

clearが前に入っているデータを消して、firstrowがエクセルの1行目を変数とするという意味である。"import excel using ファイル名"と昔習ったが、usingはなくても動く。

時系列データのStataへの認識

この後、dateを日付を表す変数としてStataへ認識させるためのコードが

tsset date

である。tsset の後ろの変数が時間を表す変数ということを認識させている。

時系列データでの折れ線グラフの描き方(基礎)

最後に上の折れ線グラフを書くために書いたのが

label var date "日付"
label var bmi "BMI"
tsline bmi if date<= date("11/1/2021","MDY",.) ,  cmissing(n)

である。

ここでは、1列目と2列目でラベルの作成をしている。これをしないと、グラフの変数がdateとbmiのままでぱっと見わかりにくいのでわかりやすいようにしている。つまり、ラベルとは結果で出力されるときに表示される変数の名前である。

新しいversionのStataだと日本語も変数名にできるが、昔は無理だったのでこういうことをしている人が多い。また、コードの中に日本語を使うと全角のスペースができてエラーを見つけるのに非常に苦労するので日本語で変数名を作成することは推奨しない。また、変数名が長くなることを防ぐためにこういうラベルを作成している人も多い(というかそれが普通な気がする)。

そして、3列目のtsline が折れ線グラフを表示するためのコードである。すでにtslineで時間を認識させているので、横軸はdateになる。そして、縦軸はtslineの後ろに書いてあるbmiということである。

さらに追加で2つ説明が必要である。

まず、1つめにifで日付を去年の11月1日までにしている。ここではdate()関数を使っているのでその説明をする。excelでは"2020/2/1"と打っていた日付がstataに読み込ませると"2/1/2020"というようにMonth-Day-Yearとなっていた。これをstataへ認識させているのが"MDY"である。そして、Stataのdate()関数は"2020/2/1"を"01feb2020"と変換してくれる。今回は4桁の西暦であったためにdate()内の2つ目のカンマの後ろは"."だが、2桁の西暦の場合(例:20)の時は2020から2119の間の数字を打つか"MDY"の代わりに"MD20Y"とするとよい。3つ目に数字を入れるやり方の場合は、その数字を超えない最大の年を百の位と千の位をつけて返してくれる。

すなわち、date("2/1/20". "MDY", 2000)=01feb1920になるしdate("2/1/20". "MDY", 2040)=01feb2020となる。

そして、01feb2020についてだが、これは実際には数値であり1960年1月1日から何日後という数値が入っており

. display date("1/1/1960", "MDY",.)
0
. display date("2/1/20", "MDY", 2020)
21946

となる。この数字は1960年1月1日が1960年1月1日から0日後、2020年2月1日が1960年1月1日から21946日後ということをそれぞれ表している。

続いて2つめに、", missing(n)"というオプションをつけている。これは、欠損値がある場合は補充しないという意味である。もしこれがないと下のようなグラフになる。

画像2

これでも悪くないが、欠損値をはっきりと表したいので私は上のようにした。

次回は、食事を変えた話です。

この記事が気に入ったらサポートをしてみませんか?