[R] A suggestion for predict function(s)

Liaw, Andy andy_liaw at merck.com
Wed Apr 13 12:26:28 CEST 2005


I must respectfully disagree.  Why carry extra copies of data arround?  This
is probably OK for small to medium sized data, but definitely not for large
data.

Besides, in your example, it may do different things depending on whether
newdata is supplied:  model.matrix is not necessarily the same as the
original data frame.  You need a bit more work to get the right model.matrix
that correspond to the newdata.  It's not clear to me whether you want to
return model matrix or model frame, but in either case it's not sufficient
to just use `newdata'.

Andy

> From: Ross Darnell
> 
> Maybe a useful addition to the predict functions would be to 
> return the 
> values of the predictor variables. It just (unless there are 
> problems) 
> requires an extra line. I have inserted an example below.
> 
> "predict.glm" <-
>    function (object, newdata = NULL, type = c("link", "response",
>                                        "terms"), se.fit = FALSE, 
> dispersion = NULL, terms = NULL,
>              na.action = na.pass, ...)
> {
>    type <- match.arg(type)
>    na.act <- object$na.action
>    object$na.action <- NULL
>    if (!se.fit) {
>      if (missing(newdata)) {
>        pred <- switch(type, link = object$linear.predictors,
>                       response = object$fitted, terms = 
> predict.lm(object,
>                                                   se.fit = 
> se.fit, scale 
> = 1, type = "terms",
>                                                   terms = terms))
>        if (!is.null(na.act))
>          pred <- napredict(na.act, pred)
>      }
>      else {
>        pred <- predict.lm(object, newdata, se.fit, scale = 1,
>                           type = ifelse(type == "link", 
> "response", type),
>                           terms = terms, na.action = na.action)
>        switch(type, response = {
>          pred <- family(object)$linkinv(pred)
>        }, link = , terms = )
>      }
>    }
>    else {
>      if (inherits(object, "survreg"))
>        dispersion <- 1
>      if (is.null(dispersion) || dispersion == 0)
>        dispersion <- summary(object, dispersion = 
> dispersion)$dispersion
>      residual.scale <- as.vector(sqrt(dispersion))
>      pred <- predict.lm(object, newdata, se.fit, scale = 
> residual.scale,
>                         type = ifelse(type == "link", 
> "response", type),
>                         terms = terms, na.action = na.action)
>      fit <- pred$fit
>      se.fit <- pred$se.fit
>      switch(type, response = {
>        se.fit <- se.fit * abs(family(object)$mu.eta(fit))
>        fit <- family(object)$linkinv(fit)
>      }, link = , terms = )
>      if (missing(newdata) && !is.null(na.act)) {
>        fit <- napredict(na.act, fit)
>        se.fit <- napredict(na.act, se.fit)
>      }
>      predictors <- if (missing(newdata)) model.matrix(object) 
> else newdata
>      pred <- list(predictors=predictors,
>                   fit = fit, se.fit = se.fit,
>                   residual.scale = residual.scale)
>    }
>    pred
> 
> 
> #______________________ end of R code
> 
> 
> 
> Ross Darnell
> -- 
> School of Health and Rehabilitation Sciences
> University of Queensland, Brisbane QLD 4072 AUSTRALIA
> Email: <r.darnell at uq.edu.au>
> Phone: +61 7 3365 6087     Fax: +61 7 3365 4754  Room:822, 
> Therapies Bldg.
> http://www.shrs.uq.edu.au/shrs/school_staff/ross_darnell.html
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
> 
> 
>




More information about the R-help mailing list