井出草平の研究ノート

パイプ演算子[R]

Rの分析例をみていると、パイプ演算子が使われたものがあるので、自分の勉強がてら基本的な使い方をメモしておきたい。

パイプ演算子の目的

Rの標準書式は可視性がいまいちである。

x <- c(0.109, 0.359, 0.63, 0.996, 0.515, 0.142, 0.017, 0.829, 0.907)
round(exp(diff(log(x))), 1)

二行目は括弧が重なってよくわからない状態になっている。
括弧がうまく閉じていない、というのはRのコードを書いていると、よく経験する事態である。

これをパイプ演算子で表現すると、以下のようになる。

library(magrittr)
x %>% log() %>%
    diff() %>%
    exp() %>%
    round(1)

パイプ演算子を利用する利点は2点だろうか。

  1. 可視性が高まる。
  2. 計算をするときには一番中の括弧から解いていくので、計算手順と同じ手順でコードが書ける。

標準的な書き方だと中から書いて、左右に動かしながら、計算式を書いていくので、コードが合理的に書けない。
また、括弧が足りなかったり、多かったりしてエラーを吐かれることもしばしばある。
そういった問題をパイプ演算子は解決してくれるようだ。

パイプ書式

関数の基本から。

log(x) ## 標準
x %>% log() ## パイプ

オプションのつけ方。

round(pi, 6) ## 標準
pi %>% round(6) ## パイプ

babynamesデータからTaylorという名前の男性の人数を数える。

library(babynames)
library(dplyr)
data(babynames)
sum(select(filter(babynames,sex=="M",name=="Taylor"),n)) ## 標準

パイプ演算子は次のように書く。

babynames%>%filter(sex=="M",name=="Taylor")%>%  ## パイプ
            select(n)%>%
            sum

代入パイプ演算子(Assignment Pipe Operations)

パイプ演算子にはいくつか種類がある。 代入機能を持つパイプ演算子%<>%では変数加工がスマートになる。

irisデータを使って、Sepal.Lengthのデータを平方根にするというコードを書く。
<-を使うと標準書式では次のように書く。

iris$Sepal.Length <- sqrt(iris$Sepal.Length)

同じ事をパイプ書式で書くと次のようになる。

iris$Sepal.Length <- 
  iris$Sepal.Length %>%
  sqrt()

これをassign演算子%<>%で書くとスマートに書くことができる。

iris$Sepal.Length %<>% sqrt

Tee演算子(Tee Operator)

Tee演算子は右側の値ではなく左側の値を返す。

set.seed(123)
rnorm(200) %>%
matrix(ncol = 2) %T>%
plot %>% 
colSums

エクスポジション演算子(Exposition Operator)

iris %>%
  subset(Sepal.Length > mean(Sepal.Length)) %$%
  cor(Sepal.Length, Sepal.Width)

dplyrパッケージの5つのコマンド

dplyrは5つのコマンドから構成されている。

  • select...データフレームから指定した列のみ抽出する
  • filter...行の絞り込み
  • arrange...行を並べ替える
  • mutate...列の追加
  • summarize...集計

標準コードで書いたもの。

library(hflights)

grouped_flights <- group_by(hflights, Year, Month, DayofMonth)
flights_data <- select(grouped_flights, Year:DayofMonth, ArrDelay, DepDelay)
summarized_flights <- summarise(flights_data, 
                arr = mean(ArrDelay, na.rm = TRUE), 
                dep = mean(DepDelay, na.rm = TRUE))
final_result <- filter(summarized_flights, arr > 30 | dep > 30)

final_result

パイプ演算子で書いたもの。

hflights %>% 
    group_by(Year, Month, DayofMonth) %>% 
    select(Year:DayofMonth, ArrDelay, DepDelay) %>% 
    summarise(arr = mean(ArrDelay, na.rm = TRUE), dep = mean(DepDelay, na.rm = TRUE)) %>% 
    filter(arr > 30 | dep > 30)

違いを一言で言うならば、標準コードはオフジェクトに格納をすることが基本的な発想であるが、パイプ演算子は格納せずに主として右側にそのまま関数で変換した値を渡すという発想ということなのだろう。

RStudioのショートカット

%>%を何度も打つのはめんどくさい。 RStudioのアドインをインストールすると少しは便利になる。

https://rstudio.github.io/rstudioaddins/

コンソールから下記のコードを実行し、RStudioを再起動。

devtools::install_github("rstudio/addinexamples", type = "source")

f:id:iDES:20191226061923p:plain

