[Rd] Bug in plot.lm (PR#6640)

berwin at maths.uwa.edu.au berwin at maths.uwa.edu.au
Wed Mar 3 11:11:16 MET 2004


Dear all,

I noticed the following behaviour of plot.lm:

> fm1 <- lm(time~dist, data=hills, weights=c(0,0,rep(1,33)))
> par(mfrow=c(2,2))
> plot(fm1)
Warning messages: 
1: longer object length
	is not a multiple of shorter object length in: res/(sd * (1 - hat)) 
2: longer object length
	is not a multiple of shorter object length in: (res/(sd * (1 - hat)))^2 * hat 

which seems to be undesirable.

The patch below seems to fix the problem.  At least, there is no more
warning message and the output looks similar to the output from

> fm2 <- lm(time~dist, data=hills, subset= -(1:2) )
> par(mfrow=c(2,2))
> plot(fm2)

Cheers,
        
        Berwin

*** plot.lm.R.orig      Fri Aug 15 22:13:08 2003
--- plot.lm.R   Wed Mar  3 18:05:34 2004
***************
*** 16,32 ****
      show <- rep(FALSE, 4)
      show[which] <- TRUE
      r <- residuals(x)
-     n <- length(r)
      yh <- predict(x) # != fitted() for glm
      if (any(show[2:4])) {
          s <- if(inherits(x, "rlm")) x$s else sqrt(deviance(x)/df.residual(x))
          hii <- lm.influence(x, do.coef=FALSE)$hat
      }
      if (any(show[2:3])) {
          ylab23 <- if(isGlm) "Std. deviance resid." else "Standardized residuals"
-         w <- weights(x)
          # r.w := weighted.residuals(x):
!         r.w <- if(is.null(w)) r else (sqrt(w)*r)[w!=0]
          rs <- r.w/(s * sqrt(1 - hii))
      }
      if (any(show[c(1,3)]))
--- 16,38 ----
      show <- rep(FALSE, 4)
      show[which] <- TRUE
      r <- residuals(x)
      yh <- predict(x) # != fitted() for glm
+     w <- weights(x)
+     if(!is.null(w)){
+       wind <- w!=0
+       r <- r[wind]
+       yh <- yh[wind]
+       w <- w[wind]
+     }
+     n <- length(r)
      if (any(show[2:4])) {
          s <- if(inherits(x, "rlm")) x$s else sqrt(deviance(x)/df.residual(x))
          hii <- lm.influence(x, do.coef=FALSE)$hat
      }
      if (any(show[2:3])) {
          ylab23 <- if(isGlm) "Std. deviance resid." else "Standardized residuals"
          # r.w := weighted.residuals(x):
!         r.w <- if(is.null(w)) r else (sqrt(w)*r)
          rs <- r.w/(s * sqrt(1 - hii))
      }
      if (any(show[c(1,3)]))
***************
*** 39,46 ****
            stop("`id.n' must be in {1,..,",n,"}")
      }
      if(id.n > 0) { ## label the largest residuals
!         if(is.null(labels.id))
!             labels.id <- paste(1:n)
          iid <- 1:id.n
        show.r <- sort.list(abs(r), decreasing = TRUE)[iid]
          if(any(show[2:3]))
--- 45,55 ----
            stop("`id.n' must be in {1,..,",n,"}")
      }
      if(id.n > 0) { ## label the largest residuals
!         if(is.null(labels.id)){
!           labels.id <- paste(1:n)
!         }else if(!is.null(w) && length(labels.id)!=n){
!           labels.id <- labels.id[wind]
!         }
          iid <- 1:id.n
        show.r <- sort.list(abs(r), decreasing = TRUE)[iid]
          if(any(show[2:3]))

        
--please do not edit the information below--

Version:
 platform = i686-pc-linux-gnu
 arch = i686
 os = linux-gnu
 system = i686, linux-gnu
 status = 
 major = 1
 minor = 8.1
 year = 2003
 month = 11
 day = 21
 language = R

Search Path:
 .GlobalEnv, package:DAAG, package:MASS, package:methods, package:ctest, package:mva, package:modreg, package:nls, package:ts, Autoloads, package:base



More information about the R-devel mailing list