Skip to content

McNemar test in R & SPSS

5 messages · Bob Green, Peter Dalgaard

#
Hello,

I am hoping someone can clarify why I might obtain a quite different value 
in R & SPSS  for a McNemar test I ran.

Firstly, here is the R syntax & output


R OUTPUT

 > mctest <- as.table(matrix(c(128,29,331,430),
+ ncol =2, dimnames = list(group=c("preMHT","postMHT"),
+ assault=c("yes","no"))))

 > mctest
               assault
group       yes  no
   preMHT  128 331
   postMHT  29 430

 >  mcnemar.test(mctest,correct=F)

         McNemar's Chi-squared test

data:  mctest
McNemar's chi-squared = 253.3444, df = 1, p-value < 2.2e-16


SPSS OUTPUT

The same data was inputted in SPSS. Regarding the first table SPSS 
generated - it lists the number of cases in each combination of categories. 
The diagonal contains the number of cases with the same response on both 
variables, while the off diagonal contains cases that have different 
responses on the 2 variables. The overall chisquare value is much lower 
than the value obtained using R, though still significant.


pre02 & post02

pre02   post02

         0       1
0       311     20
1       119     9


Test Statistics(b)

  pre02 & post02

N               459
Chi-Square(a)   69.094
Asymp. Sig.     .000

a  Continuity Corrected
b  McNemar Test


Any assistance is much appreciated,

Bob Green
#
Bob Green wrote:
Well, you can't expect R to give the correct result if you feed it the 
wrong matrix, can you?
0:          0       1

1: 0       311     20

2: 1       119     9

3:
X0 X1

0 311 20

1 119  9
McNemar's Chi-squared test

data:  as.matrix(d) 

McNemar's chi-squared = 70.5108, df = 1, p-value < 2.2e-16
McNemar's Chi-squared test with continuity correction

data:  as.matrix(d) 

McNemar's chi-squared = 69.0935, df = 1, p-value < 2.2e-16
#
Peter,

Thanks for your reply. To perform the analysis in R, I used the table 
format suggested in the book by Everitt & Hothorn, whereas in SPSS the 
analysis was performed directly from the 2 variables, rather than using 
count data.

There is still something I don't understand  - I tried to replicate the 
syntax from your e-mail but my computer just kept waiting - what am I still 
doing wrong?


  mctest <- as.table(matrix(c(128,29,331,430), ncol =2, dimnames = 
list(group=c("preMHT","postMHT"), assault=c("yes","no"))))
 > d <- read.table(stdin())
0: mcnemar.test(as.matrix(d),correct=F)
1:

Thanks again

Bob
At 10:52 PM 26/12/2006 +0100, Peter Dalgaard wrote:
#
Bob Green wrote:
You still need the right table.

matrix(c(128,29,331,430), ncol =2,....)

consists of the two marginal tables, which has strictly less information than the crosstabulation of pre and post values. I expect every text on the McNemar test makes this point, and I'd be highly surprised if E&H really suggested that you should use the table that you did.
You need to give it the data when it starts with the "0:"-style prompt, 
end with a blank line, as shown. It's just a device for cutting and 
pasting your table. I might as well have used

d <- matrix(c(311,119,20,9), ncol=2)

Or, with the raw data to hand

d <- table(preMHT, postMHT)
#
I now see the original E & H table was based on matched pairs not the raw 
counts. I now understand this much better and have the syntax generates 
results that correspond with your results  (and SPSS),

Thanks again,

Bob