タグ別アーカイブ: R

3/9に東京で統計のワークショップをやります

直前の宣伝になってしまいましたが,きたる2019年3月9日(土)に,JACET英語語彙・英語辞書・リーディング研究会合同研究会にて代打で統計のワークショップ講師を担当することになりました。下記が場所と日時です。

日時:2018年3月9日(土)12:00-17:00(時間は予定)
場所:早稲田大学 11号館 4階 会議室
参加費:500円(予約不要)

下記のリンク先から詳しいプログラムも見れます。

https://sites.google.com/site/jacetlex/

Rを使う予定ですが,Rの操作等についてやっている時間はなさそうなので,基本的にはRを自力で扱うことはできる人が対象になるかと思います。GLMとかGLMMをやってみるというような内容で,基本的には下記のテクニカルレポートで書いたものがベースになります。

田村祐(2016)「外国語教育研究における二値データの分析-ロジスティック回帰を例に-」『外国語教育メディア学会中部支部外国語教育基礎研究部会2015年度報告論集』 29–82.

統計に詳しくない私が講師ですので,末端ユーザーかつ初心者によるワークショップだと思っておいてもらって間違いありません。

当日に使用する資料,Rコードなどは下記のGit Hubにアップロード予定です。

https://github.com/tam07pb915/JACET-SIG_GLMM-Workshop

よろしくお願いします。

なにをゆう たむらゆう。

おしまい。

広告

Rmarkdownでスライド作るときのリアルタイムプレビュー

Twitterでたまたま見つけてすごく便利そうだったので試してみたら本当に便利だったという話です。元ネタは下記のリンク。自分用のメモとしても残しておきます。

Instant preview without fully rebuilding HTML, and the linked navigation

RmarkdownはRスクリプト書くだけじゃなくてスライド作りができて,Rのスクリプトやその結果も出力に混ぜたりできるので便利なのですが,1つの難点が,実際の出力がその場で確認できないということなのですね。つまり,Rmdファイルで書いているものがスライドにどう落とし込まれるのかについては,knitしてHTMLファイルを作らないとわからないと。で,それはめんどくさいので,編集しながらリアルタイムプレビューが見れるようにしたよというのが上のリンク先の話です。xaringanパッケージというものを使います。xaringanパッケージをつかったスライド作成については他に詳しく書かれている方もいるのでそちらのリンクを。

xaringanによるスライド作成入門

もともと,xaringanパッケージのInfinite Moon Readerというものは,編集中の.Rmdファイルをsaveしたらプレビューが見れるというもので,それを拡張してわざわざsaveせずともプレビューが見れるようにしたというものです。デモのスクリーンキャプチャ動画を載せておきます。

上のリンク先にも書いてありますが,Rのコードチャンクはリアルタイムでは反映されないので,一旦saveしてコンパイルし直す必要があります。

