主成分得点の効用

Last modified: Oct 19, 2015

 複数の変数からなる独立標本の平均値の差の検定を行う場合などで,変数ごとの検定ではいずれも平均値に有意差が認められないという結果になることがある。このような場合に,それらの変数すべてを対象として主成分分析を行い,主成分得点の平均値の差の検定を行うと有意差が認められようになるかどうかという質問がある。

 この問題に答えるために,実際にデータを分析して解を探索してみよう。

 分析に使用するデータは,iris データセットから iris$Speciesversicolorvirginica の各 50 個のデータを抽出して用いる。変数は Sepal.LengthSepal.WidthPetal.LengthPetal.Width の 4 個とする。

 分析結果をまとめて提示するために,以下の関数を用いることとする。引数の x は対象とするデータセット(データフレーム), group は群( versicolorvirginica )を表す factor とする。分析の概要は,まず散布図を描き,二群の平均値とその差,平均値の差の検定(Welch の方法)の \(t\) 値,\(p\) 値である。

Summary <- function(x, group) { 
    plot(x, col = as.integer(group))                  # 散布図を描く 
    t.tests <- lapply(x, function(y) t.test(y~group)) # t.test を行う 
    Means <- sapply(t.tests, "[[", 5)                 # それぞれの群の平均値を抽出する 
    Diffs <- Means[1,]-Means[2,]                      # 平均値の差を求める 
    ts <- sapply(t.tests, "[[", 1)                    # t.test の結果から t 値を抽出する 
    p.values <- sapply(t.tests, "[[", 3)              # t.test の結果から p 値を抽出する 
    ans <- rbind(Means, Diffs, ts, p.values)          # まとめの表を構成する 
    rownames(ans)[3:5] <- c("difference of two means", "t-value", "p-value") # 行名の補完 
    return(round(ans, 3))                             # まとめの表を戻す 
} 

 まず,iris データセットから必要な部分を取り出し iris2 とする。

iris2 <-  iris[51:150,] 
iris2[,5] <- factor(iris2[,5]) 

 iris2 について,二群の平均値の差の検定を行ってみる。

( ans1 <- Summary(iris2[1:4], iris2[,5]) ) 

##                          Sepal.Length Sepal.Width Petal.Length Petal.Width 
## mean in group versicolor        5.936       2.770        4.260       1.326 
## mean in group virginica         6.588       2.974        5.552       2.026 
## difference of two means        -0.652      -0.204       -1.292      -0.700 
## t-value                        -5.629      -3.206      -12.604     -14.625 
## p-value                         0.000       0.002        0.000       0.000 

 散布図では,versicolor は黒,virginica は赤で描いてある。散布図からもわかるように,4 個の変数すべてにおいて,「二群の平均値には差がある」ことがわかる(p-value が 0.000 となっているのは \(p\) 値 \(\lt 0.001\) である)。

 次に,4 個の変数において,二群の平均値の差の検定の \(p\) 値が 0.05 を上回るように,片方(versicolor)のデータに増加分(delta)を加える。

delta <- c(0.44, 0.08, 1.1, 0.61) 
for (i in 1:50) { 
  iris2[i, 1:4] <- iris2[i, 1:4]+delta 
} 

 分析結果は以下のようになる。

( ans2 <- Summary(iris2[1:4], iris2[,5]) ) 

##                          Sepal.Length Sepal.Width Petal.Length Petal.Width 
## mean in group versicolor        6.376       2.850        5.360       1.936 
## mean in group virginica         6.588       2.974        5.552       2.026 
## difference of two means        -0.212      -0.124       -0.192      -0.090 
## t-value                        -1.830      -1.949       -1.873      -1.880 
## p-value                         0.070       0.054        0.064       0.063 

 この結果,4 個の変数すべてで,二群の平均値には有意差がなくなった(4 変数の \(p\) 値は,それぞれ 0.07, 0.054, 0.064, 0.063 となり,5% の有意水準の下で帰無仮説は棄却できない)。

 次に,データに対して主成分分析を適用する。scale.=TRUE を指定しておく。

ans.prcomp <- prcomp(iris2[1:4], scale.=TRUE) 

 理論的に得られる 4 個の主成分(PC1, PC2, PC3, PC4)の固有値は 2.6736181, 0.7559525, 0.4143992, 0.1560302 である。第 1 主成分は,元の 4 変数全部が持っていた情報のうち 66.8% の情報を持っている。

 得られた 4 個の 主成分得点のそれぞれについて平均値の差の検定を行うと以下のようになる。

score <- data.frame(ans.prcomp$x) 
( ans3 <- Summary(score, iris2[,5]) ) 

##                             PC1    PC2    PC3    PC4 
## mean in group versicolor  0.371  0.028  0.003  0.003 
## mean in group virginica  -0.371 -0.028 -0.003 -0.003 
## difference of two means   0.742  0.055  0.006  0.007 
## t-value                   2.318  0.316  0.050  0.087 
## p-value                   0.023  0.753  0.960  0.931 

 その結果,第 1 主成分得点においては,有意水準 5% の下で,二群の平均値に有意な差が認められた(\(p\) 値 = 0.023)。他の 3 個の主成分得点には有意な差は認められなかった。


1 まとめ

 結果としてわかったことは,元の変数のいずれにおいても平均値に有意差が認められない場合でも,主成分得点のいくつかにおいては平均値に有意差が認められることがあるということである。