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

前回はジムでダイエットしようとして失敗した話をしました。

そこで反省して食事制限を思い立ったというのが今回の話です。

一般的な人類がどれぐらい食べているのかわからないため、自分で食事管理するのは無理だと感じて外注することにしました。

そこで、googleで調べたところ管理栄養士に食事管理をしてもらえるサービスがあるとのことでそれにしました。

まず3日間無料体験ができるということでしたので無料体験だけとりあえずやってみることにしました。

今回のポイント

食事制限はやせるが、やめると元に戻る
棒グラフの後ろに影をつけて強調する方法
スカラー値について
マクロについて

使用するデータセットは、前回と同様に日付とBMIの入ったデータです。

今回は、後ろに影をつけるためにareaを使いました。area 横軸 縦軸とすることでその範囲に色を付けることができます。BMIが最高で31ぐらいあったので、無料体験の期間のみ31でそれ以外の時期は欠損値(.)の変数を作成します。なぜゼロにしないかとというと、もし0にした場合にはグラフの縦軸がゼロから始まるからです。調整の方法があったような気もしますが、面倒なので欠損値としておきます。

なので、コードとしては

gen inter=.
replace inter =31 if date>= date("11/29/2021","MDY",.) /*
*/ & date<= date("12/1/2021","MDY",.)
*下でも同じ
/*
replace inter =31 if date>= date("11/29/2021","MDY",.) ///
 & date<= date("12/1/2021","MDY",.)
*/

となります。/*と*/で改行をしています。///でも改行できます。ちなみに、/*と*/の間の文字は実行されないので、コメントアウトとして使えます。

続いて、このエリアと前回作成した折れ線グラフを重ねるのにtslineを使います。そのためにtwowayというコマンドを使います。twoway (グラフ1) (グラフ2) や、twoway グラフ1 || グラフ2と入力することで複数のグラフを重ねて表示することができます。

label var inter "無料体験"

twoway (area inter date if date>= date("9/1/2021","MDY",.)  /*
*/ & date<= date("12/31/2021","MDY",.), color(gs14))  /*
*/ (tsline bmi if date>= date("9/1/2021","MDY",.) & /*
*/  date<= date("12/31/2021","MDY",.) , cmissing(n)), ytitle("BMI")

画像1

無料体験の後に急激にBMIが減少してその後以前の水準まで回復していることがわかります。このことからわかるように、食事制限には一定の効果があるものの、食事制限をやめると元に戻ることがわかります。ちなみに、朝夕は白米100g、昼は150gに制限していました。

ここでグラフ作成のポイントは、2つあります。

まず1つめに、複数のグラフを重ねているので縦軸の変数名が異なるため最後に,ytitle("")オプションでy軸のラベルを付けています。これを使えば前回やったようなラベル作成は不要と考える人もいるかもしれませんが、グラフの下にあるラベルも変えないといけないため面倒なので先にやっておいたほうが良いです。

2つめとして、areaのオプションである,color(gs14)です。デフォルトだと、この影の色が紺色っぽい濃い色なので変えています。こんな感じです。

画像2

続いて、スカラーについて説明します。

上のコードは長かったのでもう少し短くしたいと考えました。特に長い部分は、ifの後ろで表示する期間を設定するところです。

date()関数を何回も書くことはめんどくさいので、少し短くするためにスカラーを設定します。こんな感じです。

scalar begin= date("9/1/2021","MDY",.)
scalar end= date("12/31/2021","MDY",.)
twoway (area inter date if begin<=date& date<=end , color(gs14) ) (tsline bmi if begin<=date & date<=end  , cmissing(n)), ytitle("BMI")

scalarとgenerateの違いですが、generate は変数を作成する(表に1列追加される)のに対してscalarは数字を作成します。つまり、表には反映されません。1行目と2行目で表示するはじめと終わりを設定して、3行目のところでbeginやendと書くことでそれぞれdate("9/1/2021","MDY",.)とdate("12/31/2021","MDY",.)という意味になってくれています。

これでもまだ長いと感じる人は、マクロを使います。

これは文字列をそのまま反映させてくれるもので、

local period "date>= date("9/1/2021","MDY",.) & date<= date("12/31/2021","MDY",.)"

というように書くと`period'と入力することでdate>= date("9/1/2021","MDY",.) & date<= date("12/31/2021","MDY",.)と同じことになります。

すなわち、最初に実行したコードが次のようになります。

twoway (area inter date if `period' , color(gs14) ) (tsline bmi if `period'  , cmissing(n)), ytitle("BMI")

じ

次回は、無料体験を終えて実際に食事管理をしてもらう話です。

参考文献

https://blog.stata.com/2020/02/13/adding-recession-shading-to-time-series-graphs/

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