[R] Ooops, small mistake fixed (pretty printing multiple models)

Ajay Narottam Shah ajayshah at mayin.org
Thu Aug 31 20:49:54 CEST 2006


The R code I just mailed out had a small error in it. This one
works. Now what one needs is a way to get decimal alignment in LaTeX
tabular objects.

x1 <- runif(100); x2 <- runif(100); y <- 2 + 3*x1 - 4*x2 + rnorm(100)
m1 <- summary(lm(y ~ x1))
m2 <- summary(lm(y ~ x2))
m3 <- summary(lm(y ~ x1 + x2))

# What I want is this table:
# 
# -----------------------------------------------------------
#                     M1             M2              M3
# -----------------------------------------------------------
# Intercept         0.0816         3.6292         2.2272
#                  (0.5533)       (0.2316)***    (0.2385)***
# 
# x1                2.8151                        2.7606
#                  (0.5533)***                   (0.3193)***
# 
# x2                              -4.2899        -4.2580
#                                 (0.401)***     (0.3031)***
# 
# $\sigma_e$        1.538          1.175          0.8873
# $R^2$             0.2089         0.5385         0.7393
# -----------------------------------------------------------

mmp <- function(regressors, bottom.matter, models.names, allmodels) {
  numbers <- matrix(NA, nrow=(2*length(regressors))+length(bottom.matter),
                    ncol=length(models.names))
  colnames(numbers) <- models.names
  rownames(numbers) <- rep("t", nrow(numbers))

  baserow <- 1
  for (i in 1:length(regressors)) {
    if (regressors[i] == "Intercept") {
      regex <- "^\\(Intercept\\)$"
    } else {
      regex <- paste("^", regressors[i], "$", sep="")
    }
    rownames(numbers)[baserow] <- regressors[i]
    for (j in 1:length(allmodels)) {
      m <- allmodels[[j]]
      if (any(locations <- grep(regex, rownames(m$coefficients)))) {
        if (length(locations) > 1) {
          cat("Regex ", regex, " has multiple matches at model ", j, "\n")
          return(NULL)
        }
        numbers[baserow,j] <- as.numeric(sprintf("%.4f",
                                                 m$coefficients[locations,1]))
        numbers[baserow+1,j] <- as.numeric(sprintf("%.4f",
                                                   m$coefficients[locations,3]))
      }
    }
    baserow <- baserow + 2
  }

                                        # Now process the bottom.matter
  for (i in 1:length(bottom.matter)) {
    if (bottom.matter[i] == "sigma") {
      for (j in 1:length(allmodels)) {
        m <- allmodels[[j]]
        numbers[baserow,j] <- as.numeric(sprintf("%.4f", m$sigma))
      }
      rownames(numbers)[baserow] <- "Residual std. dev."
      baserow <- baserow + 1
    }
    
    if (bottom.matter[i] == "r.squared") {
      for (j in 1:length(allmodels)) {
        m <- allmodels[[j]]
        numbers[baserow,j] <- as.numeric(sprintf("%.4f", m$r.squared))
      }
      rownames(numbers)[baserow] <- "$R^2$"
      baserow <- baserow + 1
    }

    if (bottom.matter[i] == "adj.r.squared") {
      for (j in 1:length(allmodels)) {
        m <- allmodels[[j]]
        numbers[baserow,j] <- as.numeric(sprintf("%.4f", m$adj.r.squared))
      }
      rownames(numbers)[baserow] <- "Adjusted $R^2$"
      baserow <- baserow + 1
    }
  }
  numbers
}

# Given a 't' statistic, give me a string with
# '*' or '**' or '***' based on the 90%, 95% and 99% cutoffs on N(0,1)
stars <- function(t) {
  t <- abs(t)
  n <- -1 + as.numeric(cut(t,breaks=c(-0.01,-qnorm(c(0.05, 0.025, 0.005)),Inf)))
  if (n == 0) {
    return("")
  } else {
    return(paste("$^\\textrm{",
                 paste(rep("*", n), sep="", collapse=""),
                 "}$", sep=""))
  }
}

specialised.latex.generation <- function(numbers) {
  cat("\\hline\n")
  for (j in 1:ncol(numbers)) {
    cat(" & ", colnames(numbers)[j])
  }
  cat("\\\\\n\\hline\n")
  for (i in 1:nrow(numbers)) {
    if (rownames(numbers)[i] == "t") {
      for (j in 1:ncol(numbers)) {
        if (is.na(numbers[i,j])) {
          cat(" & ")
        } else {
          cat(" & ", sprintf("(%s)%s", numbers[i,j], stars(numbers[i,j])))
        }
      }
      cat("\\\\[1mm]\n")
    } else {
      cat(rownames(numbers)[i])
      for (j in 1:ncol(numbers)) {
        if (is.na(numbers[i,j])) {
          cat(" & ")
        } else {
          cat(" & ", numbers[i, j])
        }
      }
      cat("\\\\\n")
    }
  }
  cat("\\hline")
}

numbers <- mmp(regressors=c("Intercept", "x1", "x2"),
               bottom.matter=c("sigma", "r.squared", "adj.r.squared"),
               models.names=c("M1", "M2", "M3"),
               allmodels=list(m1, m2, m3))
numbers
specialised.latex.generation(numbers)

-- 
Ajay Shah                                      http://www.mayin.org/ajayshah  
ajayshah at mayin.org                             http://ajayshahblog.blogspot.com
<*(:-? - wizard who doesn't know the answer.



More information about the R-help mailing list