身体活動レベルの計算と必要カロリー

 だいぶ前に身体活動レベル(PAL)の算出についての話をしました。その方法は1日の活動について、各行動をした時間に各行動の動作強度(Af)を乗じたものをすべて足して、それを1日の時間で割るという、誰がそんな面倒くさいことをするんだというものでした。まあ普通しないし、もし身体活動レベルが知りたければ食事摂取基準にあるように、身体活動レベルが低い=1.5, 普通=1.75, 高い=2.00を用いればおそらくは十分なわけですから、面倒くさくても特に大きな不平は出ないのです。

 そんなわけで、こんなものを作っても需要はものすごく低いんじゃないかと思われますが、お正月の自由研究がわりに「身体活動レベルの計算と必要カロリー*1」なるものを作りました。時間を調べる手間がかかるのは変わりませんが、動作強度をいちいち調べなくていい分、多少は楽になるんじゃないでしょうか。

 センスのかけらもない野暮ったい作りですが、仕方ありません。なにぶん初めてのJavaScriptというだけで荷が重くそんなところまで手が回りませんでしたし、仮にやろうとしたところで、たいしてかっこいいものにはならないのは目に見えています*2

 それなりに動くかどうかは試したつもりですが、計算された値が正しいかどうかは試してません。当方初心者ですので対応できるかわかりませんが、おかしなところがあれば連絡いただければありがたいです。直してくれればなおありがたいです。

 しっかり計算されていたとしてもあくまで計算値ですし、お遊びで作ったものです。ダイエット等に利用する際は、実際の体重増減をあてにされたほうがよろしいかと思います。

使い方

 使い方は、まず性・年齢を選択して体重を入力します*3。そのあと1日の生活を振り返り、あんなことしなければよかったと若干の鬱に入って、ベッドの中でもだえます。適当に時間が経って午前1時半を回った頃に、でもこんなんじゃいけないと一念発起。1日の活動を選択して、その活動に費やした時間を分単位で入力してから「追加」ボタンを押します。

 追加した活動を削除したければ、下の「選択済み動作」から削除したい活動を選んで、「選んだものを削除」を押してください。OPERA使いの人はなぜか1個削除されないかもしれませんが、そのときはごめんなさい。その活動を無理矢理入れこんだ1日を過ごす未来身体活動レベル日記を書くか、もしくは再読み込みしてもう一度最初から入力してください。

 1日分の活動、すなわち活動時間の合計が1440分になって「計算」ボタンを押せば、さらに下にあるテキストエリアに結果が出力されます。1440分に足りなければ、不足時間分は安静に座っていたとして計算しますので、時間が余るようでしたらそのまま計算させても大丈夫です。結果はなんとなく項目ごとに「,」で区切るようにしましたので、コピーしたものをcsv形式で保存すれば、なにかの際の再利用もしやすいはず。

 なお、Afは

絶食時の座位安静時基礎代謝量は仰臥位で測定する基礎代謝量よりおよそ10%大きいため、メッツ値×1.1≒Afという関係式が成り立つ。
(『日本人の食事摂取基準〈2010年版〉厚生労働省「日本人の食事摂取基準」策定検討会報告書』p53)

らしいので、健康・栄養研究所にある詳しすぎるMETs値表からの計算値を用いています。

 年齢階級の選択肢が18-29歳からなのは、それ以下だとエネルギー蓄積量があるのと、年齢階級が小刻みになって面倒くさいこと、あとわたくし大人ですし、という理由からです。17歳以下のかたごめんなさい。

2週間後の僕と、新しく動作を加えたい人のための話

 前述したように、動作項目は詳しすぎるMETs値表から適当に見繕って作成したわけですが、これじゃあ全然わたしの生活にあわないよ、という人もいるかと思います。自転車に乗るだけで数項目あるくせに、なんで溶鉱炉の手入れが入ってないの? こんな選択肢はおかしいとお怒りになるかたがいるのはもっともです。

 そのようなかたは、ローカルに保存して、自分好みの項目を作成することも可能です。

 動作項目はすべてall_itemsという配列に入れていて、「"動作名","動作カテゴリ",METs,Af,その活動に費やした時間」の順番に並んでいます。したがいまして、選択肢にない新しい動作を追加するときには、

