[R] [LaTeX] Rでの分析結果をLaTeXに出力するパッケージの比較 (前編)

2014/01/28加筆修正

途中で疲れたので記述統計のみです.

要約

  • 手っ取り早く体裁の整った記述統計を出力したい場合は stargazer
  • ある程度自由の効き, かつ手軽なのは describe+xtable
  • 細かい体裁に拘りたい場合は describe+latex

latex 形式への出力

というわけで早速コードを. 下準備として, ライブラリとデータを読み込み.

library(psych) 
library(xtable)
library(Hmisc) 
library(stargazer)
# 伝統の iris データセット
data(iris)

psych::describe 関数で記述統計表を作成

記述統計を計算する基本関数だと summary があるが, 平均, 最大・最小値, クオンタイルと出力が微妙なので, 標準偏差やサンプルサイズ等もまとめて出力してくれる psych::describe で 記述統計表を作成. (Hmisc パッケージにも describe があるが, こっちは見づらい)

  • skew 尖度および歪度を計算するかどうか
  • ranges min,max, range を計算するかどうか
  • factor 型の変数は numeric に強制変換され, 名前に*が付く
(descriptive.tab <- psych::describe(iris, skew=F,ranges=F) )
descriptive.tab$var <- NULL; descriptive.tab$range <- NULL; descriptive.tab$mad <- NULL
descriptive.tab$se <- NULL; descriptive.tab$trimmed <- NULL; descriptive.tab$median <- NULL

xtable 関数

xtable 関数 はシンプルだが細かい設定項目がないので凝った作りにはできない. よって出力してからテキストエディタで修正することもある.

  • align=character で \begin{tabular}{hogehoge} の hogehoge 箇所を指定. "l", "c", "r" ほか適当な文字を使用可能. 適当なところに | を入れることで縦罫線も使用可能. 列の数とベクトルの要素数があわないとエラー .
  • digits=numeric で各列の有効数字 (表示する桁数). 変数名の列はなんでもいい?
  • display=character で各列の表示形式.
    • "s" 文字. 左端の変数名の列に用いる
    • "d" 整数. サンプルサイズの列はこれを用いたほうが良い
    • "f", "g", "G", "fg" 小数. "f" は小数点を揃えて表示. 例: digits=3 なら 2 が 2.000 と表示される.
    • "e", "E"指数表記
  • booktabs パッケージには対応していない?
  • xtable 関数には LaTeX コードを外部ファイルに保存する機能はない. そのため print 関数で別途保存する必要.
( xtable.descript <- xtable(descriptive.tab,caption="xtableによる記述統計表", label="descriptive.xtable", align=c("l",rep("r",5) ), 
       digits=c(0,0,3,3,3,3), display=c("s","d",rep("f",4) ) ) )
print(xtable.descript, file="xtable.descript.tex")

print()type="html" という引数をつければ html 形式としてエクスポートされる.

print(xtable.descript, type="html", file="xtable.descript.html")

latex 関数

出力形式の設定項目が豊富

  • file 引数に出力結果の保存先を指定. 空白にした場合, コンソールに直接出力. デフォルトは title.tex
  • ただし title 引数は表の左上に出力する文字列を与える引数なので, title 引数には空白を指定したほうが吉 (title 引数は tex 上で \capition{title} として表示されるわけではない点に注意)
  • caption は表の上側に表示するキャプション.
  • caption.loc="bottom" とすれば下側に.
  • append 既存のファイルの末尾に追加するか, 上書きするか. デフォは FALSE.
  • dcolumn=T とすると dcolumn が使える. ただし, 列ごと・行ごとに設定することは出来ない. そのため, 今回は使わない.
  • 有効桁数の設定は digits, rdec, cdec の3つの引数が使用可能. digits は表全体で一括設定. rdec, cdec はそれぞれ行・列ごとに設定.
  • col.just は各行のアラインを設定. デフォルトでは character 型の列が "l", 数値が "r" となる.
  • ここまでは xtable 関数とほぼ同じだが, 他にも, 体裁を整える上で以下のような便利と思われる引数がある.
    • here=T で フロートさせない (\begin{table}[H] にする )
    • center はセンタリングの設定. latex 関数はデフォルトで表を center 環境で囲っている. center="none" とするとセンタリングしない. "centering" とすると center 環境の代わりに \centering を使用する.
    • booktabs=T とすると罫線として \hline の代わりに \toprule, \midrule, \bottomrule を使う. その場合上端の罫は \hline\hline のように二重線にはならない. (TeX 側が処理するために booktabs.sty パッケージが必要)
    • math.row.names および math.col.names は行あるいはヘッダを数式環境で囲むかどうかを指定する.
    • greek=T とすると特定の文字列をギリシャ文字に変換する (よくわからない)
