カテゴリー別アーカイブ: 研究

glmerからのlsmeans

RでGLMMするときに使うglmer関数。要因の水準が3以上になると,どうしても多重比較したくなっちゃいますよね。けれど,デフォルトでは全水準の総当り比較はできない。そんなときにはlsmeans関数が便利です。ところが,glmer関数の出力結果をいれた変数を使ってlsmeans関数に渡してもなんかエラーメッセージが出てしまいました。

Error in format.default(nm[j], width = nchar(m[1, j]), just = "left") : 4 arguments passed to .Internal(nchar) which requires 3

こういうやつ。Rでエラーメッセージが出て,その原因がよくわかんなかったらもうそのエラーメッセージをそのままコピペしてググってしまうと。そうするとたいてい同じ悩みで困っている人の書き込みとかがヒットすることがしばしばあります。

するとこのサイトがヒット。

Error in R lsmeans() function: Error in format.default(nm[j], width = nchar(m[1, j]), just = “left”)

この掲示板の書き込みを見てみると,どうやらRのバージョンが古い(R3.2.0以前)とこのエラーメッセージが表示されるらしいです。なんか根本的な解決にはなってないような気もしますが…

とはいえ私もR3.2.0ユーザーだったので,これを気に新しいRをインストールすることに。R.3.3.0が最新らしいです。最新のに変えると今まで使ってたパッケージに不具合が出たりすることがあって不安でしたが,実際にRのバージョンを新しくすればglmerのあとに多重比較ができました。

