njt
njt

Reputation: 277

Output a table with standard errors below estimates

So I've got some parameter estimates like so

est<-matrix(1:10,nrow=2)
colnames(est)<-c("a","b","c","d","e")

and I've got some standard errors like so

se<-matrix(seq(0.1,1,by=0.1),nrow=2)
colnames(se)<-c("a","b","c","d","e")

and I want to output a Latex (or HTML) table where each parameter estimate has its standard error in parens just below it.

The table should look something like this

    a    &   b    &  c    &  d    &  e
    1    &   3    &  5    &  7    &  9
  (0.1)  &  (0.3) & (0.5) & (0.7) & (0.9)
    2    &   4    &  6    &  8    &  10
  (0.2)  &  (0.4) & (0.6) & (0.8) & (1.0)

except, you know, in proper Latex (or HTML). How can I do this from R?

Upvotes: 3

Views: 3488

Answers (4)

jinxia li
jinxia li

Reputation: 1

In R markdown, you can use the syntax $$\hat{y}=\underset{(se)}{\beta1}$$.

Upvotes: 0

Philip Leifeld
Philip Leifeld

Reputation: 2323

If you don't mind having row labels, the texreg package can offer a solution:

# your original code:
est <- matrix(1:10, nrow = 2)
colnames(est) <- c("a", "b", "c", "d", "e")
se <- matrix(seq(0.1, 1, by = 0.1), nrow = 2)
colnames(se) <- c("a", "b", "c", "d", "e")

# add row labels:
rownames(est) <- c("row 1", "row 2")
rownames(se) <- c("row 1", "row 2")

library("texreg")

# create a texreg object:
tr <- list()
for (j in 1:ncol(est)) {
  tr[[j]] <- createTexreg(
      coef.names = rownames(est), 
      coef = est[, j], 
      se = se[, j]
  )
}

# for text output:
screenreg(tr, custom.model.names = colnames(est), 
    custom.note = "")

# for LaTeX output:
texreg(tr, custom.model.names = colnames(est), 
    custom.note = "")

# for HTML output:
htmlreg(tr, custom.model.names = colnames(est), 
    custom.note = "")

For example, the text output would look like this:

=============================================
       a       b       c       d       e     
---------------------------------------------
row 1   1.00    3.00    5.00    7.00    9.00 
       (0.10)  (0.30)  (0.50)  (0.70)  (0.90)
row 2   2.00    4.00    6.00    8.00   10.00 
       (0.20)  (0.40)  (0.60)  (0.80)  (1.00)
=============================================

You can as well omit the top, bottom and mid rules by specifying additional arguments to the screenreg function (inner.rule = "" and outer.rule = "").

Note that you should have texreg (>= 1.29.7) installed.

Upvotes: 3

Wojciech Sobala
Wojciech Sobala

Reputation: 7561

Two steps:

Create matrix with data in table

M <- matrix(as.vector(rbind(as.character(est),
                            paste("(",as.vector(se),")", sep="")
                            )
             ), nrow=4)
colnames(M) <- colnames(est)

Write matrix as latex or html table:

library(xtable)
print(xtable(M),type="latex") # or type="html" 

Upvotes: 2

Vincent
Vincent

Reputation: 17853

See if the apsrtable package works for you. Depending on the kind of model object you have, this may be the solution. The package is quite easily extendable to other models too.

----------------- UPDATE

Why don't you just use a simple for loop and some paste commands? Probably easier to do something slightly hack-ish like this than to find a general solution.

est<-matrix(1:10,nrow=2)
colnames(est)<-c("a","b","c","d","e")

se<-matrix(seq(0.1,1,by=0.1),nrow=2)
colnames(se)<-c("a","b","c","d","e")

se <- apply(se, 2, function(i) paste('(', i, ')', sep=''))

output <- NULL
for (i in 1:nrow(est)){
  output <- rbind(output, est[i,])
  output <- rbind(output, se[i,])
}
output <- apply(output, 1, paste, collapse=' & ')
output <- paste(output, '\\\\')
cat(output, sep='\n')

Upvotes: 1

Related Questions