latex(object=as.data.frame(descriptive.tab), title="", caption="latex による記述統計表", caption.loc="bottom", label="descriptive.hmisc", file="",
      here=T, cdec=c(0,3,3,3,3), col.just=c("r",rep("D{.}{.}{-1}",4) ), booktabs=T)

col.just の "D{.}{.}{-1}" は別途定義してあるなら "." としてもよい. ただ, この方法だと小数点のある列の数値の位置がずれる ($$ が二重になるから). よって, dcolumn の列とそうでない列を混在させるには, format.df 関数で整形してから latex 関数に放り込むことになる. 今回 format.df で用いる引数は先の例と同じなので説明省略.

descriptive.tab2 <- format.df(x=descriptive.tab, cdec=c(0,3,3,3,3), numeric.dollar=F)
descriptive.tab2[,"n"] <- paste("$",descriptive.tab2[,"n"], "$", sep="")
latex(object=descriptive.tab2, title="", caption="latex による記述統計表", caption.loc="bottom", label="descriptive.hmisc", file="latex.descript.tex",
      here=T, col.just=c("r",rep("D{.}{.}{-1}",4) ), booktabs=T)

なぜ dcolumn と数式環境にこだわったかというと, フォントの設定によってはフォントがバラバラに見えるから. dcolumn を適用した列は, 自動的に数式環境として扱われるため, 整数の列だけ異なるフォントになり, 見た目がよくない. 例えば beamer は基本的にサンセリフフォントだが, 数式が見づらいといって数式だけフォントを変更していると, サンプルサイズの列だけ数値がサンセリフで残りは roman や palatino になって非常に見栄えが悪い.

これ以外にも引数は大量にあるのでヘルプ参照.

stargazer 関数

  • 記述統計の場合はデータセットを直接代入すると計算してくれる.
  • out は出力を保存するパス.
  • title には \caption{} の中身を与える.
  • align は dcolumn を用いて数値の位置を調整するかどうか. デフォルトは FALSE.

stargazer 関数の align も, 一括設定なので全ての列が "." で調整されてしまうようだ. latex と違い, 表のマトリクス自体も内部で作るため, 修正は少々ややこしくなる. もっとも, 記述統計では dcolumn にそこまでこだわる必要は無いかもしれない. よって, 今回は align=F とした.

  • digit.separator は数値の3桁ごとの区切り記号. デフォルトは "," だが, "" とすることで区切りをなくしたり " " でスペースにしたりできる. 使いどきはないが, これ以外でも文字列ならなんでもいいようだ.
  • digits は小数の桁数.
  • digits.extra は上記 digits で丸められた数値がゼロだったとき, 追加で表示する小数点以下の桁数の最大値. 例: digits=2 なら 0.001 は 0.00 に丸められるが, digits.extra=1 なら 0.001 と表示される.
  • float はフロートの設定. TRUE なら table 環境で囲われる.
  • float.envfloat=T にしたときの追加設定. デフォルトは "table" だが, "table*" にしたり, "sidewaystable" で横置きの表にしたりできる (要 dcolumn).
  • table.palcement でフロート環境の設定を "h", "b", "H", ... などに設定できる.
  • initial.zero は数値が例えば 0.123 となっているものを, .123 のように先頭のゼロを省いて表示するかどうか.
  • covariate.labels は説明変数の名前を character ベクトルとして与える. 名前を上書きするだけなのでデータの変数の数と一致していなくてもよい.
  • omit は表示を省略する変数名. 正規表現として評価されるので, 例えば year1990, year1991, ... と大量にコントロール変数がある場合, omit="year" と書けば全て省略される.

