二元配置分散分析(rstatixパッケージ)

 炎症状態(C反応性たんぱく;CRP)について、グループ(3グループ)や栄養状態(問題の無い群と低い群)の影響があるのかを調べます。読み込んだデータは以下の通りです。

groups

nutrition

crp

a

low

0.845

a

low

0.562

a

low

0.638

中略

中略

中略

b

low

0.469

b

low

0.286

b

low

0.393

中略

中略

中略

c

hight

0.276

c

hight

0.092

c

hight

0.216

コードと結果は以下の通りとなります。

> anova_test(data1, crp ~ groups * nutrition)
ANOVA Table (type II tests)

            Effect DFn DFd      F       p p<.05   ges
1           groups   2  54 40.368 1.9e-11     * 0.599
2        nutrition   1  54 27.590 2.6e-06     * 0.338
3 groups:nutrition   2  54  6.670 3.0e-03     * 0.198

入力したコードは、一元配置分散分析と同じanova_test関数で、( )内で二元配置の構造を指定します。最初にデータの指定です。ここでは、data1です。次に、crpとgroupsまたはnutrition を~ で結びます。ここで、2つの要因は*で結びます。crpについてgroupsのnutritionの影響を分析するという意味になります。

出力結果ですが、自由度、F値、p値、効果量に関する情報が提示さされていることに変わりはありません。ただし、それぞれ3行に渡って結果が出力されています。groupsはグループの違いによる効果、nutritionは栄養状態の違いによる効果、groups:nutritionは交互作用の結果です。有意水準を0.05とすると、グループや栄養状態による主効果は確認されましたが、同時に交互作用が有意となっています。こうなった場合、要因の水準毎に効果が異なっている可能性があるので、単純主効果を調べる必要が出てきます。そこで、今回は、栄養状態に問題の無い群と低い群で分けて、グループ毎に一元配置分散分析を行っていくことにします。

ここで、パイプ演算子とgroup_by()関数が活躍します。データをgroup_by()で行うのです。実際には以下のようなコードになります。

> data1 |> group_by(nutrition) |> anova_test(crp ~ groups)
# A tibble: 2 × 8
  nutrition Effect   DFn   DFd     F        p `p<.05`   ges
* <chr>     <chr>  <dbl> <dbl> <dbl>    <dbl> <chr>   <dbl>
1 hight     groups     2    27  5.20 1.2 e- 2 *       0.278
2 low       groups     2    27 65.1  4.65e-11 *       0.828

data1について、group_by()で栄養状態に問題の無い群と、低い群で分けることを指定するために、data1とgroup_by()をパイプ演算子で結びます。そししてgroup_by()関数の()内に、nutritionを指定します。ここまででデータの切り分け方を指定した上で、パイプ演算子でanova_test()関数をつないで分散分析を行います。これにより、指定したデータを切り分けながらの分析が可能となります。

結果です。1行目は、栄養状態が問題の無い群での単純主効果の結果、2行目は栄養状態が低い群での単純主効果の結果です。いずれも有意な主効果となっています。主効果が確認されたので、さらに、多重比較へ進みます。

多重比較のコードと結果は以下の通りとなります。なお、ここではt検定に対し、栄養状態に問題の無い群と低い群ごとにholm補正をした結果が出力されます。

> data1 |> group_by(nutrition) |> t_test(crp ~ groups)
# A tibble: 6 × 11
  nutrition .y.   group1 group2    n1    n2 statistic    df            p        p.adj p.adj.signif
* <chr>     <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>        <dbl>        <dbl> <chr>       
1 hight     crp   a      b         10    10      2.00  12.1 0.069        0.137        ns          
2 hight     crp   a      c         10    10      2.72  11.1 0.02         0.059        ns          
3 hight     crp   b      c         10    10      1.30  17.4 0.209        0.209        ns          
4 low       crp   a      b         10    10      7.14  15.2 0.00000311   0.00000622   ****        
5 low       crp   a      c         10    10     10.3   17.0 0.0000000105 0.0000000315 ****        
6 low       crp   b      c         10    10      4.55  17.2 0.000276     0.000276     ***  

入力したコードの前半は、パイプ演算子とgroup_by()関数を使用しており、単純主効果の分散分析と同じです。そして、t_test関数でt検定を行っていきます。すでにgroup_by()関数をつかって、栄養状態の水準毎に切ることを指定してありますので、t_test関数では、crpとgroupsを~ で結ぶだけです。これで、栄養状態の水準毎にcrpについてgroupsの多重比較をt検定で行う、ということになります。

結果です。1列目のnutritionは栄養状態に問題の無い群と低い群に群ごとの結果を行ごとわかるように示してあります。group1とgroup2は比較を行った群が記載されています。n1とn2は各群のサンプルサイズ、statisticはt値、dfは自由度、pは多重比較補正前のp値、p.adj pはholm法による多重比較補正後のp値を示しています。この結果をみると、栄養状態に問題の無い群ではどのグループ間でも有意差は認められませんでした。一方で、栄養状態の低い群では、全てのグループ間に有意差がありました。

次は、a、b、cの3つのグループ毎にデータを区切って、栄養状態の水準で比較を行います。ただし栄養状態の水準は2で、問題の無い群と低い群の比較になるため、分散分析を使わずにt検定を行っていきます。

コードと結果は以下の通りです。

> data1 |> group_by(groups) |> t_test(crp ~ nutrition)
# A tibble: 3 × 9
  groups .y.   group1 group2    n1    n2 statistic    df        p
* <chr>  <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>    <dbl>
1 a      crp   hight  low       10    10    -4.00   13.7 0.00138 
2 b      crp   hight  low       10    10    -4.06   17.2 0.000804
3 c      crp   hight  low       10    10    -0.857  17.4 0.403 

コードは、前述の栄養状態の水準毎にグループ間の多重比較を行った時のコードと同じで、group_by関数とt_test関数内のnutritionとgroupsを入れ替えただけです。
結果です。cグループでは、栄養状態による有意差は確認できませんでしたが、aとcグループでは有意差が確認できました。

コメント