目的 lm 関数が返すオブジェクトを LaTeX ソースとして出力する。 使用法 xtable.lm(ans1, caption="caption", label="label", vif=FALSE, align="lrrrrrr", digits=rep(3, 6), footnote=rep(TRUE, 4), rev=-1.5, booktabs=FALSE, type=c("latex", "html")) 引数 obj lm が返すオブジェクト caption="caption" キャプション label="label" ラベル vif=FALSE FALSE(デフォルト)の場合にはトレランス,TRUE の場合には VIF(Variance Infrated Factor) を出力する align="lrrrrrr" 各フィールドにおける要素の配置(l,c,r)をひとつの文字列で表す digits=rep(3, 6) 小数点以下の桁数 footnote=rep(TRUE, 4) 表注として4つの要素を出力するかどうかを表す,4要素を持つ論理値ベクトル rev=-1.5 行間を詰めるための,逆改行の大きさをミリ単位で指定(逆改行しない場合には 0 を指定する) booktabs=FALSE TRUE なら \hline の代わりに \toprule, \midrule, \bottomrule を使う type デフォルトは latex。html ソースを出力する場合には html を指定する ソース インストールは,以下の 1 行をコピーし,R コンソールにペーストする source("http://aoki2.si.gunma-u.ac.jp/R/src/xtable-lm.R", encoding="euc-jp") xtable.lm <- function(obj, caption="caption", label="label", vif=FALSE, align="lrrrrrr", digits=rep(3, 6), footnote=rep(TRUE, 4), rev=-1.5, booktabs=FALSE, type=c("latex", "html"), suf=FALSE) { # lm 関数が返すオブジェクトを LaTeX または html ソースとして出力する conv <- function(s) { # 添字を数式モードで if (suf) paste0("$", sub("([0-9]+$)", "_{\\1}", s), "$") else s } ans2 <- summary(obj) ans <- data.frame(ans2$coefficients) df <- obj$model d <- model.matrix(obj$terms, eval(obj$model, parent.frame())) ans$std.est <- c(NA, obj$coefficients[-1] * apply(d[, -1, drop=FALSE], 2, sd) / sd(obj$model[, 1])) ans$append <- c(NA, diag(solve(cor(d[,-1, drop=FALSE])))) name.append <- "VIF" if (!vif) { ans$append <- 1/ans$append name.append <- "トレランス" } if (booktabs) { TOPRULE <- "toprule" MIDRULE <- "midrule" BOTTOMRULE <- "bottomrule" } else { TOPRULE <- MIDRULE <- BOTTOMRULE <- "hline" } ans <- rbind(ans[-1,], ans[1,]) rownames(ans)[nrow(ans)] <- "定数項" colnames(ans) <- c("偏回帰係数", "標準誤差", "$t$値", "$P$値", "標準化偏回帰係数", name.append) n <- nrow(ans) f <- ans2$fstatistic[1] df1 <- ans2$fstatistic[2] df2 <- ans2$fstatistic[3] p <- pf(f, df1, df2, lower.tail=FALSE) if (p < 0.001) { p <- " < 0.001" } else { p <- sprintf(" = %.3f", p) } if (match.arg(type) == "latex") { cat(sprintf('\\begin{table}[htbp]\n\\caption{%s}\n\\label{%s}\n\\centering\n\\begin{tabular}{%s} \\%s\n', caption, label, align, TOPRULE)) cat(paste(c("", colnames(ans)), collapse=" & ")) cat(sprintf("\\\\ \\%s \n", MIDRULE)) for (i in 1:n) { cat(conv(rownames(ans)[i])) for (j in 1:6) { if (is.na(ans[i,j])) { cat(" & ") } else if (j == 4 && ans[i,j] < 0.001) { cat(" & $< 0.001$") } else { format <- sprintf(" & $%%.%if$", digits[j]) cat(sprintf(format, ans[i,j])) } } cat("\\\\") if (i < n-1) cat(sprintf("[%smm]", rev)) if (i == n-1) cat(sprintf("\\%s\n", MIDRULE)) cat("\n") } cat(sprintf("\\%s\n", BOTTOMRULE)) if (footnote[1]) { cat(sprintf("&\\multicolumn{6}{l}{重相関係数 $R = %.3f$}\\\\[%smm]\n", sqrt(ans2$r.squared), rev)) } if (footnote[2]) { cat(sprintf("&\\multicolumn{6}{l}{重相関係数の二乗(決定係数)$R^2 = %.3f$}\\\\[%smm]\n", ans2$r.squared, rev)) } if (footnote[3]) { cat(sprintf("&\\multicolumn{6}{l}{自由度調整済み重相関係数の二乗 $= %.3f$}\\\\[%smm]\n", ans2$adj.r.squared, rev)) } if (footnote[4]) { cat(sprintf("&\\multicolumn{6}{l}{回帰の分散分析:$F値(%i, %i) = %.3f$,$P 値%s$}\\\\[%smm]\n", df1, df2, f, p, rev)) } cat(" \\end{tabular}\\end{table}\n") } else { align <- unlist(strsplit(align, ""))[-1] align <- sub("r", "right", align) align <- sub("l", "left", align) align <- sub("c", "center", align) colnames(ans) <- c("偏回帰係数", "標準誤差", "\\(t\\) 値", "\\(P\\) 値", "標準化偏回帰係数", name.append) cat("<TABLE border=1>\n") cat(sprintf("<CAPTION ALIGN='top'> %s </CAPTION>\n", caption)) cat(paste(c("<TR> <TH> ", colnames(ans)), collapse=" </TH> <TH> ")) cat(" </TH> </TR>\n") for (i in 1:n) { cat(" <TR> <TD>", rownames(ans)[i]) for (j in 1:6) { if (is.na(ans[i,j])) { cat(sprintf(" </TD> <TD align='%s'> ", align[j])) } else if (j == 4 && ans[i,j] < 0.001) { cat(sprintf(" </TD> <TD align='%s'> < 0.001 ", align[j])) } else { format <- sprintf(" </TD> <TD align='%s'> %%.%if", align[j], digits[j]) cat(sprintf(format, ans[i,j])) } } cat(" </TD> </TR>\n") } if (footnote[1]) { cat(sprintf("<TR> <TD colspan=7> 重相関係数 \\(R\\) = %.3f </TD> </TR>\n", sqrt(ans2$r.squared), rev)) } if (footnote[2]) { cat(sprintf("<TR> <TD colspan=7> 重相関係数の二乗(決定係数)\\(R^2\\) = %.3f </TD> </TR>\n", ans2$r.squared, rev)) } if (footnote[3]) { cat(sprintf("<TR> <TD colspan=7> 自由度調整済み重相関係数の二乗 = %.3f </TD> </TR>\n", ans2$adj.r.squared, rev)) } if (footnote[4]) { if (p == " < 0.001") { p <- " < 0.001" } cat(sprintf("<TR> <TD colspan=7> 回帰の分散分析:\\(F\\)値(%i, %i) = %.3f,\\(P\\) 値%s </TD> </TR>\n", df1, df2, f, p)) } cat(" </TABLE>\n") } } 使用例 ans <- lm(Petal.Width ~ Sepal.Length + Sepal.Width + Petal.Length , data=iris) librqry(xtable) # 関数名として xtable.lm を使うなら不要 xtable(ans, vif=TRUE, footnote=c(FALSE, TRUE, FALSE, TRUE)) LaTeX でタイプセットすると以下のようになる。xtable ライブラリ中にも xtable.lm がある。そちらを使うときには library(xtable) xtable:::xtable.lm(ans)