メニューのAddinsにinsert %in%が追加されている。

ショートカットの振り分けはModify Keyboard Shortcutsメニューから。

f:id:iDES:20191226061936p:plain

説明ではCtrl + Alt + Shift + Kを当てるようだが、Kはなぜか反応しなかったのてpipeのPを当てておいた。

f:id:iDES:20191226061947p:plain

関数型言語

統計解析にはあまり関係がないが、Rの言語型には議論があるようだ。
Rは関数型言語のようで関数型言語ではないらしい。

kiito.hatenablog.com

統計パッケージとしてRを利用している者にとっては、さほど重要なことではないが、Rを関数型言語として成立させるものがパイプ演算子だと考えると良いらしい。

このエントリは下記のエントリを参照した。

www.datacamp.com

業者に託した息子が孤独死…母の後悔 引きこもり“引き出し屋”の実態

www.nishinippon.co.jp

業者を知ったのは2017年1月。ホームページの「必ず自立させます」という言葉にひかれ、東京都内の本部に相談に行くと、スタッフに「早い対応が必要」と促された。提示された契約金は900万円超。自宅を売る段取りをして準備した。
長男は都内の施設に入り、その後、提携する熊本県内の研修所に移った。ほどなくして、業者から「熊本で就職した」と報告を受けた。自立を妨げないようにと、女性は連絡を控えていた。
今春になって突然、業者から電話が入った。「息子さんが亡くなりました」

もちろん悪徳業者がダメなのだが、親もダメだろう。本人が哀れでならない。
「自立を妨げないようにと、女性は連絡を控えていた」と言っているが、連絡をすると自立できない、というのはおかしい。 施設にぶち込んで親子関係が悪くなって、子どもと連絡すらできない関係性になっていたのではないだろうか。

「業者が丁寧にフォローしてくれていれば、こんなことにならなかったのでは」という主張も、親がフォローしていない理由にはならないだろう。
悪徳業者が悪いといっても、親の言い分はひどいものである。

本人は、親にも施設にぶち込まれて、親に支援を申し出ることもできず、孤立無援になり、餓死したように思える。

お金はイージーに問題を解決してくれるように見えて、物事の本質は変化させない。
とにもかくにも、世の中の人は「金さえあればなくとかなる」と考えがちである。

ひきこもり状態を問題だと考えている規範の裏には「働いて金を儲けて一人前」という考えがある。
お金は万能ではない。しかし、労働賛美の思想には、お金に対する実際以上の評価が隠れている。

ひきこもりを許容できない親の価値観、お金を支払って問題を解決しようとする親の行動は同じところからきている。
お金は万能ではないし、ごはん屋さんに入ってごはんが食べられるように、金を出してもひきこもりはなおらないという、当たり前のことに気づく必要がある。
親がそれを気づくだけで、少しはひきこもりにも寛容になれるのではないだろうか。

SPSS、SAS、StataのデータをRでインポート、エクスポートをする

SPSSSAS、StataのデータをRでインポート、エクスポートをするhavenパッケージの紹介である。 havenパッケージはtidyverseを構成するパッケージの一つである。
他の統計パッケージのデータを読み込む有名なパッケージはforeignだが、RStudioブログによると以下の3点で改善があるらしい。

  1. バイナリSAS7BDATファイルを読み取ることができる。
  2. Stata13ファイルを読み取ることができる。
  3. 常にデータフレームを返す。

https://blog.rstudio.com/2015/03/04/haven-0-1-0/

僕はSASを使わないので、関係があるのは2と3である。特に3である。
foreignパッケージはデータフレームで返すようにオプションで指定しなければならない。
実際、コードを覚えているわけではないので、毎度毎度、コピペをしていて、相当不便であった。havenパッケージの方が簡単なコードで書けて、覚えきれる形式なので、ありがたい。

なお、havenパッケージは変数ラベル、値ラベルもきっちり読み書きできる。foreignパッケージも同様のことは可能なので、havenパッケージの方がこの点で優秀だとは言えないが、やはり簡便にコードが書けるのはすばらしい。

SPSSデータの読み込み

村瀬洋一さんのサイトからデータを利用させていただこう。

www.asahi-net.or.jp

村瀬さんのサイトから以下のデータを利用する。

  1. ジェンダー意識調査 分析実習用データ(SPSS形式データファイル) 06genren.sav

havenパッケージを使ってRに読み込むのは以下のように行う。

library(haven)
d1 <- read_sav("06genren.sav")

