3
$\begingroup$

I need to do a cell chi square test, but googling availeth me not (I suspect because of all the pages about the cells in chi square discussions generally). How does one calculate this? Any good sources on it, or on it in R specifically?

$\endgroup$
6
  • 3
    $\begingroup$ What is the "cell" chi-squared test? $\endgroup$ Commented Jun 3, 2013 at 15:59
  • $\begingroup$ It tests whether each cell is significantly different from its expected value in the overall table; I know SPSS does it, but I don't currently have access to SPSS, and I'm having trouble finding enough information that would let me recreate it. $\endgroup$
    – Krysta
    Commented Jun 3, 2013 at 16:01
  • 2
    $\begingroup$ To get an idea what the OP means, see here. $\endgroup$ Commented Jun 3, 2013 at 16:24
  • 5
    $\begingroup$ @gung It collapses a larger table to a bunch of 2x2 chi-square tests (the cells [i,j]; [(i),j]; [i,(j)] and [(i),(j)]) - nothing more. (If you already have a 2x2 table, it's simply the ordinary 2x2 chisquare test repeated four times - about as pointless as things get) $\endgroup$
    – Glen_b
    Commented Jun 3, 2013 at 16:45
  • 5
    $\begingroup$ Regarding google, you might want to look for “partitioning chi-squared” for a similar idea and other material that might be relevant to your purpose. “Cell chi-square test” appears to be SPSS-specific terminology. Also relevant would be standardized residuals (cf. Agresti). $\endgroup$
    – Gala
    Commented Jun 3, 2013 at 19:18

1 Answer 1

4
$\begingroup$

As @Glen noted in the comments, the cell $\chi^{2}$-test simply calculates a bunch of $\chi^{2}$-tests on the collapsed 2x2 tables. It is fairly easy to implement in R:

# Example table
M <- as.table(rbind(c(762, 327, 468), c(484, 239, 477)))
dimnames(M) <- list(gender = c("M","F"),
                    party = c("Democrat","Independent", "Republican"))

M
          party
gender Democrat Independent Republican
     M      762         327        468
     F      484         239        477

res.table <- matrix(NA, nrow=dim(M)[1], ncol=dim(M)[2])
dimnames(res.table) <- dimnames(M)

# Loop over all cells of the table

for ( i in 1:dim(M)[1] ) {
  for ( j in 1:dim(M)[2] ) {

    temp.table <- matrix(NA, 2, 2) # the collapsed 2x2 table

    temp.table[1,1] <- M[i,j]
    temp.table[1,2] <- sum(M[-i, j], na.rm=TRUE)
    temp.table[2,1] <- sum(M[i, -j], na.rm=TRUE)
    temp.table[2,2] <- sum(M[-i, -j], na.rm=TRUE)

    chi2 <- chisq.test(temp.table, correct=TRUE) # chi2-test with continuity correction

    # Automatically choose significance level (see SPSS documentation)

    sig.level <- ifelse(M[i,j] <= 300, 0.1,
                        ifelse(M[i,j] > 300 & M[i,j] <= 1000, 0.05,
                               ifelse(M[i,j] > 1000 & M[i,j] <= 4000, 0.025,
                                      ifelse(M[i,j] > 4000 & M[i,j] <= 20000,0.005,0.001)
                                      )
                               )
                        )

    if ( chi2$p.value < sig.level ) {

      res.table[i, j] <- paste(
        chi2$observed[1],
            ifelse(chi2$observed[1] < chi2$expected[1], "<", ">"),
            round(chi2$expected[1], 2))

    } else {

      res.table[i, j] <- "n.s."

    }
  } 
}

res.table

      party
gender Democrat       Independent Republican    
     M "762 > 703.67" "n.s."      "468 < 533.68"
     F "484 < 542.33" "n.s."      "477 > 411.32"
$\endgroup$
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.