データ分析メモと北欧生活

旧Untitled Note. データ分析、計量経済・統計とR、水産管理、英語勉強、海外生活などについて備忘録や自分の勉強のOutputの場所として

MENU

Stargazerの回帰分析表の備考欄を左に寄せたい

ちょっとつまづいたので備忘録。

状況

Rmarkdownで論文書いてて、なにかしらの回帰分析の結果を表にまとめてPDF出力したい。
いつも使っているのはStargazerというパッケージです。R側からの設定がいろいろできるので楽。

Stargazerでできる設定についてはこちらが詳しい(英語サイト)。

www.jakeruss.com

回帰分析表には、テーブルの真下に備考というかノートを書く事が多い。
これ、なぜかデフォルトが右寄りなんです。これを左に寄せたい。

問題

左に寄せようと思って、stargazer関数の引数のうち、notes.alignというのを"l"にセットしたが、なぜか中途半端な位置で止まってしまう。しかも長文を書くと折り返さずに右に出ていってしまう。

f:id:keita43a:20191130004942p:plain

この表を出力したコードは以下。

# test data
x = rnorm(100,0,1)
z = rnorm(100,0,1)
y = x*2 + rnorm(100,0,1)

# test regression
reg = lm(y~x)
reg2 = lm(y~z)

# table 
tab1 <- stargazer(reg,reg2,
                  type = "latex",
          header = FALSE,
          notes.align = "l",notes.append = FALSE,
          notes = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eget tortor justo. Praesent tristique semper accumsan. Etiam egestas, libero quis tincidunt dignissim, nisi sem imperdiet ante, in aliquet libero ex.")

解決策

いつものStackOverflowにて解決策を発見。ただ、RmarkdownでPDF作るときには少しだけ注意が必要。

stackoverflow.com

ようは、Stargazerlatexとして表を出力した後に、Notesの部分だけ手でコードを書いている。

# correcting latex notes
note.tab1 <- "\\multicolumn{3}{l} {\\parbox[t]{11cm}{ \\textit{Notes:} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eget tortor justo. Praesent tristique semper accumsan. Etiam egestas, libero quis tincidunt dignissim, nisi sem imperdiet ante, in aliquet libero ex.}} \\\\"

tab1[grepl("Note",tab1)] <- note.tab1

このmulticolumn{3}の数字は、モデルの数+1にしないとエラーが出る。この例ではモデルはregとreg2の2つなので、3にしている。

あと、ここで大事なのは一旦Stargazerのオブジェクトをnote.tab1にあずけてしまうと、そのままだと文字列ベクターとして扱われてしまうので直接出力できなくなる。文字列をそのまま出力するためにcatを使う。

cat(tab1, sep = "\n")


これで出力できる。
ちゃんとノートが左に寄っているし、適切に折り返されている。

f:id:keita43a:20191130005421p:plain


コード

参考にコード全体を置いておきます。
Rmarkdownで実行可。
Stargazerlatexコードを出力するときは、チャンクの設定をresults = 'asis'にするのを忘れずに。

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)

library(stargazer)

```

```{r, include = FALSE}

# test data
x = rnorm(100,0,1)
z = rnorm(100,0,1)
y = x*2 + rnorm(100,0,1)

# test regression
reg = lm(y~x)
reg2 = lm(y~z)

# table 
tab1 <- stargazer(reg,reg2,
                  type = "latex",
          header = FALSE,
          notes.align = "l",notes.append = FALSE,
          notes = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eget tortor justo. Praesent tristique semper accumsan. Etiam egestas, libero quis tincidunt dignissim, nisi sem imperdiet ante, in aliquet libero ex.")

# "bad" example
tab2 = tab1

# correcting latex notes
note.tab1 <- "\\multicolumn{3}{l} {\\parbox[t]{11cm}{ \\textit{Notes:} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eget tortor justo. Praesent tristique semper accumsan. Etiam egestas, libero quis tincidunt dignissim, nisi sem imperdiet ante, in aliquet libero ex.}} \\\\"

tab1[grepl("Note",tab1)] <- note.tab1


```

```{r tab2, results='asis'}
# bad example
cat(tab2,sep = "\n")
```

```{r tab1, results='asis'}
# good example 
cat(tab1,sep = "\n")
```