SPSSのデータはエンコード問題がある。
現在はSPSSUTF-8を推奨するメッセージを出すようになったので、UTF-8を使っている人が増えてきていると思うのだが、少し昔のファイルでは、ローカルエンコード(Shift-JIS)で作られていることが多かった。
分析をSPSSで完結させている場合には、特に問題がないのだが、Rでインポートとなってくると、文字化けが起こるのである。

f:id:iDES:20191217153649p:plain

このような場合はエンコードcp932にする。

d2 <- read_sav("06genren.sav", encoding ="cp932")

f:id:iDES:20191217153703p:plain

文字化けせずに読み込むことができる。 ちなみにCP932はShift_JISWindowsアプリケーションにおける実装である。 エンコードUTF-8の時は"UTF-8"と書く。

SPSSデータの書き出しとエンコードの変換

さきほど読み込んだd2に格納した06genren.savSPSS形式で書き出す。

write_sav(d2, "gender_survey.sav")

write_sav関数での書き出しはUTF-8である。 Rのhavenパッケージを通すと、SPSSを使わずにデータのエンコードができる。

これはPSPPを使う場合に有用かもしれない。 PSPPも日本語WindowsのローカルエンコードであるCP932に対応していたようにも思うが、WindowsUTF-8で動かしている人は、Shift-JISのSPSSデータを読むと文字化けしたはずなので、そういった場合に、havenパッケージでエンコーディングをするとよいと思う。

Stataデータの読み込み

foreignパッケージではStata13ファイル以降が読み込めないらしい。 Stata16のサンプルデータを読み込んでみよう。

https://www.stata-press.com/data/r16/r.html

d3 <- read_dta("http://www.stata-press.com/data/r16/apple.dta")

以上にように記するとWeb上のデータも取得できる。
read_dtaread_stataでもよいらしい。

Stataデータの書き出し

write_dta(d3, "apple.dta", version=14)

こちらはwrite_stataは通らない。

バージョンは8~15までをサポートしているらしい。
古いStataしか持っていなくて、データが自分の持っているStataのバージョンより大きいバージョンで作成されている場合には、古いバージョンへのデータのダウングレードが可能である。

さきほどSPSSデータ06genren.savをd2で取り込んだが、これをStata形式で出力してみよう。

write_dta(d2, "gender_survey.dta")

Stata16の新規機能実装のウリの一つはSPSSのデータなども読み込めるようなったことである。
いまさらの対応か、とも思うが、ケチくさいのは、書き出しにはいまだに対応していないことである。

僕はStataユーザーになってから日が浅いので、対応するパッケージが作られていて、実はできるというオチのような気もするが、少なくとも標準機能だけではできないので、不便である。
他の統計パッケージのデータが読めない場合には、このような変換テクニックを知っておくと役に立つように思う。

RのTSstudioパッケージ

時系列データのグラフィックを目的に作られたTSstudioパッケージを紹介しよう。TSはTime Seriesの略だろう。

ramikrispin.github.io

TSstudioパッケージの中にUSgasという天然ガスの消費のデータが入っている。

library(TSstudio)
data(USgas)

このような感じのデータである。
月間消費量である。暖房に使うためか、冬場に高くなる特徴がある。

        Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
2000 2510.5 2330.7 2050.6 1783.3 1632.9 1513.1 1525.6 1653.1 1475.0 1567.8 1908.5 2587.5
2001 2677.0 2309.5 2246.6 1807.2 1522.4 1444.4 1598.1 1669.2 1494.1 1649.1 1701.0 2120.2
2002 2487.6 2242.4 2258.4 1881.0 1611.5 1591.4 1748.4 1725.7 1542.2 1645.9 1913.6 2378.9
2003 2700.5 2500.3 2197.9 1743.5 1514.7 1368.4 1600.5 1651.6 1428.6 1553.2 1753.6 2263.7

2000年1月から2019年7月までのデータが含まれている。

年次推移プロット

ts_plot(USgas, 
        title = "US Monthly Natural Gas Consumption",
        Ytitle = "Billion Cubic Feet")

f:id:iDES:20191216152322p:plain

季節推移プロット

ts_seasonal(USgas, type = "all")

f:id:iDES:20191216152334p:plain

タイプは"normal"、"cycle"、"box"の3つ。今回は"all"を指定して3つとも表示させている。

ヒートマップ

ts_heatmap(USgas, title = "US Monthly Natural Gas Consumption - Heat-map")

f:id:iDES:20191216152401p:plain

デフォルトの色は青だそうだ。 直近4年といった設定もできるようだ。データ加工をすればいいだけのような気もするが、あると便利なことはあるのかもしれない。

