From ripley at stats.ox.ac.uk  Sat Mar  6 15:50:49 2004
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Sat Mar  6 15:51:01 2004
Subject: [Rd] Bug in plot.lm (PR#6640)
In-Reply-To: <20040303101116.373C1EDF6@slim.kubism.ku.dk>
Message-ID: <Pine.LNX.4.44.0403061449210.11101-100000@gannet.stats>

Thank you.  Unfortunately that fix is not complete, as you need also to 
fix up the labels.

A more complete fix has been put in the R-devel sources.

On Wed, 3 Mar 2004 berwin@maths.uwa.edu.au wrote:

> 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
> 
> ______________________________________________
> R-devel@stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-devel
> 
> 

-- 
Brian D. Ripley,                  ripley@stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595


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