# Detecting overdispersion in Poisson data X2.overdisp.Poisson<-function(yy) { # yy = vector of observed counts css <- var(yy)*(length(yy)-1) ybar<- mean(yy) X2 <- css/ybar Pvalue <- 1-pchisq(X2,length(yy)-1) list(X2=X2,Pvalue=Pvalue) } offsprg.0 <-c(27,32,34,33,36,34,33,30,24,31) offsprg.80 <-c(33,33,35,33,36,26,27,31,32,29) offsprg.160<-c(29,29,23,27,30,31,30,26,29,29) offsprg.235<-c(23,21, 7,12,27,16,13,15,21,17) offsprg.310<-c( 6, 6, 7, 0,15, 5, 6, 4, 6, 5) nitro.conc<-rep(c(0,80,160,235,310),c(10,10,10,10,10)) offsprg<-c(offsprg.0,offsprg.80,offsprg.160, offsprg.235,offsprg.310) nitro.df<-data.frame(conc=nitro.conc,offspring=offsprg) nitro.ngrp<-length(unique(nitro.df$conc)) nitro.lst<-split(nitro.df$offspring,nitro.df$conc) for (iii in 1:nitro.ngrp) { cat("Concentration = ",signif(unique(nitro.df$conc)[iii]),"\n") junk<-unlist(X2.overdisp.Poisson(nitro.lst[[iii]])) cat("\t","X2 = ",signif(junk[1]), "; P-value = ",signif(junk[2]),"\n") } # output follows ... Concentration = 0 X2 = 3.70701 ; P-value = 0.929617 Concentration = 80 X2 = 3.06349 ; P-value = 0.961724 Concentration = 160 X2 = 1.77032 ; P-value = 0.994601 Concentration = 235 X2 = 18.2326 ; P-value = 0.0325693 Concentration = 310 X2 = 20.6667 ; P-value = 0.0142156