[Rd] Bug in ci.plot(HH Package) (PR#11163)

nakajima at hokkaido-iri.go.jp nakajima at hokkaido-iri.go.jp
Mon Apr 14 03:05:28 CEST 2008


Full_Name: Yasuhiro Nakajima
Version: 2.6.1
OS: WinXP SP2
Submission from: (NULL) (202.237.255.13)


Dear all,

I noticed the following behaviour of ci.plot in HH Package(ver.2.1-9):

> library(HH)
> data(women, package="datasets")
> attach(women)
> ft <- lm(height~weight)
> windows()
> ci.plot(ft,conf.level=0.95)
> windows()
> ci.plot(ft,conf.level=0.999)

I tried to change the confidence interval, but I couldn't.
CI was "always" 0.95. 

I have found wrong argument in predict function in ci.plot.

>>   predict(....., conf.level=conf.level)

I think the correct is "level=conf.level".

Is that right?


--- ci.plot source code ---
"ci.plot" <-
function(lm.object, ...)
  UseMethod("ci.plot")

"ci.plot.lm" <-
function(lm.object,
         xlim=range(data[, x.name]),
         newdata,
         conf.level=.95,
         data=model.frame(lm.object),
         newfit,
         ylim=range(newfit$pi.fit),
         pch=16,
         main.cex=1,
         main=list(paste(100*conf.level,
           "% confidence and prediction intervals for ",
           substitute(lm.object), sep=""), cex=main.cex), ...
         ) {
  formula.lm <- formula(lm.object)
  x.name <- as.character(formula.lm[[3]])
  missing.xlim <- missing(xlim)       ## R needs this
  missing.newdata <- missing(newdata) ## R needs this
  if.R(s={
    ## Save a copy of the data.frame in frame=0 to put it where
    ## model.frame.lm needs to find it when the example data is
    ## run through Splus CMD check.
    my.data.name <- as.character(lm.object$call$data)
    if (length(my.data.name)==0)
      stop("Please provide an lm.object calculated with an explicit
'data=my.data.frame' argument.")
    undo.it <- (!is.na(match(my.data.name, objects(0))))
    if (undo.it) old.contents <- get(my.data.name, frame=0)
    my.data <- try(get(my.data.name))
    if (class(my.data)=="Error")
      my.data <- try(get(my.data.name, frame=sys.parent()))
    if (class(my.data)=="Error")
      stop("Please send me an email with a reproducible situation that got you
here. (rmh at temple.edu)")
    assign(my.data.name, my.data, frame=0)
  },r={})
  default.newdata <- data.frame(seq(xlim[1], xlim[2], length=51))
  names(default.newdata) <- x.name
  if (missing.xlim) xlim <- xlim + diff(xlim)*c(-.02,.02) ## needed
  if (missing.newdata) {
    newdata <- default.newdata
    newdata.x <- numeric()
  }
  else {
    if (is.na(match(x.name, names(newdata))))
      stop(paste("'newdata' must be a data.frame containing a column named '",
                 x.name, "'", sep=""))
    if (missing.xlim)
      xlim=range(xlim, newdata[[x.name]])
    newdata.x <- as.data.frame(newdata)[,x.name]
    newdata <- rbind(as.data.frame(newdata)[,x.name, drop=FALSE],
                     default.newdata)
    newdata <- newdata[order(newdata[,x.name]), , drop=FALSE]
  }
  if (missing.xlim) xlim <- xlim + diff(xlim)*c(-.02,.02) ## repeat is needed
  if (missing(newfit)) newfit <-
    if.R(s={
      
      prediction <-
        predict(lm.object, newdata=newdata,
                se.fit=TRUE, ci.fit=TRUE, pi.fi=TRUE,
                conf.level=conf.level)
      {
        ## restore frame=0
        if (undo.it) assign(my.data.name, old.contents, frame=0)
        else remove(my.data.name, frame=0)
      }
      prediction
    }
         ,r={
           new.p <-
             predict(lm.object, newdata=newdata,
                     se.fit=TRUE, conf.level=conf.level,
                     interval = "prediction")
           new.c <-
             predict(lm.object, newdata=newdata,
                     se.fit=TRUE, conf.level=conf.level,
                     interval = "confidence")
           tmp <- new.p
           tmp$ci.fit <- new.c$fit[,c("lwr","upr"), drop=FALSE]
           dimnames(tmp$ci.fit)[[2]] <- c("lower","upper")
           attr(tmp$ci.fit,"conf.level") <- conf.level
           tmp$pi.fit <- new.p$fit[,c("lwr","upr"), drop=FALSE]
           dimnames(tmp$pi.fit)[[2]] <- c("lower","upper")
           attr(tmp$pi.fit,"conf.level") <- conf.level
           tmp$fit <- tmp$fit[,"fit", drop=FALSE]
           tmp
         })
  tpgsl <- trellis.par.get("superpose.line")
  tpgsl <- Rows(tpgsl, 1:4)
  tpgsl$col[1] <- 0
  xyplot(formula.lm, data=data, newdata=newdata, newfit=newfit,
         newdata.x=newdata.x,
         xlim=xlim, ylim=ylim, pch=pch,
         panel=function(..., newdata.x) {
           panel.ci.plot(...)
           if (length(newdata.x) > 0)
             panel.rug(x=newdata.x)
         },
         main=main,
         key=list(border=TRUE,
           space="right",
           text=list(c("observed","fit","conf int","pred int")),
           points=list(
             pch=c(pch,32,32,32),
             col=c(trellis.par.get("plot.symbol")$col, tpgsl$col[2:4])
             ),
           lines=tpgsl),
         ...)
}



More information about the R-devel mailing list