No.20025 対応のある2群の比較における検定方法  【mii】 2013/07/06(Sat) 09:08

一人で考えててもわからず路頭に迷っているため,検定方法について質問させていただきます。

同一対象者に繰り返し同じ質問を2005年と2006年に行いました。
質問に対する回答は1〜4の数字で答えるものであり間隔尺度ではありません
(1=よく使う,2=一定の条件ときだけ使う,3=その他,4=使わない)

2005年と2006年で,回答に差があったのか調べたいときにどうしたらいいでしょうか。
さらに2005年と2006年で回答しなかった者の人数が異なり,そうした欠損値を0にすべきか除外するべきかでも悩んでいます。
欠損値を除外すると回答者数に差がでてきてしまい,対応のある検定は使えず,Fisher検定をするのか・・・
欠損値を0にすると,回答しなかった者の割合が検定結果に大きな影響を及ぼすのでよくないのではないか,などと考えていますが,,わかりません。

すみませんが,ご示唆頂けますと非常に助かります。
どうぞ,よろしくお願い致します。

No.20026 Re: 対応のある2群の比較における検定方法  【青木繁伸】 2013/07/06(Sat) 09:42

> 欠損値を0にすべきか除外するべきか

欠損値はデータがないと言うことなので,除外するしかないでしょう(欠損値を推定することもできなくはないですが)。

> 欠損値を除外すると回答者数に差がでてきてしまい

どちらかが欠損値のものは除くのです。

差があったかどうかは,拡張マクネマー検定でよいと思います。以下のページの後半。
http://aoki2.si.gunma-u.ac.jp/lecture/Hiritu/McNemar-test.html

No.20027 Re: 対応のある2群の比較における検定方法  【mii】 2013/07/06(Sat) 10:16

素早いご返信ありがとうございます。
マクネマー検定を行ってみます。

その際,Rを使用して2005と2006年,どちらかの回答にNA(欠損値)のある行を削除するプログラムを教えて頂けますと幸いです。

何度もお手数おかけしてすみません。

No.20028 Re: 対応のある2群の比較における検定方法  【青木繁伸】 2013/07/06(Sat) 11:39

使用例
> d2005 <- c(1,NA,3,2,1,5)
> d2006 <- c(3,2,1,NA,3,2)
> (before <- data.frame(d2005, d2006))
d2005 d2006
1 1 3
2 NA 2
3 3 1
4 2 NA
5 1 3
6 5 2
> (after <- na.omit(before))
d2005 d2006
1 1 3
3 3 1
5 1 3
6 5 2

No.20029 Re: 対応のある2群の比較における検定方法  【mii】 2013/07/06(Sat) 12:01

マクマネー検定を行ったのですがMcNemar's chi-squared = NaN, df=6, p-value =NA
と表示されてしまいp値が得られませんでした。
データは
  1  2 3 4
1 7 3 1 1
2 4 72 1 6
3 4 3 3 0
4 1 4 0 8
です。

仮にxというデータセットの中で,列になっている変数[2005e]と[2006e]においてマクマネー検定を行いたいとき
na.omit(x$2005e)
na.omit(x$2006e)
でNAを除外し

x2 <- merge(x$2005e,x$2006e)
で列を結合させたデータセットx2を作成

mcnemar.test(x2)
で実行しても,エラー'if'x' is not a matrix, 'y' must be given'が表示されてしまい結果が表示されません。matrixにしなければ検定ができないということなのでしょうか。

as.matrix(x2)
を実行してもis.matrix(x2)で確認すると,falseと出てしまい,マトリックス化できません。

R初心者のため迷走していて申し訳ございません,ご返信頂けますと幸いです。

No.20030 Re: 対応のある2群の比較における検定方法  【青木繁伸】 2013/07/06(Sat) 13:05

spss の拡張(私の McNemar 関数)だと答は出ます。

R の mcnemar.test がエラーになるのは,
     [,1] [,2] [,3] [,4]
[1,] 7 3 1 1
[2,] 4 72 1 6
[3,] 4 3 3 0
[4,] 1 4 0 8
の [3, 4], [4, 3] の要素が共に 0 のため,カイ二乗値を計算するときに (n34-n43)^2/(n34+n43) が 0^2/0 になり,0 による割り算になるためです。
理論から言うと,このような組合せの場合にはカイ二乗値の集計に含めなければよいだけ。対角線で対称なセルは以下の5組。理論に基づき,自分で計算しましょう。
> (m <- matrix(c(4, 3, 4, 1, 1, 1, 3, 1,4, 6), byrow=TRUE, ncol=2))
[,1] [,2]
[1,] 4 3
[2,] 4 1
[3,] 1 1
[4,] 3 1
[5,] 4 6
この5組について (nij-nji)^2/(nij+nji) を計算し,和を取れば検定統計量になる。
> (chisq <- sum(apply(m, 1, function(x) (x[1]-x[2])^2/(x[1]+x[2]))))
[1] 3.342857
自由度は 5 なので,有意確率は
> pchisq(chisq, 5, lower.tail=FALSE)
[1] 0.6472869

na.omit は,対応するデータを含むデータフレームを対象にします。

> na.omit(x$2005e)
> na.omit(x$2006e)
> でNAを除外し

ではだめです。x に 2005e, 2006e という2列があるのなら。
x2 <- na.omit(x) とするのです。結果を代入する必要があるかどうかは,使い方によります。

> x2 <- merge(x$2005e,x$2006e)
> で列を結合させたデータセットx2を作成

merge は全く目的に合いません。

na.omit(x$2005e) では x$2005e は何も代わりませんよ。また,ベクトルに na.omit を適用しても意味がありません。

できたもの(x2 など)を表示してみると,思ったように計算できたかどうか容易に確認できるでしょう。

No.20031 Re: 対応のある2群の比較における検定方法  【青木繁伸】 2013/07/06(Sat) 15:10

mcnemar.test の修正

該当する部分,4 所の追加/変更
#    PARAMETER <- r * (r - 1)/2 # 削除
METHOD <- "McNemar's Chi-squared test"
if (correct && (r == 2) && any(x - t(x) != 0)) {
y <- (abs(x - t(x)) - 1)
METHOD <- paste(METHOD, "with continuity correction")
}
else y <- x - t(x)
x <- x + t(x)
non.zero <- x[upper.tri(x)] != 0 # 追加
STATISTIC <- sum((y[upper.tri(x)][non.zero])^2/x[upper.tri(x)][non.zero]) # 変更
PARAMETER <- sum(non.zero) # 追加

● 「統計学関連なんでもあり」の過去ログ--- 046 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る