fit1<-glmer(RT ~presentation*condition+ (1|subject) + (1|item), family = Gamma (link= “identity”), data=dat,glmerControl (optimizer=”bobyqa”)

lsmeans(fit1, pairwise~condition|presentation)

こんな感じ。

要因の順番は,多重比較したい要因が先にきます。つまり,上の例だと,condition条件の多重比較をpresentation条件ごとにやるという感じです。逆にすれば,presentation条件の多重比較をcondition条件ごとにやることになります。

もちろんコーディングを変えて全条件の組み合わせをつくればlsmeansとかしなくてもglmerだけで大丈夫ですし,例えば1, 2, 3と水準があったときに,1と2,3をまとめた水準を比較して違うか調べたいときとか(例えば英語母語話者が1で日本語母語話者が2, 韓国語母語話者が3で,母語話者群と学習者群が異なるか調べたいとか)には,やはり自分でコーディングを変えないといけません。カテゴリカル変数のコーディングの違いについてはこのサイトがわかりやすいです。

R Library: Contrast Coding Systems for categorical variables

しかしもはやこれでANOVAする必要が本当にないのではないかと…

 

そういえば,ついにdplyrの基礎がわかってなにこれめちゃ便利って感動したのでそのこともまた書きます。

なにをゆう たむらゆう。

おしまい。

Diffusion model

草薙さんが最先端いってると思っていたらついにL2研究でもDiffusion modelを取り入れる研究が出てきたか。いやーしかしこれはついていくのしんどいな…


 

情報源: Bilingualism: Language and Cognition – Visual word recognition in a second language: A test of the lexical entrenchment hypothesis with lexical decision times – Cambridge Journals Online

「落ちたら国際誌」

タイトルの意味は,まずは国内のいわゆる「全国誌」といわれるもの(e.g., 全国英語教育学会のARELE, 外国語教育メディア学会の機関誌)に出して,もしリジェクトされたら国際誌に出すというもの。

この志向がいいのか悪いのかはよくわからないが,ARELEに落ちた論文をLanguage Teaching Researchに載せた先輩がいるとこういう考え方になるのかな。

論文の内容によっては国際誌—といっても幅広いが—の方がマッチするというケースもあるように思う。特に私の(メインの)研究なんかは,国内誌で大きいところに出すのを躊躇するような内容だったりする。心理言語学系のジャーナルは国際誌だと結構あるので。国際誌はコワイから出さないということもあるのかもしれないが,落ちたら落ちたで別のところに出せば良いし,選択肢は1つだけじゃあない。そして,なにより分野が近い人に査読してもらえることの方を重視する。リジェクトされて元気が出るような研究者は—よっぽどのMっ気がない限りは—いないと思うし,誰だってそのときはへこむだろう。しかしながら,論文をpublishし続けている人は,その裏でリジェクトだってもらっていると思う。それでも出し続ける強さがないと—そしてそれは研究者として大事な素質だと思う—,コンスタントに論文を書くのは無理だろう。その点で,「落ちたら国際誌」の志向は相当強い。ただの若気の至りかもしれないが。

この勢いが,あと30年続くかどうか(40あたりで歳下に尻を叩かれたり論文を全然書いてないけど査読するようなオトナになりたくない)。問題はそこ。

なにをゆう たむらゆう

おしまい。

Nagoya.R #15発表資料

Nagoya.R #15の発表資料をslideshareにアップロードしていたのですが,どうもうまく表示されないので,speakerdeckにもアップロードしました。こちらだと正常に表示されるようです。

教えていただいたlangstat先生ありがとうございました。

なにをゆう たむらゆう

おしまい。

卓越研究員事業

この制度はちゃんと活用されたら素晴らしいなと思う。今後,機会があれば応募してみたいし,うちの分野から優秀な人がこういうポジションに就いて,きちんと計画された大規模なプロジェクト型の教室研究をやってほしいなと思う(研究費も結構もらえるみたいだし「研究室のリーダー」的なものになれるようだ)。ただ,次の条件の③が自分にとっては少し厳しい。これだと,一度常勤なりポスドクなりの立場で研究する期間が修了後または満退後に必要になる。

①博士の学位を取得又は博士課程に標準修業年限以上在学し、所定の単位を修得の上、退学した者(いわゆる「満期退学者」)

②平成29年4月1日現在,40歳未満(ただし、臨床研修を課された医学系分野においては43歳未満)の者

③博士の学位を取得後又は博士課程の満期退学後(社会人学生であった場合は、学位取得前を含む)に、研究機関における研究経験を有する者


情報源: 卓越研究員事業(Leading Initiative for Excellent Young Researchers(LEADER) ):文部科学省

p.s. 白眉をしらまゆとか読んだりしてませんからねッ(汗

JABAET Journal No.19

届きました。

IMG_4457

査読委員(って言わないか)の中に知っている先生方が何人も載っていて驚きました。そして,豪華。この号から外部査読制度を取り入れたとのことで,それが大きいのでしょう。

私の修士論文の研究も載っています。

Tamura, Y. (2015). Reinvestigating consciousness-raising grammar task and noticing. JABAET Journal, 19, 19–47.[abstract]

査読のコメントはとても有益なものが多く,非常に勉強になりました。学会員しか投稿の権限はありませんが,良いジャーナルだと思います(宣伝)。ウェブ上での情報が少なく,いろんな人に認知されにくいというのはありますが,これからそのあたりも今後充実していくことを望みます。

なにをゆう たむらゆう

おしまい。

 

基礎研第3回年次例会発表資料

明日,2月27日に名古屋学院大学で開催される,外国語教育メディア学会中部支部外国語教育基礎研究部会第3回年次例会で発表する際に使用する投影資料をSlideShareにアップロードしました。

※slideshare上でうまくサムネイルが表示されないようですが,全画面表示にする,あるいはファイルをDLしてご覧いただく等で問題が解決すると思われます。ファイル自体は問題ないので。今までとスライドの元のデザイン同じなのになぜこの問題が発生するのかわからず若干不機嫌ではあります。

 

 

なお,当日は,結果の部分の図表や引用文献の一覧を印刷した資料を配布する予定です。内容はスライドと重複しますが,紙版の資料も閲覧・ダウンロード可能にしていますので,以下リンクよりどうぞ。

https://drive.google.com/file/d/0BzA9X1kZX185Nk5ONDJ5eUlOLVk/view?usp=sharing

ちなみに,これまで特に指定のない場合に配布資料を配ることはなかった私が配布資料を配るのはこのブログ記事の影響ではありませんw

単純に,結果の図表くらいは配ったほうが良いかもしれないというのは何回か発表を重ねるうちに思ったというのが大きいです。

ある人に,「なめたアブストラクト書きやがったな」と言われてヒィィって感じですが,どうか当日はよろしくお願いいたします。

なにをゆう たむらゆう

おしまい。

2016.03.28追記

slideshareでうまく表示されないようなので,speaker deckにスライドをアップしました。

Rで多重代入法:Ameliaパッケージ

ちょっとわけあって,欠損値の処理について勉強するソルジャー業務機会がありました。そこで,多重代入法(MI: Multiple Imputation)という方法をRで実行する方法を少しかじったのでメモ代わりに残しておきます。

ちなみに,欠損値の分析をどうするかという話は全部すっ飛ばしますのでそのあたりは下記リンクなどをご参照ください。

欠損値があるデータの分析

DARM勉強会第3回 (missing data analysis)

多重代入法に関してはこのあたりの資料をどうぞ。

多重代入法の書き方 公開用

様々な多重代入法アルゴリズムの比較(リンク先直PDF)

ざっくりと多重代入法はなにをやるかというと,手法によってアルゴリズムは異なりますが,欠損値を推定して補完したデータをたくさん作って,そのデータを元にして行った分析(e.g., 回帰分析なり分散分析なり)の結果得られたパラメタの推定値を統合して,欠損値がない場合の真のパラメタ値を推定しましょうみたいなことです。

Rには色々パッケージがあって,miパッケージ,normパッケージ,Ameliaパッケージ,miceパッケージ等々たくさんパッケージが用意されています。私はAmeliaパッケージを使ってみたので,その報告です。Ameliaパッケージは,bootstrapped EMアルゴリズムという手法を用いて欠損値補完を行っています。以下スクリプト例です。

#まずはデータセットの下準備。こんな仮想データだとします。

#id =参与者ID, reading = 読解テストの得点,grammar = 文法テストの得点,vocab = 語彙テストの得点

Screen Shot 2016-01-01 at 15.14.42

 #id列はいらないのでid列を抜いたデータセットを作る

dat1 <-dat[,-1]

Screen Shot 2016-01-01 at 15.15.31

#欠損を可視化するにはVIMというパッケージが便利

install.packages(“VIM”)

library(VIM)

#欠損情報を入手

m <-aggr(dat1)

#うまくいくとこんな感じで欠損情報を可視化してくれます

左側が欠損の割合で,右側が欠損のパターン。赤い所が欠損です。

左側が欠損の割合で,右側が欠損のパターン。赤い所が欠損です。

#数値で確認する場合はmの中身を見る

 Screen Shot 2016-01-01 at 15.17.48

#Multiple Imputation by a bootstrappted EM algorithm (Amelia Package)

#パッケージのインストール

install.packages(“Amelia”)

library(Amelia)

#amelia()関数をまずは使います

#引数は以下のとおり

#x = data.frame

#m = 何個のデータセットを作るかの指定

#dat1.outという変数に,多重代入した結果を入れます

dat1.out <-amelia(x = dat1,m = 5)

#中身はsummaryで確認します

summary(dat1.out)

Screen Shot 2016-01-01 at 15.19.32

#補完データの分散共分散行列をみる

dat1.out$covMatrices

Screen Shot 2016-01-01 at 15.20.12

#補完データを書き出し

#separate =Fと指定すると,データが1つのファイルに書きだされます

#separate = Tにすると,データセット1つにつき1ファイルで書きだされます

#dat1.ameria.csv, dat1.ameria1.csv, … dat1.ameria5.csvみたいな感じで番号をつけてくれます

#orig.data=Tで,オリジナルのデータを出力する際に含めるかどうかの指定ができます

write.amelia(obj = dat1.out,“dat1.amechan”,separate=T,orig.data = F)

#AmeliaView()を使うと,GUIで操作できます(重いです)

AmeliaView()

#多重代入した結果得られた補完データをまとめる作業をします

#例として重回帰分析をやってみます

#独立変数 = grammar, vocab

#従属変数 = reading

m =5

b.out <-NULL

se.out <-NULL

for(i in 1:m){

  ols.out <-lm(reading ~ grammar+vocab,data=dat1.out$imputations[[i]])

  b.out <-rbind(b.outols.out$coef)

  se.out <-rbind(se.out, coef(summary(ols.out))[,2])

}

#b.outにはbetaが5つ入っています

b.out

Screen Shot 2016-01-01 at 16.26.42

#se.outには標準誤差(SE)が入っています

se.out

Screen Shot 2016-01-01 at 16.26.54

#mi.meld()で,5つのbetaとSEをまとめます

combined.results<-mi.meld(q = b.out, se = se.out)

combined.results

Screen Shot 2016-01-01 at 16.28.26

SEがちょっと広めですかね

というわけで,まとめる段階が手動で関数書いていますが,それ以外は割りと簡単にできます。ファイルの書き出しなんかもできますし。

補足

miceパッケージを使うともっと簡単に多重代入->分析->統合ができるようです。

install.packages(“mice”)

library(mice)

imp_data<-mice(dat1,m = 5)

fit <-with(imp_data,lm(reading ~ grammar + vocab))

summary(pool(fit))

まぁまぁ結果は近い?

まぁまぁ結果は近い?

参考:Tokyo r #37 Rubin’s Rule

なんかmiceパッケージの方が使い勝手が良さそうですね(アレレ

ちょっとまた時間があったらもう少し勉強してみたいと思います。

今日はこのへんで。

なにをゆう たむらゆう

おしまい。

変数が多い研究デザイン系の縦横変換(tidyr)

先日ついにtidyrパッケージで縦横変換をやってみた。今までずっと覚えなきゃなと思ってて結局億劫でやってなかったんだけれど手伝いで仕方なく

データハンドリングで,横に広がる(列数の多い)wide-formatのdataを分析に便利なlong-formatに変換するというのは,分析をやるまえのデータ整形の過程で必ず通らなければならない道。Excel上で地道にやるのもあるにはあるだろうけど,Rのtidyrを使えばすぐできるというお話。これ系の話はググればネット上にゴロゴロ記事が転がっている。なので,今回は具体的に外国語教育研究系のデータ分析ではどんなときに役に立つかなーという話です。特に無駄に変数が多い時なんかは結構役に立つと思います。

sample data

sample data

適当にこんな感じでデータが入っているとします(数値は乱数)。事前・事後・遅延事後のテストがあって,それぞれで流暢さ(fluency),正確さ(accuracy),複雑さ(complexity)の指標があるみたいな。1列目には被験者番号があって,それぞれの列名は”test.measure”という感じでドット区切りにしてあります。で,これを,「事前・事後・遅延事後」の3つのカテゴリカル変数からなる”test”列と,3つの指標(CAF)の”measure”列の2列に分解しましょうという話し。

R上に上のようなデータを読み込みます。

read.table関数で読み込んだ場合(※MacなのでちょっとWindowsと違います)

read.table関数で読み込んだ場合(※MacなのでちょっとWindowsと違います)

まずはパッケージの準備

install.packages(“tidyr”) #パッケージのインストール

library(tidyr) #tidyrパッケージの呼び出し

datに入っているデータフレームをまずは,変数名の列(variable)とその値(value)の列に集約します。key=変数名の列,value=値の列という引数指定です。

#%>%はパイプ演算子。以下の関数で扱うデータフレームを指定するということです

dat %>%

#-subjectでsubjectの列を除外。変換したdataをdat2に入れる

gather(key = variable,value = value,-subject) -> dat2

long formatのデータに変換されました

long formatのデータに変換されました

これで変数名を1列に集約できました。ただし,この列にはpre, post, delayedというテスト実施時期の情報と,fluency, accuracy, complexityという指標の情報が混ざってしまっています。これを,2列に分けます。

dat2 %>%

#colで分けたい列名,intoで分けた後の列名を指定。sepでセパレータを指定しますが,デフォルトはあらゆる非アルファベットになっているので,ドットなら指定しなくても大丈夫

separate(col = variable, into = c(‘test’, ‘measure’)) -> dat 3

さて,dat3の中身を確認してみると…

long formatのデータに変換されました

long formatのデータに変換されました

おおおおー!!!!!

というわけで,横に変数がたくさんある場合もこのtidyrのgatherとseparateを使えば簡単にlong型に変換できそうです。

 

参考サイト:http://meme.biology.tohoku.ac.jp/students/iwasaki/rstats/tidyr.html

なにをゆう たむらゆう

おしまい。