Byerly, Mike M (DFG)
2012-Mar-07 03:55 UTC
[R] confidence intervals in dotplots in a for loop
# I have some population estimates and confidence intervals for various size classes # of animals captured with two gear types. I'd like to plot the estimates along with # the 90 and 95% CI's by size class for each gear type. # The data can be read in as: estimates <- c(67.42,30.49,32.95,23.53,10.26,6.03,23.53,0.93,50.72,24.2,25.84,18.54, 7.16,3.6,9.35,0.33,87.28,37.25,40.16,28.59,13.77,8.92,40.74,1.68,48.28,2 3.09, 24.49,17.7,6.63,3.28,7.79,0.26,91.63,38.74,41.6,29.74,14.49,9.51,44.16,1 .88) estimates.m<- matrix(estimates, 8,5) colnames(estimates.m) <- list("est","lci90","uci90","lci95","uci95") id <- c(1,1,2,2,3,3,4,4) size <- c("All","All","Large","Large","Medium","Medium","Small","Small") gear <- rep(c("Camera","Dredge"),4) cds.est <- data.frame(id,size,gear,estimates.m) # The following script works fine for plotting one size class at a time using dotplot() and is how I # would like the plots to look library(lattice) dat1 <- cds.est[cds.est$id == 1,] dotplot(gear ~ est , data=dat1, xlim = c(min(dat1$lci95 -10), max(dat1$uci95 +10)), xlab='Density (num / Nmi^2)', main = as.vector(unique(dat1$size)), panel=function(x,y) { panel.xyplot(x,y,pch=16,cex=1) panel.segments(dat1$lci95,as.numeric(y),dat1$uci95,as.numeric(y), lty=1, col=1) panel.segments(dat1$lci90,as.numeric(y),dat1$uci90,as.numeric(y), lty=1, lwd=4, col='grey60') panel.xyplot(x,y,pch=16,cex=1.2,col='white') panel.xyplot(x,y,pch=1,cex=1.1, col='black') }) # Since I have multiple size classes and will producing similar plots for other data sets # I've written the following script using a loop. The script loops over the "id" variable in the # cds.est data frame and stores the plots in a list. Since dotplot() is part of the # lattice package, I used grid.arrange to tile the plots. library(grid) library(gridExtra) id2 <- 1:max(cds.est$id) plots <- vector("list", length(id2)) j <- 0 for (i in id2) { dat <- cds.est[cds.est$id == i,] plots[[ j <- j+1]] <- dotplot(gear ~ est , data=dat, xlim = c(min(dat$lci95 -10), max(dat$uci95 +10)), xlab='Density (num / Nmi^2)', main = as.vector(unique(dat$size)), panel=function(x,y) { panel.xyplot(x,y,pch=16,cex=1) panel.segments(dat$lci95,as.numeric(y),dat$uci95,as.numeric(y), lty=1, col=1) panel.segments(dat$lci90,as.numeric(y),dat$uci90,as.numeric(y), lty=1, lwd=4, col='grey60') panel.xyplot(x,y,pch=16,cex=1.2,col='white') panel.xyplot(x,y,pch=1,cex=1.1, col='black') }) } do.call(grid.arrange, plots) # The script runs and produces all the plots with the correct estimates, but the CI's are not # plotting correctly. Does anyone have suggestions on what is causing this? Thanks, Mike [[alternative HTML version deleted]]
On Tue, Mar 6, 2012 at 8:55 PM, Byerly, Mike M (DFG) <mike.byerly at alaska.gov> wrote:> > estimates <-c(67.42,30.49,32.95,23.53,10.26,6.03,23.53,0.93,50.72,24.2,25.84,18.54, 7.16,3.6,9.35,0.33,87.28,37.25,40.16,28.59,13.77,8.92,40.74,1.68,48.28,23.09, 24.49,17.7,6.63,3.28,7.79,0.26,91.63,38.74,41.6,29.74,14.49,9.51,44.16,1.88)> estimates.m<- matrix(estimates, 8,5) > colnames(estimates.m) <- list("est","lci90","uci90","lci95","uci95") > id <- c(1,1,2,2,3,3,4,4) > size <- c("All","All","Large","Large","Medium","Medium","Small","Small") > gear <- rep(c("Camera","Dredge"),4) > cds.est <- data.frame(id,size,gear,estimates.m)# From this point try this instead: library(lattice) library(gridExtra) dat <- by(cds.est,cds.est$id,function(x) x) plots <- lapply(dat,function(dat){ dotplot(gear ~ est , data=dat, xlim = c(min(dat$lci95-10), max(dat$uci95 +10)), xlab='Density (num / Nmi^2)', main = as.vector(unique(dat$size)), panel=function(x,y) { panel.xyplot(x,y,pch=16,cex=1) panel.segments(dat$lci95,as.numeric(y),dat$uci95,as.numeric(y), lty=1, col=1) panel.segments(dat$lci90,as.numeric(y),dat$uci90,as.numeric(y), lty=1,lwd=4, col='grey60') panel.xyplot(x,y,pch=16,cex=1.2,col='white') panel.xyplot(x,y,pch=1,cex=1.1, col='black') } ) }) do.call(grid.arrange, plots)> # cds.est data frame and stores the plots in a list. ?Since dotplot() is > part of the # lattice package, I used grid.arrange to tile the plots.In my opinion you are going about it the wrong way. You are not using any of the functionality provided by lattice or dotplot for scaling and panel arrangement. All you use are panel.xyplot and panel.segments, manually calculating limits, labels and arranging the plots yourself - you could have just done this in base graphics (and a loop). But if that's how you want it to look... HTH> > > > library(grid) > > library(gridExtra) > > > > id2 <- 1:max(cds.est$id) > > plots <- vector("list", length(id2)) > > j <- 0 > > for (i in id2) { > > ? ? ? ? ? ? ? ?dat <- cds.est[cds.est$id == i,] > > ? ? ? ? ? ? ? ?plots[[ j <- j+1]] <- > > ? ? ? ? ? ? ? ?dotplot(gear ~ est , data=dat, xlim = c(min(dat$lci95 > -10), max(dat$uci95 +10)), xlab='Density (num / Nmi^2)', > > ? ? ? ? ? ? ? ?main = as.vector(unique(dat$size)), > > ? ? ? ? ? ? ? ?panel=function(x,y) { > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?panel.xyplot(x,y,pch=16,cex=1) > > > panel.segments(dat$lci95,as.numeric(y),dat$uci95,as.numeric(y), lty=1, > col=1) > > > panel.segments(dat$lci90,as.numeric(y),dat$uci90,as.numeric(y), lty=1, > lwd=4, col='grey60') > > > panel.xyplot(x,y,pch=16,cex=1.2,col='white') > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?panel.xyplot(x,y,pch=1,cex=1.1, > col='black') > > }) > > > > } > > do.call(grid.arrange, plots) > > > > # The script runs and produces all the plots with the correct estimates, > but the CI's are not > > # plotting correctly. ?Does anyone have suggestions on what is causing > this? > > > > Thanks, Mike > > > > > > > > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.