レイアウトに関するオプションも充実しており, STATA の esttab モジュールと似た感じである. omit正規表現で評価されるのが便利に感じる. 次のサンプルでは余計な変数を加え, 実際に omit で省略されるかも検証した.

iris2 <- iris
iris2$var1 <-1; iris2$var2 <- 2; iris2$var3 <-3;
# omit で var1 ~ var3 を省略
stargazer(iris2, out="stargazer.descript.tex", title="stargazer による記述統計表", align=F, style="qje", omit="var")

これ以外にもオプションあり.

結果一覧.

f:id:ill-identified:20140127011736p:plain

f:id:ill-identified:20140127011742p:plain

f:id:ill-identified:20140127011747p:plain

(回帰分析の結果編へ続く)

おまけ: 上記のコードのまとめ

library(psych) # 記述統計表を作成するため
library(xtable)
library(Hmisc)
library(stargazer)
library(texreg)

#記述統計表の比較

# 伝統の iris データセット
data(iris)
# psych::describe で 記述統計表を作成. (Hmisc にも describe があるが, こっちは見づらい)
# skew= 尖度および歪度を計算するかどうか
# ranges= min,max, range を計算するかどうか
(descriptive.tab <- psych::describe(iris, skew=F) )
  descriptive.tab$var <- NULL; descriptive.tab$range <- NULL; descriptive.tab$mad <- NULL
  descriptive.tab$se <- NULL; descriptive.tab$trimmed <- NULL; descriptive.tab$median <- NULL

# latex 形式での出力
# xtable の場合
# シンプルだが細かい設定項目がないので凝った作りにはできない. よってテキストエディタで修正することもある
methods(xtable) # psych, describe オブジェクトには対応していない
# align=character で \begin{tabular}{hogehoge} の箇所を指定. "l", "c", "r" ほか適当な文字を使用可能.
#   適当なところに|を入れることで縦罫線も使用可能
#   列の数とベクトルの要素数があわないとエラー 
# ただし, ヘッダのみ中央寄せにする, といった調整が出来ない.
# よって, dcolumn は使わない.
# digits=numeric で各列の有効数字 (表示する桁数). 変数名の列はなんでもいい?
# display=character で各列の表示形式.
#   "s"=文字 左端の変数名の列に用いる
#   "d"=整数 n列はこれを用いたほうが良い
#   "f", "g", "G", "fg"=小数. "f" はxxx.xxxのように桁数を揃える.
#   "e", "E"=指数表記 
# booktabs パッケージには対応していない?
( xtable.descript <- xtable(descriptive.tab,caption="xtableによる記述統計表", label="descriptive.xtable", align=c("l",rep("r",5) ), 
       digits=c(0,0,3,3,3,3), display=c("s","d",rep("f",4) ) ) )
# xtable には LaTeXコードを外部ファイルに保存する機能はない. そのため別途保存する必要.
print(xtable.descript, file="xtable.descript.tex")
# print() に type="html" という引数をつければ html 形式としてエクスポートされる.
#print(xtable.descript, type="html", file="xtable.descript.html")