ts_heatmap(USgas, last = 4 * 12, title = "US Monthly Natural Gas Consumption - Heat-map - Last 4 years")

f:id:iDES:20191216152437p:plain

ACFとPACF

自己相関(ACF, autocorrelation function)と偏自己相関(PACF, partial autocorrelation function)のグラフも出力できる。

ts_cor(USgas, lag.max = 60)

f:id:iDES:20191216152452p:plain

ラグプロット

ts_lags(USgas, lags = 1:12)

f:id:iDES:20191216152541p:plain

予測モデル

レーニングセットとテストセットに分割する。

USgas_s <- ts_split(ts.obj = USgas, sample.out = 12)
train <- USgas_s$train
test <- USgas_s$test

レーニングセットに2018年の7月までのデータが入り、テストセットに2018年8月2019年7月までの1年分のデータが格納されている。

auto.arima関数を使った予測

library(forecast)
md <- auto.arima(train)
fc <- forecast(md, h = 12)

実際の2000-2019年のデータ(分割前のフルデータ)とトレーニングセットからの推測を並べてプロット。

test_forecast(actual = USgas, forecast.obj = fc, test = test)

f:id:iDES:20191216152601p:plain

2018-2019期が緑のForecastとして表示されている。

予測値に着目して、もう少しわかりやすくプロットしたのがこちら。

plot_forecast(fc)

f:id:iDES:20191216152631p:plain

レーニングセットから2018-2019期を予測し、その80%、95%確信区間を表記できる。

自閉スペクトラム症の原因の探索

自閉スペクトラム症関連の記事の紹介を2つほど。

blog.livedoor.jp

抗生物質が原因ではないかという論文が紹介されている。
場末P科病院の精神科医のblogがまた再開されるのかわからないが、再開するなら喜ばしいニュースだ。

日本語ではPPA(プロピオン酸)に関する論文の紹介がNewsweekでされていた。

www.newsweekjapan.jp

どちらの仮説の段階である。
ワクチン仮説のように否定される可能性も十分にあるので、何かの行動に移すのではなく、少し静観しておいた方が良いように思う。

ちなみに、現在時点で、自閉スペクトラム症の増加原因として、間違いなく確定しているのは、母親・父親のが高齢で出産するようになったことである。

食品添加物がない時代にも自閉スペクトラム症があっただろうという声が上がっているようだが、増加というのは促進要因が加わったという意味である。
遺伝的要因+環境的要因(受精から出産まで)でほとんどの精神障害は8割程度が説明できるのだが、環境要因に新たなものが加わったため、発病しやすくなったという理解が正しい。

統合失調症が過去は人口の1%程度あったが、1) 栄養状態の改善(妊娠後期の母体に十分な栄養が供給されるようになった)、2) 住環境の改善(特に冬に暖房で寒い部屋で母親が過ごさなくてもよくなった)ことによって、有病率は著しく減少した。遺伝的に素因があったとしても、発病するか否かは、(物理的な)環境によって意外と左右されるのである。

ひきこもりはロスジェネ世代に多いのか――ロスジェネ仮説を検証する

synodos.jp

シノドスに論考が掲載されました。
ロスジェネ仮説の検証を前面に押し出した方がいいというのは芹沢さんのアドバイスで、趣旨が明確になったように思います。

統計技法的には区間推定にagresti-coull法を初めて使いました。

今学期のおすすめ学習アプリ2019年秋

大阪大学でICT教育を取り上げている授業でのまとめ。2018秋、2019春と以前に2回エントリを入れているのでそちらも参照のこと。

ides.hatenablog.com

ides.hatenablog.com

スタディプラス

play.google.com

今までなぜか登場していなかったアプリ。超有名。
受験勉強の際に自身の勉強時間の管理ができる。臨床心理学でいう「認知療法」である。一般的には「見える化」などの一部だろうか。

また、同じ志望校の人たちがどのくらい勉強しているかなどもわかるので、合格するための勉強時間のベンチマークとして使えるアプリである。受験生にオススメ。
大学になったら要らないかも。

HiNative

hinative.com

onna と onna no hito はどう違いますか?
説明が難しい場合は、例文を教えて下さい。

という質問に対して下記の回答が返ってくる。

onna = woman

no = of
hito = human| people | person
onna no hito = a polite word for "woman"

【onna】 と 【onna no hito】 はどう違いますか? | HiNative

知恵袋などよりもよほど信頼性が高い、とのこと。

Spotify

www.spotify.com