outputオプションがxaringan::moon_readerになっていないとこのプレビュー機能は使えないので,デザインが気に入らないという人はcssファイルをいじって自分好みに変更するということをしなくてはいけないようです。詳しくは,上の「スライド作成入門」のリンクを御覧ください。私は日本語フォントが中国語っぽくなってしまってうのを避けるために,フォントの設定だけいじりました。slides_filesの下にあるremark-css-0.0.1に,”default-fonts.css”というファイルがあるので,それをコピペしてRmdファイルが有る場所と同じディレクトリに”My-font.css”というファイルをつくりました。その中で,”body{ font-family:”の後ろに自分の好きなフォントを書いて保存すればOKです(下記の画像参照)。

他には,スライドのフォントサイズを変えるというのもしたかったので,下記のリンクを参考にしました。フォントを変えるのと同様に,”default.css”をコピペして”My-theme.css”というファイルを作り,そこにスライド全体のフォントサイズを変える設定を追記しました。また,リンク先にスライドの1ページだけフォントサイズを変える”.my-one-page-font”というのもあったのでそれも追記しました。

https://stackoverflow.com/questions/53481699/customize-font-size-for-all-the-slides-in-xaringan

それから,スライドの中で一部分だけ文字サイズを小さくしたり大きくしたりというのもタグでできると便利なので,下記のリンク先で書かれていた”.small”と”.large”というのも”My-theme.css”に追記しています。

https://github.com/yihui/xaringan/wiki/Font-Size

これらの自分好み設定を反映させるには,YAMLヘッダーのoutputオプションを次のようにしてあげます。

output:
xaringan::moon_reader:
css: [“My-theme.css”,”My-font.css”]

Rmarkdownでスライド作ることに慣れている人や,がつがつcssファイル書いてカスタマイズできる人には当たり前のことかもしれないのですが,私はそのあたり初心者なのでこういうことも知りませんでした。

ちなみにですが,このxaringan::moon_readerにはめちゃくちゃ面白い“yolo: true”というオプションがあります。

 

ちなみに,これは挿入される画像を自分で指定することもできますし,どのくらいの頻度かも指定できます。こういう遊び心があるのはなんかいいですよね。

というわけで,Rmarkdownでスライドを作ったりする方はぜひ一度お試しあれ。

なにをゆう たむらゆう。

おしまい。

 

[R] 同じディレクトリ内でファイルを複製する

はじめに

ライティングの授業で(またそれかよ),次のようなことを考えました。

テンプレートのファイルを作って,学生の人数分だけコピーし,さらにそれぞれのファイルに学生の名前をつけたい!

まず思いつくのは,雛形ファイルを作り,Ctrl+CとCtrl+Vを駆使して学生の人数分のファイルを用意し,1つずつファイルをリネームするといういわゆる土方作業ですが,そんなことやってられませんよね。というわけで,Rで簡単にファイル複製とリネームをやってしまおうということです。別に特別なことはしておらず,自分用のメモです。もっと簡単な方法があれば教えてください。

ワーキングディレクトリを変更

まず,ワーキングディレクトリを,テンプレファイルが置いてある場所に変更しましょう。

setwd("C:/Users/Yu/Desktop/test")

getwd()

## [1] "C:/Users/Yu/Desktop/test"

必要な情報を取得

ファイルをコピーする際にフルパスを使うので,その情報をあらかじめ変数に入れておきます。そして,list.files()関数で,ワーキングディレクトリ内にあるファイルの情報を取得します(別に1つしかないので手入力でもOKです)。そして,originalという変数に,テンプレファイルのフルパスを入れておきます。

dirnow<-getwd()

file<-list.files()
original<-file.path(dirnow,file)


ファイル名の準備

ファイルにつける名前の準備です。ここでは例としてアルファベットを使っていますが,学生の名前を使う場合は学生の名前をコピペする等してname変数に入れてください。その後,テンプレファイルの前に名前をつけてfilenameという変数に入れています。sep=”_”は区切り文字をアンダーバーで指定しているということなので,ここは任意の文字に変えられます。

name<-LETTERS[1:26]
filename<-paste(name,"test.docx",sep="_")

print(filename)

##  [1] "A_test.docx" "B_test.docx" "C_test.docx" "D_test.docx" "E_test.docx"
##  [6] "F_test.docx" "G_test.docx" "H_test.docx" "I_test.docx" "J_test.docx"
## [11] "K_test.docx" "L_test.docx" "M_test.docx" "N_test.docx" "O_test.docx"
## [16] "P_test.docx" "Q_test.docx" "R_test.docx" "S_test.docx" "T_test.docx"
## [21] "U_test.docx" "V_test.docx" "W_test.docx" "X_test.docx" "Y_test.docx"
## [26] "Z_test.docx"

ファイルのコピーとリネーム

それでは,ここで,ファイルのコピーとファイルの名前変更をfor関数で一気に行います。file.copy()関数は,fromでコピー元,toでコピー先を指定します。この時,fromではもとファイルのフルパスであるoriginalを使います。そして,toのところで,「ワーキングディレクトリ+名前変更後のファイル名」を指定してあげると,コピーされたファイル名に名前がつくことになります。paste()関数は,文字列結合の関数です。ファイルの一覧の中にblog.htmlとblog.Rmdというファイルが入っていますが,この2つはこのブログのために作ったファイルですので関係ないです。

for (i in 1:length(filename)){
file.copy(from=original,to=paste(dirnow,filename[i],sep="/"))
}

list.files()

##  [1] "A_test.docx"     "B_test.docx"     "blog.html"      
##  [4] "blog.Rmd"        "C_test.docx"     "D_test.docx"    
##  [7] "E_test.docx"     "F_test.docx"     "G_test.docx"    
## [10] "H_test.docx"     "I_test.docx"     "J_test.docx"    
## [13] "K_test.docx"     "L_test.docx"     "M_test.docx"    
## [16] "N_test.docx"     "O_test.docx"     "P_test.docx"    
## [19] "Q_test.docx"     "R_test.docx"     "S_test.docx"    
## [22] "T_test.docx"     "test.docx"       "test.Rproj"     
## [25] "U_test.docx"     "V_test.docx"     "W_test.docx"    
## [28] "X_test.docx"     "Y_test.docx"     "Z_test.docx"

こんな感じでファイル複製とリネームができます。Google Classroomを使っていると、教材ファイルをコピーして配布という機能があり、それを使うと自動的に学生の名前のついたファイルができるのですが,それなしでやろうとすると,こうなるかなという感じです。

これを使って何をするかという記事はまた改めてポストしようと思います。

なにをゆう たむらゆう。

おしまい。

R MarkdownからそのままWordPressに

下記は,Rmarkdownの出力をそのままWordPressに流し込むためのテストです。Rmarkdownファイルを開いたときに入っているデフォルトのコードと文章です。RmarkdownからWordPressに流すために必要な作業については下記ウェブサイトが参考になりました。

R markdownの出力をWordpressへそのまま投稿する | On Your Mark . Tokyo

ただし,plotの画像が表示されなかったので,それを解決するために下記のウェブサイトも参考にしました。

How to publish with R Markdown in WordPress

 

R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

plot of chunk pressure

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

[R] sjPlotパッケージのバージョンアップ

Rで回帰モデルの図示をするときに私が使うパッケージは主に2つあって,1つはeffectsパッケージ,もう一つはsjPlotパッケージです。前者については,以前NagoyRで発表したことがあります。

effectsパッケージを用いた一般化線形モデルの可視化

後者は,lm, glm, lmer, glmerなどの関数で作った回帰モデルの結果が入ったオブジェクトを渡すと,その結果をggplot2に渡して可視化してくれます(その他にもいろんな可視化が可能ですが,私が使うのは主に回帰モデルの可視化です)。昔(数年前)までは,sjp.lm,sjp.glm,sjp.lmer,sjp.glmerなど,もとの回帰モデルに合わせて図示する際の関数を選ぶ仕様になっていました。そして,交互作用図を描きたいときは,sjp.int関数を使うというような。それが,最新版のsjPlotパッケージでは,これらの関数がなくなりすべてplot_modelという関数に統一されているようです(下記のサイトによると2017年10月にこの変更があったようです)。使用例は以下のサイトが参考になります。

„One function to rule them all“ – visualization of regression models in #rstats w/ #sjPlot

交互作用図は,type引数でintにするか,またはtypeをpredにして,termsで交互作用を指定するようです。

plot_model(fit, type=”int”)

or

plot_model(fit, type =”pred”, terms =c (“test”, “group”))

みたいな感じです。これについては,下記のページが参考になります。

 

Plotting Interaction Effects of Regression Models

より詳細な引数の説明などは以下のページに書いてあります(RDocumentationのページ)。

plot_model function | R Documentation

D院生のときに書いたスクリプトではGLMMの結果の可視化にsjp.glmerとかsjp.intを使っていたので,それらが動かなくなっていました。調べたらこういう仕様の変更があったと。一つの関数で,引数の組み合わせで色々な図が描けるというのは便利でいいですね。ただ,テーブル形式(HTML)で回帰モデルの結果を出力するsjt.lm系の関数は,lm, glmなどと組み合わせて,sjt.lm, sjt.glm, sjt.glmer, sjt.lmerなどのままのようです。

それから,最近lme4のモデル式の書き方でstanを使ったベイズ推定ができるbrmsというパッケージを知った(遅い)のですが,plot_model()はbrmsパッケージのモデルにも対応しているようです。まだ試してはいないので,いつかまたブログに書こうかなと思います。

では。

なにをゆう たむらゆう。

おしまい。

RStudio 1.0.143

MacのRStudioを新しいversion(1.0.143)にアップデートしました。

何が変わっているのかなと思ったら,Rmdでコードを実行した時に,もはやコードの実行結果がコンソール上に表示されなくなっていてびっくり。これはこれで便利なのかもしれないけど,慣れていなさすぎて逆に戸惑っています…

もちろん,コンソール上に直接打ち込んでいたり,R Script上で打ち込んでいれば結果はコンソールに出るのですが,RmdファイルのRチャンクをつかっている場合,そのチャンクの下に結果が表示されるようになっていて,大きいデータはGUIでポチポチするようになっています。

別ウィンドウに出せるようにもなっていて,Notebook Outputと呼ばれているようです。

多分出力の結果によってこのアウトプットのされ方も色々変わってくるのでしょうね。細かいことはまだよくわかってませんが,ちょっと使ってびっくりしたのはこの仕様でした。

個人的にはRStudioは好きで今まで使ってきていたのですが,これはなんかちょっと違うような…

なにをゆう たむらゆう

おしまい。

※追記

プロットも右下のペインではなくRチャンクの下に表示されるようになっているようです。

[R] データフレームの中の英文の語数を数える

以前,エクセルで英文の中の特定の単語までの語数を数えるという記事を書きました。今回はそれよりもっと単純で,Rのデータフレームの中の1部に英文が入っていて,その英文の語数を数えてデータフレームに付け足したいなっていう作業です。

%e3%83%96%e3%83%ad%e3%82%b0%e8%a8%98%e4%ba%8b%e7%94%a8_20170218

こんな感じでロング型のデータがdatという変数にあるとします。このデータフレームのなかの,sentenceという列には英文が入っていますが,それぞれ長さが違います。文が長いほうが反応時間も長くなっちゃいますから,そのために英文に含まれる語数を数えてそれも分析に使いましょうということです。僕がやっているような反応時間を扱う実験ではよくありがちな手続きです。本来なら刺激文作るときにそれもちゃんと数えておいて(エクセルで語数数えるのは簡単です。前掲の記事の一部がそれです),結果が出力される際にちゃんと語数の情報も含めておけばいいんですけど,まぁ今回はそれ忘れちゃったんでRの中でやってしまおうという事後的な対処法です。

さてさて前置きが長くなりました。Rでの文字列処理の基本は「分ける」・「数える」だと思います。僕はそんなにRで文字列処理しないんですが,今回の場合で言うと,データフレームの要素に含まれる英文をスペースで区切り,区切ったときにいくつかに分けられた要素の数を数えることで語数をカウントするという手続きになります。

今回使う関数は次の4つです。

  • (as.character関数)
  • strsplit関数
  • length関数
  • sapply関数

順番に説明していきます。strsplit関数は

strsplit(分けたいもの,区切り文字)

という感じで使います。今回の場合,分けたいのはdatの中のsentenceという列(dat$sentence)で,スペースで区切りますから,

strsplit(dat$sentence, ” “)

とすれば,

%e3%83%96%e3%83%ad%e3%82%b0%e8%a8%98%e4%ba%8b%e7%94%a8_20170218_2

こんな感じで単語ごとに区切ってくれます。この出力は1文ずつのリスト形式になっていて,そのリストの要素が英文を構成する単語になっています。もしも,このstrsplit関数がうまくいかなければ,

is.character(dat$sentence)

として,データフレーム中の英文が文字列形式で格納されているかどうか確かめてみてください。因子型(factorial)になっていると,strsplit関数は適用されません。これを変えるのが,as.character関数です。

strsplit(as.character(dat$sentence))

または,

dat$sentence<-as.character(dat$sentence)
strsplit(dat$sentence, ” “)

としてみてください。

さて,これでひとまず「区切る」作業はできましたが,まだ「数える」にはいたっていませんよね。数えるためによく使われるのが要素の数を数えるlength関数です。ただし,例えば

length(strsplit(as.character(dat$sentence)))

としてもうまくいきません。これでは出力されたリストの要素を数えるので,元のデータフレームの行数が表示されるはずです。ここでは,「リストのそれぞれの要素に対してlength関数を適用したい」わけなので,もうひと工夫必要です。そこで使うのがapply系列のsapply関数です。この関数は,

sapply(リスト,関数)

という形で引数を与えてあげると,リストの各要素に関数を適用してくれます。これと同じことができるのがlapply関数です。lapply関数を使うと,結果の出力もリスト形式で返されます。ただ,ここでは語数が並んだベクトル形式のものを手に入れて,それをもとのデータフレーム(dat)に追加したいわけなので,sapply関数のほうがベターです。lapply関数にすると,そのあとリストをベクトルに直すunlist関数を使う必要があって二度手間になってしまうので。というわけで,

sapply(strsplit(as.character(dat$sentence), ” “), length)

こうしてあげれば「スペースで区切る-> 語数を数える -> ベクトル形式で結果をゲット」という作業が完了します。あとは,

dat$num.words<-sapply(strsplit(as.character(dat$sentence), ” “), length)

としてあげれば,datに新しくnum.wordsという列が追加され,そこにはsentenceの列に入っている英文の語数が格納されることになります。めでたしめでたし。といきたいところなのですが,最後におまけでもうひとつ。

上の書き方だと,いくつもの関数が入れ子状態になっていて,一見して作業がわかりにくいですよね?そこでパイプ演算子を使って同じことをもう少しわかりやすく書き直してあげます。

dat$sentence%>% #datの中のsentenceという列を取ってくる
as.character%>% #文字列型に変換
strsplit(. , ” “)%>% #スペースで区切る
sapply(., length) -> dat$num.words #リストの要素ごとに語数を数えてdatというデータフレームのnum.wordsという列にいれる

こうやって書くと,作業の過程が見えてわかりやすいですよね。ちなみにこのパイプ演算子はパッケージ依存です。dplyrやtidyrを使うときに使うやつですね。たぶんこれらのパッケージを読み込んでいればパイプ演算子も使えるようになっているはずです。もともとはmagrittrというパッケージに入っているのがパイプ演算子が%>%なんですよね(たしか)?

というわけでlapplyの出力をunlistしてできたできたと思っていたらsapply関数の存在に気づいてなんだよ二度手間じゃんかよって思ったのでブログ記事にしました。

なにをゆう たむらゆう。

おしまい。