//全動作の配列を作る
function all_itemsCreate() {
	var s = all_items;

	//new action(動作名、動作カテゴリ、METs、Af、時間)ただし、Afと時間はとりあえず0で。
	s[0] = new action("自転車に乗る(16.1km/h未満)", "移動", 4.0, 0, 0);
	s[1] = new action("自転車に乗る(16.1-19.2km/h、ゆっくり)", "移動", 6.0, 0, 0);
	s[2] = new action("自転車に乗る(19.3-22.4km/h、ややきつい)", "移動", 8.0, 0, 0);
	s[3] = new action("自転車に乗る(22.5-25.6km/h、きつい)", "移動", 10.0, 0, 0);

s[ ] = new action()

のnew action後の括弧内に("動作名"、"動作カテゴリ"、METs、Af、その活動に費やした時間)の順に入れてください。AfはMETsから計算するので0入力、時間はその動作が選択された際に入力されますので、これまた0にしておいてください。「s」のあとの括弧には数字が入りますが、同じ数字は一カ所にしか使えません。特にこだわりがなければ、配列の一番後ろ、現在は78なのでその後ろの79に追加するのがいいと思います。

	s[76] = new action("水泳(クロール、遅い、46m/分)", "スポーツ", 8.0, 0, 0);
	s[77] = new action("水泳(余暇的に)", "スポーツ", 6.0, 0, 0);
	s[78] = new action("睡眠", "日常", 0.9, 0, 0);
	s[79] = new action("溶鉱炉の手入れ", "製鉄関連", 7.5, 0, 0);

 これで「溶鉱炉の手入れ」が追加されました。

 ただし、これだけでは不十分です。「製鉄関連」との動作カテゴリにしましたが、「表示する活動のカテゴリーを選択」からこの製鉄関連を選ぶことができないからです。

「表示する活動のカテゴリーを選択」に新しい項目を追加するには、

表示する活動のカテゴリーの選択
<select name="category_select">
<option value="すべて">すべて
<option value="日常">日常
<option value="家事">家事
<option value="移動">移動
<option value="スポーツ">スポーツ
</select>

の部分に、新しく入れたい項目名を書き込まなくてはいけません。

表示する活動のカテゴリーの選択
<select name="category_select">
<option value="すべて">すべて
<option value="日常">日常
<option value="家事">家事
<option value="移動">移動
<option value="スポーツ">スポーツ
<option value="製鉄関連">製鉄関連
</select>

 これでカテゴリーの選択に「製鉄関連」が追加され、画面から選ぶことができるようになりました。しかし、これではまだ不十分です。カテゴリー選択で選んだものが「活動」欄に反映されるためには、同時に次の箇所にも書き込まなければなりません。

//選択されたカテゴリーから、新しいinCategory_itemsの配列を生成
function Category_select(s) {
	var n = 0;

	//作られているカテゴリー動作配列の削除
	inCategory_items.splice(0, inCategory_items.length - 1);

	//選択されたカテゴリーにあったinCategory配列を作る
	for (i = 0; i < all_items.length; i++) {
		if (s == "すべて"){
			inCategory_items[n] = all_items[i];
			n = n + 1;
		} else if (s == "日常") {
			if (all_items[i].category == "日常") {
				inCategory_items[n] = all_items[i];
				n = n + 1;
			}
		} else if (s == "家事") {
			if (all_items[i].category == "家事") {
				inCategory_items[n] = all_items[i];
				n = n + 1;
			}
		} else if (s == "移動") {
			if (all_items[i].category == "移動") {
				inCategory_items[n] = all_items[i];
				n = n + 1;
			}
		} else if (s == "スポーツ") {
			if (all_items[i].category == "スポーツ") {
				inCategory_items[n] = all_items[i];
				n = n + 1;
			}
		}
	}

}

 ここで、選択したカテゴリーとall_itemsとして作った動作項目のカテゴリーが一致しているか見ています。一致していれば、そのカテゴリーの動作として保持して、一致していなければ無視です。「s == 」のあとの" "は「option value=" "」で書いたものですので、

		} else if (s == "スポーツ") {
			if (all_items[i].category == "スポーツ") {
				inCategory_items[n] = all_items[i];
				n = n + 1;
			}
		} else if (s == "製鉄関連") {
			if (all_items[i].category == "製鉄関連") {
				inCategory_items[n] = all_items[i];
				n = n + 1;
			}

のように書き込めば、その動作が「製鉄関連」のカテゴリーかどうかチェックしてもらえます。

読みにくくてごめんなさい

 へたくそで無駄が多く、読みにくいソースだとは思いますが、適当にいじくってあなた好みにすれば問題解決。かもしれません。

追記1/6:URL間違えてたみたい

 で今回の本題たる「身体活動レベルの計算と必要カロリー」がエラーになってましたすみません。直しましたので、今度は繋がるはず。

*1:JavaScriptオンじゃないと働きません。

*2:タグの手打ちだって何年ぶり!?

*3:しなければ、最初に入っている「男性」「18-29歳」「60kg」で計算します。