[Rd] termplot has problems with a single term (fix included) (PR#6675)

Thomas Lumley tlumley at u.washington.edu
Thu Mar 18 20:52:58 MET 2004


On Thu, 18 Mar 2004 k.hansen at biostat.ku.dk wrote:

> The bug exists on R-1.9.0-alpha compiled the 10/3.
>
> Termplot has a problem if either the model only contains a single term
> or if asked to plot a single term. In addition there are problems with
> the option se = TRUE.

I can't reproduce this in either R-devel or 1.8.1, and termplot hasn't
changed since January.

I do
example(termplot)
termplot(model, terms="z")
termplot(model, terms="z", se=TRUE)
termplot(model, terms=1)
termplot(model, terms="ns(x, 6)")
termplot(model, terms="ns(x, 6)", se=TRUE)
termplot(model, terms=2)

mm<-glm(y~x)
termplot(mm)
termplot(mm,se=TRUE)
mm<-glm(y~x-1)
termplot(mm)
termplot(mm,se=TRUE)

without any error messages.  I also note that termplot() doesn't
(anymore) start with the line you say it starts with, though it did until
January.

Could you provide an example?

	-thomas

> Analysis: termplot starts with
>
>   terms <- if (is.null(terms))
>     predict(model, type = "terms", se = se)
>   else predict(model, type = "terms", se = se, terms = terms)
>   n.tms <- ncol(tms <- as.matrix(if (se)
>                                  terms$fit
>   else terms))
>
> In this case terms is now a matrix of fitted values, with a single
> column for each term in the model or in the terms argument. Because
> the predict function returns a vector if called with a single term,
> the matrix tms has no column names. This maskes the lines
>   nmt <- colnames(tms)
>   cn <- parse(text = nmt)
> fail.
>
> Solution: manually add the column names in case the number of columns
> of tms == 1. Beware that the terms argument is overwritten in the
> first line of the function (Is that a good style? Perhaps the body of
> the function needs another name for the terms object defined in the
> very first line). This means we manually need to save the terms name
> first (code below)
>
> Fixing this bug uncovers another one: in case of a single term in the
> model formula, and with the option se = TRUE, the terms objects
> consists of a list with elements fit and se.fit. In the code above
> explicit care is taken to ensure that the fit element is a matrix by
> using
>   tms <- as.matrix(if (se) terms$fit
>                    else terms)
> The element se.fit needs to be a matrix as well. I suggest a final fix
> to be
>
> {
> *  terms.names <- terms
>    terms <- if (is.null(terms))
>      predict(model, type = "terms", se = se)
>    else predict(model, type = "terms", se = se, terms = terms)
>    n.tms <- ncol(tms <- as.matrix(if (se)
>                                   terms$fit
>    else terms))
> *  if(n.tms==1)
> *    colnames(tms) <- if(is.null(terms)) attr(model$terms, "term.labels")
> *                        else terms.names
> *  if(se)
> *    terms$se.fit <- as.matrix(terms$se.fit)
>
> * = added line.
>
>
> The fix above is somewhat ugly. Perhaps (as mentioned above) the
> object terms needs renaming (terms.something?), in which case the
> first line is redundant.
> --
> Kasper Daniel Hansen, Research Assistent
> Department of Biostatistics, University of Copenhagen
>
> ______________________________________________
> R-devel at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-devel
>

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle



More information about the R-devel mailing list