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]の [3, 4], [4, 3] の要素が共に 0 のため,カイ二乗値を計算するときに (n34-n43)^2/(n34+n43) が 0^2/0 になり,0 による割り算になるためです。
[1,] 7 3 1 1
[2,] 4 72 1 6
[3,] 4 3 3 0
[4,] 1 4 0 8
理論から言うと,このような組合せの場合にはカイ二乗値の集計に含めなければよいだけ。対角線で対称なセルは以下の5組。理論に基づき,自分で計算しましょう。> (m <- matrix(c(4, 3, 4, 1, 1, 1, 3, 1,4, 6), byrow=TRUE, ncol=2))この5組について (nij-nji)^2/(nij+nji) を計算し,和を取れば検定統計量になる。
[,1] [,2]
[1,] 4 3
[2,] 4 1
[3,] 1 1
[4,] 3 1
[5,] 4 6> (chisq <- sum(apply(m, 1, function(x) (x[1]-x[2])^2/(x[1]+x[2]))))自由度は 5 なので,有意確率は
[1] 3.342857> 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 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る