# Hmisc::latex の場合
# 出力形式の設定項目が豊富
# latex では data.frame に変換する必要があるが, その場合丸めた桁もそのままになり, 見づらい
# latex はその場でタイプセットしてくれる
# file引数のデフォルトは <title引数>.tex
# ただし title引数の値は勝手に左上に出力されるため空白を指定したほうが吉 (title引数はtex上で capition として表示されるわけではない点に注意)
# file引数に空白を指定すると保存されるコンソールに出力される
# 一方, 設定できる項目は圧倒的に多い.
# caption は表の上側に表示するキャプション.
# caption.loc="top" とすれば下側に. 
# append 既存のファイルの末尾に追加するか, 上書きするか. デフォはF
# dcolumn=T とすると dcolumn が使える.
# ただし, 列ごと・行ごとに設定することは出来ない.
# 有効桁数の設定は digits, rdec, cdec の3つの引数が使用可能. 
# digits は表全体で一括設定. rdec, cdec はそれぞれ行・列ごとに設定.
# col.just は各行のアラインを設定. デフォルトでは character の列が "l", 数値が "r" となる.
# ここまでは xtable とほぼ同じだが, 他にも, 体裁を整える上で以下のような便利と思われる引数がある.

# here=T で フロートさせない (\begin{table}[H] にする )
# center latex 関数だとデフォルトで表を center 環境で囲っている. center="none" とするとセンタリングしない.
# booktabs=T とすると \hline の代わりに \toprule, \midrule, \bottomrule を使う. 
#その場合上端の \hline \hline のように二重線にはならない. (要 booktabs パッケージ)
# math.row.names および math.col.names は行あるいはヘッダを数式環境で囲むかどうかを指定する.
# greek=T とすると特定の文字列をギリシャ文字に変換する (よくわからない)
latex(object=as.data.frame(descriptive.tab), title="", caption="latex による記述統計表", caption.loc="bottom", label="descriptive.hmisc", file="",
      here=T, cdec=c(0,3,3,3,3), col.just=c("r",rep("D{.}{.}{-1}",4) ), booktabs=T)
# col.just の D{.}{.}{-1}" は別途定義してあるなら "." としてもよい.
# ただ, この方法だと小数点のある列の数値の位置がずれる ($$ が二重になるから)
# よって, dcolumn の列とそうでない列を混在させるには, format.df 関数で整形してから latex 関数に放り込むことになる.
# 今回 format.df で用いる引数は先の例と同じなので説明省略
descriptive.tab2 <- format.df(x=descriptive.tab, cdec=c(0,3,3,3,3), numeric.dollar=F)
descriptive.tab2[,"n"] <- paste("$",descriptive.tab2[,"n"], "$", sep="")
latex(object=descriptive.tab2, title="", caption="latex による記述統計表", caption.loc="bottom", label="descriptive.hmisc", file="latex.descript.tex",
      here=T, col.just=c("r",rep("D{.}{.}{-1}",4) ), booktabs=T)

# これ以外にも引数は大量にあるのでヘルプ参照.

# stargazer
# 記述統計の場合はデータセットを直接代入すると計算してくれる.
# out は出力を保存するパス.
# title には \caption{} の中身を与える.
# align は dcolumn を用いて数値の位置を調整するかどうか.
# style は主要ジャーナルのフォーマットに合わせるかどうか. 選択肢はマニュアル参照.
# digit.separator は数値の3桁ごとの区切り記号. デフォルトは ",".
# digits は小数の桁数.
# digits.extra は digits で丸められた数値がゼロだったとき, 追加で表示する小数点以下の桁数の最大値. 
# float はフロートの設定. TRUE なら table 環境で囲われる.
# float.env は float=T にしたときの追加設定. デフォルトは "table" だが, "table*" にしたり, "sidewaystable" で横置きの表にしたりできる (要 dcolumn).
# table.palcement でフロート環境の設定を "h", "b", "H", ... などに設定できる.
# initial.zero は数値が例えば 0.123 となっているものを, .123 のように先頭のゼロを省いて表示するかどうか.
# covariate.labels は説明変数の名前を character ベクトルとして与える.
# omit は表示を省略する変数名. 正規表現として評価される
iris2 <- iris
iris2$var1 <-1; iris2$var2 <- 2; iris2$var3 <-3;
# omit で var1 ~ var3 を省略
stargazer(iris2, out="stargazer.descript.tex", title="stargazer による記述統計表", align=F, style="qje", omit="^var")

参考文献