ill-identified diary

所属組織の見解などとは一切関係なく小難しい話しかしません

[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")

参考文献

[R] [Twitter] streamR パッケージで Twitter Streaming API にアクセスしてみた

R でツイッターから情報を取得するパッケージは twitteR が有名だが*1, R で Streaming API へアクセスできる streamRパッケージを紹介してみたい.

streamR の概要

CRAN - Package streamR によると作者は NYU の Ph.D. candidate (現在) の Pablo Barberá という方で

Description This package provides a series of functions that allow R users to access Twitter’s filter, sample, and user streams, and to parse the output into data frames. OAuth authentication is supported.

Date/Publication 2013-01-19 08:27:32

とのこと. streaming API ということなので, twitteR と比較し,

  • 長所
    • 大量のツイートを取得できる
    • twitteR の status オブジェクトより情報量が多い.
  • 短所
    • 現在進行形で投稿されてるツイートしか取得できない (遡ることができない)
      • そのためニッチな条件にすると全くヒットしないということもありうる.
    • 接続中は処理待ちなので暇.

という特徴がある. streaming API のパラメータ詳細については公式リファレンス を参照. status オブジェクトより多様な情報が取得できるといっても, それらは twitteR でも取得できないことはないので, 最新のツイートを取得したい時と過去のツイートを遡りたいときとで使い分ける, 程度の活用法しか自分は思いつかなかった. R-bloggers には一つだけ記事が存在するが, ぶっちゃけ twitteR でもできるような……

とりあえず使い方を紹介しておく. と言っても関数は少ししか無いが.

使用法の紹介

まずは使用可能な状態する. 下準備として認証が必要. streaming API を用いるには認証アカウントが必要で, API にアクセスする関数はその都度入力する必要がある. user password に直接入力してもよいが, 作者はセキュリティ上の観点から oauth を推奨している. oauth 認証には R言語でTwitterを操作する を参考に OAuth オブジェクトを作成すること. この OAuth オブジェクトは twitteR でも使いまわせるので保存しておくといい. 下記のコードでは, twit.oauth.RData に保存しておいたオブジェクトを使っているのでそこは適宜変更.

注意事項として, RStudio の不具合で handshake ができない ことが挙げられる. ので, 普段 RStudio を使用している人は R を直接起動して認証操作を行なったほうが良い.

2015/1/31 追記 RStudio ver 0.98 でもPINコードを入力できることを確認しましたので RStudio だけで全作業を行えます.

# rjson, RCurl が必要
library(streamR)
# Oauth オブジェクトには ROAuth パッケージが必要
load(file="twit.oauth.RData")

filterStream 関数

おそらく一番用途がありそうなのがこの filterStream. public stream にアクセスし, 条件にマッチするツイートを取得する. 出力は json 形式.

  • file 引数は json ファイルの保存先. 空白にするとコンソールに出力する.
  • timeout は接続時間. 単位は秒. デフォルトでは10800秒 (3時間)! なのでとりあえず20秒くらいにした.
  • track 引数はキーワードでマッチさせる. "hoge foo" とすると "hoge" AND "foo" に, "hoge, foo" だと "hoge" OR "foo" という条件になる.
  • locations 引数は所在地でマッチさせる. これにはクセがあり, 南西端の経緯度と北東端の経緯度のベクトルを与えることで, その矩形の範囲に所在するユーザーをマッチさせる. マニュアルの用例を引用するなら, locations=c(-74,40,-73,41)ニューヨーク市内になる. 矩形の西端の経緯度, 矩形の東端の経緯度 というように南が先に来る点に注意*2.
  • user password 引数は認証のためのものだが, 先ほどの理由で省略.
  • oauth 引数に OAuth オブジェクトを与えることで代わりとする.

例1: 東京周辺に所在しているユーザーのツイートを取得.

cache.1 <- filterStream( file="", locations=c(139.45, 35.60, 139.8, 37.9), timeout=20, oauth=twit.oauth)

結果

Capturing tweets...
Connection to Twitter stream was closed after 21 seconds with up to 20 tweets downloaded.

例2: "Ukraine" とかにしようと思ったが, 永井一郎氏の訃報を耳にしたので…

cache.2 <- filterStream(file="", track="永井一郎", timeout=20, oauth=twit.oauth)

結果:

Capturing tweets...
Connection to Twitter stream was closed after 21 seconds with up to 1 tweets downloaded.

1ツイートしかヒットしなかったのでやり直し. このように, リアルタイムのツイートしか取得しないため, ホットな話題でも時間が短いとほとんど取得できない点に注意.

例2-take 2: 例2の取得時間を5分に伸ばす.

cache.2 <- filterStream(file="", track="永井一郎", timeout=300, oauth=twit.oauth)

結果

Capturing tweets...
Connection to Twitter stream was closed after 301 seconds with up to 13 tweets downloaded.

使い方としては, 1時間くらい取得するRスクリプトを作って, ターミナルで繰り返し実行するように流しておくことだろうか. ツイートを取得するだけなので大して負荷はかからないから, 他の作業も並行できる.

parseTweets 関数

json 形式のままでは R で処理するのは難しいが, この parseTweets 関数は streamR の各関数で取得した json 式テキストデータをデータフレーム型に変換できる. 先ほどの json 形式 (R 上では character 型オブジェクト) を代入するだけでいい.

cache.1.df <- parseTweets(cache.1)
cache.2.df <- parseTweets(cache.2)
# 取得したツイート本文をいくつか表示
head(cache.df$text)

その他

  • sampleStream は public stream 全体からランダムに抽出する. track, locations 等の引数は使えない.
  • userStream は自分の user stream を追う. track, locations 等が使える他, with 引数に "followings" を与えると followee のツイートも含める.

参照

*1:TwitteR の使用法については『RではじめるTwitter解析』や『twitteRで「カモノハシペリー」のTweet情報を集めてみよう』等が良い資料と思われる

*2:第3回Twitter API勉強会 - ストリーミングAPI SlideShare の説明が図入りでわかりやすいか.