対応のあるデータの解析

Last modified: Oct 19, 2015


1 使用するデータ

 2 種の処理法 A,B について 7 例ずつに対して処理前後の 2 時点で測定したものである。

(d <- data.frame( 
  before=c(64.6, 192.1, 171.9, 673.9, 346, 58.9, 86.4, 82.2, 37, 175.8, 273.9, 48.3, 179, 857.5), 
  after=c(44.4, 165.5, 27.8, 300.6, 182.6, 38.4, 51.9, 48.7, 28.2, 168.5, 266, 47.8, 166, 856), 
  treatment=rep(LETTERS[1:2], each=7))) 
##    before after treatment 
## 1    64.6  44.4         A 
## 2   192.1 165.5         A 
## 3   171.9  27.8         A 
## 4   673.9 300.6         A 
## 5   346.0 182.6         A 
## 6    58.9  38.4         A 
## 7    86.4  51.9         A 
## 8    82.2  48.7         B 
## 9    37.0  28.2         B 
## 10  175.8 168.5         B 
## 11  273.9 266.0         B 
## 12   48.3  47.8         B 
## 13  179.0 166.0         B 
## 14  857.5 856.0         B 

2 質問者の解析

 質問者は処理ごとに,処理前後の対応のあるデータを対象として符号付き順位和検定を行った。

d2 <- split(d, d$treatment) 
lapply(d2, function(x) wilcox.test(x$before, x$after, paired=TRUE)) 
## $A 
## ウィルコクソンの符号付順位和検定 
##  
## データ:  x$before と x$after  
## V = 28, P値 = 0.01563 
## 対立仮説: location shiftは,0ではない 
##  
##  
## $B 
## ウィルコクソンの符号付順位和検定 
##  
## データ:  x$before と x$after  
## V = 28, P値 = 0.01563 
## 対立仮説: location shiftは,0ではない 

 いずれの処理においても検定結果は同じになる。なぜならば,処理 A,処理 B はともに全てのケースにおいて処理後の数値は処理前の数値より小さいため,検定統計量は \( \displaystyle V=\sum_{i=1}^7 i = 28 \) となるからである。

## $A 
##      before after  diff. rank 
## [1,]   64.6  44.4  -20.2    7 
## [2,]  192.1 165.5  -26.6    5 
## [3,]  171.9  27.8 -144.1    3 
## [4,]  673.9 300.6 -373.3    1 
## [5,]  346.0 182.6 -163.4    2 
## [6,]   58.9  38.4  -20.5    6 
## [7,]   86.4  51.9  -34.5    4 
##  
## $B 
##      before after diff. rank 
## [1,]   82.2  48.7 -33.5    1 
## [2,]   37.0  28.2  -8.8    3 
## [3,]  175.8 168.5  -7.3    5 
## [4,]  273.9 266.0  -7.9    4 
## [5,]   48.3  47.8  -0.5    7 
## [6,]  179.0 166.0 -13.0    2 
## [7,]  857.5 856.0  -1.5    6 

 この結果に対して質問者は,「中央値の変化を見ると,処理 A の方がより小さくなっているのに検定結果からは処理 A と処理 B が同じであるといわざるを得ないのかと違和感を感じる」という。
 確かに中央値の差は,処理 A では \(-\)120 になっており,処理 B では \(-\)9.8 になっている。

by(d[, 1:2], d$treatment, apply, 2, median) 
## d$treatment: A 
## before  after  
##  171.9   51.9  
## ---------------------------------------------------------------------------  
## d$treatment: B 
## before  after  
##  175.8  166.0 

3 どのように解釈すべきか

 質問者のように,検定では符号付き順位和検定を用い,データの解釈には中央値を用いるのは不適切である。符号付き順位和検定は「順位」を対象にしているので,前述の通り処理 A と処理 B の符号付き順位(検定統計量は全く同じなのである。中央値が違うということを明らかにするには処理の前後のデータを「量」として扱わなければならない。いってみれば,対応のある \(t\) 検定である。

d2 <- split(d, d$treatment) 
lapply(d2, function(x) t.test(x$before, x$after, paired=TRUE)) 
## $A 
## 対応のある場合のt検定 
##  
## データ:  x$before と x$after  
## t値 = 2.2681, 自由度 = 6, P値 = 0.06383 
## 対立仮説: 母平均の差は,0ではない 
## 95 パーセント信頼区間:   -8.813904 232.413904  
## 標本推定値:  
## 差の平均値  
##      111.8  
##  
##  
## $B 
## 対応のある場合のt検定 
##  
## データ:  x$before と x$after  
## t値 = 2.4742, 自由度 = 6, P値 = 0.04819 
## 対立仮説: 母平均の差は,0ではない 
## 95 パーセント信頼区間:   0.1140351 20.6002507  
## 標本推定値:  
## 差の平均値  
##   10.35714 

 中央値の変化では処理 A が優れていると思われたが,\(t\) 検定の結果では処理 A は有意差は見られず,処理 B ではきわどいが有意差ありという結果になった。しかし,処理前後の平均値の差は,処理 A では \(-\)111.8 であり,処理 B では \(-\)10.35714 となる。処理 A の方が 10 倍以上大きい。

 このように,検定方法により結果が異なったり,直感と食い違いのある結果が得られる場合は,データに何らかの問題があると考えるのがよい。
 実際,図に示してみると,処理 A では 1 例(2,3例)の改善がみられ,処理 B ではほとんど改善が見られない(数値で見れば,すべてのケースで処理後は処理前より小さくなる)。図を見る限りでは,どちらの処理が優れているかは即断できないというのが妥当な結論ではないだろうか?