1. Rによる二次的データの分析

1.1 はじめに

Rの使い方をまとめてみようと思う。Rの使い方についてはおよそ6カ月間毎日取り組んだので、自分が使う可能性がある手法についてはだいたいマスターすることができたはずである。理解したことをまとめてみて検討してみようと思う。Rと統計学に関する知識を整理してみる。

また、このファイル(Rmd形式)を編集することで、RStudioが原稿などを書くのに使えるかどうかを確認してみたい。グラフや表のある原稿はRStudioが便利のようである。

(html_notebookを使って見たのだが使い方がややこしいので、元のhtml_documentに戻した。)
(次の行は空けておかないと##が有効にならない。空白行は改行と同じ効果。改行は半角スペース2個でも可能。)

1.2 long formatの活用

long formatは、縦持ち形式とか縦長形式とか訳される。これについて最初に検討してみよう。 いままで使ってきて、視覚的にとらえやすいのは変数列が横長に広がるwide format1であるが、long formatの方が便利な面があるということなので試している。wide formatlong formatに変換する関数について確認してみる(gatherとpivot_longer)。(注は、ドキュメントの最後に表示される。)

ここで、 RStudioで文章を書いたり数式を示したりする場合の約束事について確認してみる。 まず、数式で使う記号の確認。**が^として使える。Rでの実行結果で確認できるように、2の3乗は次のどちらでもよい。(この部分は、実際には次のように入力している。)

\*\*が^として使える。**2の3乗**は次のどちらでもよい。

> 2**3
[1] 8
> 2^3
[1] 8

字体について。 2つのアスタリスク(*)で囲むとボールドになる。ひとつのアスタリスクで囲むとイタリック

記号**を使うとボールド体の指定のはじまりと解釈されてしまうばあいがある(後から**が出てくる場合)。それを避けるためにはその前に記号\を前に1つ入れるとよい。(この文の実際の入力は以下のとおり。)

記号\*\*を使うとボールド体の指定のはじまりと解釈されてしまうばあいがある(後から\*\*が出てくる場合)。それを避けるためにはその前に記号\\を前に*1つ*入れるとよい。

「`」の使い方。この記号で囲むと囲まれた部分をコマンドなどとして表記できる。複数行にわたるものの場合は、最初と最後に、この記号を3個並べた「```」を使う。

1.3 gather関数の使い方

wide formatlong formatに変換するこの関数は、次のような使い方をする。

  1. gather(df,"key","value",-x)
  2. gather(df,"key","value",y1,y2,y3)
gather(
  data,
  key = "key",
  value = "value",
  ...,
  na.rm = FALSE,
  convert = FALSE,
  factor_key = FALSE
)

gather関数を使うとwide formatをlong formatに変換することができる。これはtydyrパッケージに含まれている。 (1)の”key”と”value”のところは、別の名前をつけてよい。新変数であり、日本語を使ってもよい。新変数は引用符で囲むことが推奨されている。

(1)の場合、yがこの形式では、設定されていない。マイナス記号を付けた変数は、インデックス変数として扱われ、それ以外が新変数の”key”と”value”を使って集められる。

(2)の場合、y1,y2,y3以外は、インデックス変数として扱われる。 y1,y2,y3をy1:y3と表現できる。どちらで表記してもよい。ここに出てこない変数(ここではx)はインデックス変数として扱われる。

想定されているのは以下のようなデータフレーム(オブジェクト名:df)である。これはx,y1,y2,y3の3変数からなるデータフレームである。

library(tidyr)
library(ggplot2)

x <- 1:10
y1 <- x**1.5
y2 <- x**2
y3 <- x**2.5
df <- data.frame(x,y1,y2,y3)
knitr::kable(df)
x y1 y2 y3
1 1.000000 1 1.000000
2 2.828427 4 5.656854
3 5.196152 9 15.588457
4 8.000000 16 32.000000
5 11.180340 25 55.901699
6 14.696938 36 88.181631
7 18.520259 49 129.641814
8 22.627417 64 181.019336
9 27.000000 81 243.000000
10 31.622777 100 316.227766

gather関数を使い横長のdfを縦長のdf_longに変えるには以下のようにする。変換されたデータフレームはdf_longという名前にしている。長くなるので、13行目まで表示する。

df_long <- gather(df,"key","value",-x)
knitr::kable(df_long[1:13,])
x key value
1 y1 1.000000
2 y1 2.828427
3 y1 5.196152
4 y1 8.000000
5 y1 11.180340
6 y1 14.696938
7 y1 18.520259
8 y1 22.627417
9 y1 27.000000
10 y1 31.622777
1 y2 1.000000
2 y2 4.000000
3 y2 9.000000

あるいは、2番目の形式で以下のようにしても同じ結果である。

df_long <- gather(df,"key","value",y1,y2,y3)
#knitr::kable(df_long[1:13,])

調べてみてわかったことだが、 gather関数はすでに開発終了(retired lifecyle)で、以下のように、pivot-longerに移行することが推奨されている。

Gather columns into key-value pairs
Description
Retired lifecycle
Development on gather() is complete, and for new code we recommend switching to pivot_longer(), which is easier to use, more featureful, and still under active development. df %>% gather("key", "value", x, y, z) is equivalent to df %>% pivot_longer(c(x, y, z), names_to = "key", values_to = "value")

See more details in vignette("pivot").

Usage
gather(
  data,
  key = "key",
  value = "value",
  ...,
  na.rm = FALSE,
  convert = FALSE,
  factor_key = FALSE
)

次のような式が推奨されている。これに従って書き換えてみると同じようなが得られる(並べ方には違いがある)。gather関数の場合と同様に、“key”と”value”のところは変更可能であり、日本語で”凡例”,“値”などとしてもよい。(keyのところは凡例にすれば凡例が凡例と表示されるので便利であるが、複数の変数をまとめる新変数に「凡例」という名前が付くのは感覚的には受け入れにくいことである。その意味ではあとで、labsのなかで指定する方がよいかもしれない。)

df %>% pivot_longer(c(x, y, z), names_to = "key", values_to = "value")
library(tidyr)

df_long <-df %>%
  pivot_longer(c(y1, y2, y3), names_to = "key", values_to = "value")

df_long
## # A tibble: 30 × 3
##        x key   value
##    <int> <chr> <dbl>
##  1     1 y1     1   
##  2     1 y2     1   
##  3     1 y3     1   
##  4     2 y1     2.83
##  5     2 y2     4   
##  6     2 y3     5.66
##  7     3 y1     5.20
##  8     3 y2     9   
##  9     3 y3    15.6 
## 10     4 y1     8   
## # ℹ 20 more rows

pivot_longerを使った場合には、xを軸にしてy1,y2,y3の値が示されている。

データを用いてグラフを描く場合、 wide formatの新変数名に対応してggplot2でのaesの設定を変える。 図1では、ggplot2のaesでx=x,y=value,col=keyと設定している。 x軸、y軸、凡例のタイトルについてlabsの中で設定してはいない。 図2では、凡例及びという変数をpivot_longer関数の中で設定し、それらを使ってggplot2のaesの中でx=x,y=値,col=凡例と指定している。y軸のラベル、凡例のタイトルにそれらが自動的に反映している。

library(patchwork)

p1 <- ggplot(df_long,aes(x=x,y=value,col=key))+
  geom_line()+
labs(title="図1",subtitle = "aes(x=x,y=value,col=key)")+
theme_minimal(base_family="HiraKakuProN-W3")


df_long <-df %>%
  pivot_longer(c(y1, y2, y3), names_to = "凡例", values_to = "値")

p2 <- ggplot(df_long,aes(x=x,y=値,col=凡例))+
  geom_line()+
labs(title="図2",subtitle = "aes(x=x,y=値,col=凡例)")+
theme_minimal(base_family="HiraKakuProN-W3")
df_long <- gather(df,"凡例","y",y1:y3)

p3 <- ggplot(df_long,aes(x,y,linetype=凡例))+
  geom_line()+
labs(title="図3",subtitle = "aes(x,y,linetype=凡例)")+
theme_minimal(base_family="HiraKakuProN-W3")

p4 <- ggplot(df_long,aes(x,y,linetype=凡例))+
  geom_line(col="blue")+
labs(title="図4",subtitle = "aes(x,y,linetype=凡例)")+
theme_minimal(base_family="HiraKakuProN-W3")