Re: [R] plot(cox.zph()): customize xlab & ylab

From: Dan Bebber <danbebber_at_yahoo.co.uk>
Date: Tue 12 Jul 2005 - 01:04:09 EST


Dear all,

I've modified the plot.cox.zph function to allow customized xlab and ylab (see below). Someone might like to confirm that it works.

Thanks for all the assistance.

Dan


plot.cox.zph <- function (x, resid = TRUE, se = TRUE, df = 4, nsmo = 40, var,

    xlab="Time",ylab = paste("Beta(t) for", dimnames(yy)[[2]]),...)
{

    xx <- x$x
    yy <- x$y
    d <- nrow(yy)
    df <- max(df)
    nvar <- ncol(yy)
    pred.x <- seq(from = min(xx), to = max(xx), length = nsmo)

    temp <- c(pred.x, xx)
    lmat <- ns(temp, df = df, intercept = TRUE)
    pmat <- lmat[1:nsmo, ]
    xmat <- lmat[-(1:nsmo), ]
    qmat <- qr(xmat)
    if (se) {
        bk <- backsolve(qmat$qr[1:df, 1:df], diag(df))
        xtx <- bk %*% t(bk)
        seval <- d * ((pmat %*% xtx) * pmat) %*%
rep(1, df)

}

    if (missing(var))

        var <- 1:nvar
    else {

        if (is.character(var)) 
            var <- match(var, dimnames(yy)[[2]])
        if (any(is.na(var)) || max(var) > nvar ||
min(var) < 
            1) 
            stop("Invalid variable requested")

}

    if (x$transform == "log") {
        xx <- exp(xx)
        pred.x <- exp(pred.x)

}

    else if (x$transform != "identity") {
        xtime <- as.numeric(dimnames(yy)[[1]])
        apr1 <- approx(xx, xtime, seq(min(xx),
max(xx), length = 17)[2 * 
            (1:8)])
        temp <- signif(apr1$y, 2)
        apr2 <- approx(xtime, xx, temp)
        xaxisval <- apr2$y
        xaxislab <- rep("", 8)
        for (i in 1:8) xaxislab[i] <- format(temp[i])

}

    for (i in var) {
        y <- yy[, i]
        yhat <- pmat %*% qr.coef(qmat, y)
        if (resid) 
            yr <- range(yhat, y)
        else yr <- range(yhat)
        if (se) {
            temp <- 2 * sqrt(x$var[i, i] * seval)
            yup <- yhat + temp
            ylow <- yhat - temp
            yr <- range(yr, yup, ylow)
        }
        if (x$transform == "identity") 
            plot(range(xx), yr, type = "n", xlab =
xlab, ylab = ylab[i], 
                ...)
        else if (x$transform == "log") 
            plot(range(xx), yr, type = "n", xlab =
xlab, ylab = ylab[i], 
                log = "x", ...)
        else {
            plot(range(xx), yr, type = "n", xlab =
xlab, ylab = ylab[i], 
                axes = FALSE, ...)
            axis(1, xaxisval, xaxislab)
            axis(2)
            box()
        }
        if (resid) 
            points(xx, y)
        lines(pred.x, yhat)
        if (se) {
            lines(pred.x, yup, lty = 2)
            lines(pred.x, ylow, lty = 2)
        }

}

}
> On Mon, 11 Jul 2005, Adaikalavan Ramasamy wrote:
> 
> > I am not sure if there is an easy way around this.
> An ugly hack is to
> > make a copy the function "survival:::plot.cox.zph"
> and make your
> > modified function. But there are others in the
> list who might know
> > neater solutions.
> 
> If you then send a patch to the package maintainer
> it stops being an ugly 
> hack and turns into an example of collaborative
> open-source development :)
> 
>  	-thomas
> 
>

______________________________________________
R-help@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 Received on Tue Jul 12 01:10:14 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:33:28 EST