言わずと知れた超有名アプリだが、英語学習用のポッドキャストがあるらしい。

www.fluentu.com

これはかなり興味深い。

Reverso

www.reverso.net

Google翻訳的なもの。スマホのアプリも存在している。
Google翻訳は言語によってはダメダメなので、Reversoが役立つときもあるとのこと。
機械翻訳は毎日使っているので、試してみたい。

DROPS

languagedrops.com

多言語に対応した言語習得アプリ。おもしろそうなので少し使ってみたい。

アラビア語検索エンジン アラジン

アラビア語専攻の学生が2名いたため、アラビア語関係のアプリ・サイトがいくつかあがった。

www.linca.info

アラジンというのは、オンラインのアラビア語-日本語の辞典のようである。

アラジンのすばらしさは、アラビア語との関係がない人にはあまりピンとこないので、こちらのブログエントリを参照してもらうとわかるかもしれない。

blog.goo.ne.jp

日本語-英語は学習環境が整っているが、アラビア語となると、あまり環境が整っていないので、いろいろと苦労するのだろう。

Arabic Almanac

Arabic Almanac - Hans Wehr

Arabic Almanac - Hans Wehr

  • Omar Jahangir
  • 教育
  • 無料
apps.apple.com

こちらも辞書。詳しくないので不確かだが、アプリの説明によるとアラビア語の有名な辞書Hans Wehr辞書のオンライン版だそうだ。アラビア語を勉強する人にとっては、紙の辞書を持ち歩かなくてもいいので、かなり便利だろう。


僕のおすすめ

前回、前々回として出しているので枯れてきているが、思い当たるものをあげてみよう。

Dropbox Paper

www.dropbox.com

共同作業のプラットフォーム。文書作成が主たる機能。GoogleのG Suiteが最も使われている分野だが、個人的にはDropbox Paperの方が優れていると思う。

Markdown Preview Enhanced

shd101wyy.github.io

AtomエディタとVSCodeのエクステンション。作者はイリノイ大学のYiyi Wangさん。 AtomエディタやVSCodeを使っていないと、使えないのだが、このエクステンションのためにAtomの導入をしてもよいくらいだと思う。このエクステンションを使うようになってから、Wordで文章を書くのが、ひどく煩雑で、バカらしくなる感じている。

Wangさんによれば、RStudioを参考に、このプラグインを作ったのだとか。Rのプログラムが走らないことを除けば、このアプリの方が優れたものに仕上がっている。
RStudioは文章が打ちづらく、エディタに作られている他のエクステンションも使えないので、編集はAtomの方が圧倒的に使いやすい。
AtomからRが操作できれば最強なのではないかと思う。

Thesaurus.com

https://www.thesaurus.com/

オンラインの英語の類語辞典。割とよく利用している。英文を書く上でシソーラスは必須。

Pronounce Names

www.pronouncenames.com

人物の読み方を調べるサイト。英語圏ではない人の名前が論文の著者にあるときが多いので、割と使っている。同種のサイトもあるので、併用すると良いと思う。Google検索で名前 Pronounce名前 How to PronounceとかでもOK。

Tables Generator

www.tablesgenerator.com

Markdown利用者は限定されるかもしれないが、Markdownのエディタは表づくりがあまり得意ではない。Excelのセルをコピーして貼って使えるところがよい。非常に便利。LaTex、HTML、Wiki形式にも対応している。

R-bloggers

www.r-bloggers.com

統計学による分析にRを使っている人限定だが、かなりレベルが高いサイト。よく知らないが、プラグラミングのQiitaみたいな存在なのかもしれない。

guru

www.guru.com

アウトソーシングのマッチングサイト。人力なのでもちろん有料。

勉強というより、仕事に使うサイトだろう。一般的な英語の校正であったり、アカデミック・ライティングの校正を請け負っている人がいるので、英語のアウトプットを出すときには利用するといいかもしれない。日本の業者の校正があまりよいと思ったことがないので、それよりは、guruの中でスキルの高い人を探してみる方がよいと思う。

以前紹介したgrammarly(https://app.grammarly.com/)にも、アウトソーシングで英文校正をしてもらう機能がある(有料)。grammarlyでの校正は非常に手軽という利点はあるが、人が選べないのと、クオリティ的に多少、難ありと感じることもあるので、guruも利用した方が良いと思う。日本語論文のアブストレベルであれば、grammarlyでも十分。

僕は英語しか使わないので英語に関してしか知らないが、guruであれば、その他言語への翻訳や校正をしてくれる人もいるように思う。