【R×栄養統計】食べる速さでエネルギー摂取量に差がある?対応のない多標本の栄養統計

R言語

みなさん,こんにちは.
シンノユウキ(@y_stadio)です.

今回は対応のない多標本データを比較する際の統計手法について解説します.仮説検定としては,

  • 一元配置分散分析 (one-way ANOVA)
  • クラスカル・ウォリス検定

をとりあげます.

では行きましょう!

検定の使い分けは?

今回紹介する2つの統計手法は,パラメトリック検定とノンパラメトリック検定とに分かれています.

すなわち,

  • パラメトリック検定→一元配置分散分析
  • ノンパラメトリック検定→クラスカル・ウォリス検定

という風になります.

基本的には,データの妥当性や独立性,当分散性や分布の正規性が仮定できる場合は一元配置分散分析を用います.

ただし,少し細かい話にはなりますが,比較するグループの大きさが同じ場合には,正規分布が仮定できなくても,また当分散性が仮定できなくても一元配置分散分析を用いることができるとされています.これは,算出されるF統計量がそれらの影響を受けにくいことに関係しています.

しかし,データの独立性を満たしていないと,一元配置分散分析は一気に信頼できないものへと変化していまいます.この点には注意が必要です.

データのインポート

まずは以下からデータをダウンロードしてください:

そして,変数dfとして読み込んでおきましょう:

df <- read.csv(
  "sample.csv",
  header = TRUE  
)
df

以下のようなデータが表示されればOKです:

     id  speed energy
1     1   slow   1956
2     2   slow   1654
3     3   slow   1589
4     4   slow   1847
・・・
297 297   fast   2387
298 298   fast   1882
299 299   fast   2371
300 300   fast   1949

300人のデータが収載されており,食べる速さを表したspeedと摂取エネルギーを表したenergyが入力されています.

食べる速さには,slow, medium, fast の3段階が入力されており,この3つのグループでエネルギー摂取量に差がないかどうかを検定します.

手始めに:グループごとに平均値と標準偏差を算出してみよう

その前に,まずそれぞれのグループの平均値と標準偏差を出力してみましょう.以下のようなコードになります:

tapply(df$energy, df$speed, mean)
tapply(df$energy, df$speed, sd)

この結果,以下のように平均値と標準偏差が出力されます:

> tapply(df$energy, df$speed, mean)
   fast  medium    slow 
2093.41 1906.49 1673.73 
> tapply(df$energy, df$speed, sd)
    fast   medium     slow 
173.3483 177.3976 168.2526

今まで紹介してこなかった関数をいきなり使ってしまいましたが,今回使用したtapply関数は非常に便利な関数です.以下のように使用します:

tapply(目的変数, グループ, 関数)

この関数を使用すると,グループごとに目的変数に対して関数を実行した結果を返してくれます.今回の場合は,目的変数にエネルギー,グループに食べる速さ,関数は平均値を算出するmeanと標準偏差を算出するsdを指定しました.なので,食べる速さのグループごとにエネルギーの平均値と標準偏差を算出してくれたのですね.非常に便利に使える関数なので,覚えておきましょう.

さて,tapply関数を使ったのはグループの特徴を把握したいからでした.見るからに食べる速さが早いとエネルギー量が多く,遅いと少ないという傾向が見て取れます.では,以下で実際に検定してみましょう.

一元配置分散分析

まずは一元配置分散分析からです.一元配置分散分析は以下のように記述します:

oneway.test(従属変数~独立変数, var.equal = TRUE)

oneway.test()を使用します.1つ目の引数には,従属変数と独立変数とをチルダ(~)でつないで指定します.従属変数は独立変数によって変わる値,つまりエネルギーです.独立変数にはグループ分けしたい変数,つまり食べる速さを指定します.var.equalは当分散性を仮定するか否かを指定するものですので,そのままTRUEとしておきましょう.

上記を今回の場合に当てはめると以下のようになります:

oneway.test(
  df$energy~df$speed,
  var.equal = TRUE
)

結果は以下のように出力されます:

	One-way analysis of means

data:  df$energy and df$speed
F = 147.64, num df = 2, denom df = 297,
p-value < 2.2e-16

p値が非常に低い(< 2.2e-16)ため,それぞれのグループにおいて平均値は同じであるという帰無仮説が棄却され,平均値に差があると結論できます.

分散分析のF値はグループ間の分散をグループ内での分散で割った値です.それが大きいと(つまりF値が大きいと)グループの間で何らかの変動があったとして,差があるとするのです.

クラスカル・ウォリス検定

次は,一元配置分散分析のノンパラメトリック版とも言えるクラスカル・ウォリス検定を紹介します.こちらは平均値ではなく中央値で比較します.

これは,以下のように使用します:

kruskal.test(従属変数~独立変数)

一元配置分散分析とほぼ同じですね.これを今回に当てはめると以下のようになります:

kruskal.test(
  df$energy~df$speed
)

これを実行すると,以下の結果が出力されます:

	Kruskal-Wallis rank sum test

data:  df$energy by df$speed
Kruskal-Wallis chi-squared = 149.52, df
= 2, p-value < 2.2e-16

こちらも一元配置分散分析とほぼ同じ結果が得られましたね.

どのグループ間に差があるかは不明

今回行った検定では,一元配置分散分析でもどのグループ間に差があったかは不明です.low と fastに差があるとかは言えないのですね.あくまでも比較したグループのどこかに差があったというだけです.

なので,差があったグループが1つか2つかもわかりません.こういった面は少し不便ですね.

どのグループとどのグループとに差があるとかを言いたい場合には,多重比較を行う必要があります.これはまたの機会とします.

まとめ

今回は対応のない多標本データを比較する際の統計手法について解説しました.仮説検定としては,一元配置分散分析 (one-way ANOVA)とクラスカル・ウォリス検定を取り上げました.参考にしてください.

連載目次

  1. 【R×栄養統計】RとRStudioをインストールしよう
  2. 【R×栄養統計】四則演算と代表値の算出をやってみよう
  3. 【R×栄養統計】データの読み込み方法を習得しよう【TXT・CSV,・XLSX】
  4. 【R×栄養統計】性別と肥満度に関係があるか?カテゴリデータの栄養統計
  5. 【R×栄養統計】正規分布しているか?正規性を確認する方法を紹介します
  6. 【R×栄養統計】男女でエネルギー摂取量に差はある?対応のない2群間の栄養統計
  7. 【R×栄養統計】栄養指導に効果はあった?対応のある2群間の栄養統計
  8. 【R×栄養統計】食べる速さでエネルギー摂取量に差がある?対応のない多標本の栄養統計現在のページ
タイトルとURLをコピーしました