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

教育的な示唆はありません

全国英語教育学会(JASELE)埼玉研究大会で口頭発表をしてきました。もともとはJASELEで発表するつもりの研究ではなかったのですが,昨年度も同じような発表をしたのであまり深く考えずに発表してしまったことを少し反省しています。そこで,その反省をもとに,発表する内容と発表する場所を今一度よく考えることにしました。

私はD1で博士論文研究のテーマを変えてから,私の研究の多くが言語処理の研究になっていました。いわゆる基礎研究というやつです。第二言語学習者が英語の単語または文をどのように処理しているのかに焦点を当てた研究です。はっきり言って,こうした研究から直接的に導き出される教育的示唆はありません。論理を飛躍させて教育的な示唆を無理矢理ひねり出すよりは,「教育的な示唆はありません」という態度を取ることが,基礎研究をやる者としての誠実な態度であると思っていましたが,それも発表する場によるということは勉強になりました。「全国英語教育学会」という名前の学会なのに教育的な示唆がないならその研究をここで発表する意味は何かと言われたら「はいすみません」というしかありません(実際に明示的にそう言われたわけではないですけど)。

それでも誤解してほしくないことは,私は英語教育にまったく興味がないわけではないということです。ただし,私は教育的な示唆を視野にいれた研究と,そうではない研究に線引きをしているだけです。狭義のSLA研究や心理言語学的な研究もやりますし,Instructed SLAや教室実践系のこともやるという二足のわらじ的な考えです。教育的な示唆が考えられる研究や実践報告も割合は少ないですがこれまでにやってきていますし,博士論文以降はむしろそうした研究に軸足を移していこうとも考えています。

ちょっとは大人になったつもりだったんですが,今振り返ると質疑応答では未熟で稚拙な対応をしてしまったなと反省しています。失礼しました。

私は文法の習得や処理についての言語的な要因を検討する基礎研究は,最終的には教育的な示唆につながっていくとは思っています。つまり,言語の要因や条件ごとに難しさが異なるということが明らかになり,そうした研究が蓄積されていけば,学習者の言語使用・パフォーマンスを教師(または学習者自身)が観察する際の参考資料になりうるからです。ただし,それは今回発表したこと自体やその直接的延長線上(どこをどう延長するかで解釈は変わるかもしれませんが)にあるということではありません(博士論文では教育的な示唆まで踏み込まないつもりですから)。

ということで,全国英語教育学会で発表する際にはそういった点に気をつけたいと思います。この度は申し訳ありませんでした。

なにをゆう たむらゆう。

おしまい。

JASELE2016埼玉大会発表資料

明日埼玉県の獨協大学で行われる全国英語教育学会埼玉研究大会にて口頭発表します。資料はspeakerdeckとslideshareに公開しています。去年熊本で発表したデータ(リジェクトされたのでまだ出版されてませんすみません)とは別の観点で取ったデータを元にして,博士論文研究のベースのさわりにちょっと触れるようなそういう話をする予定でいます。

ちなみに私の発表は1日目の午後14時30分から第5室(302)です。

Excelで英文中の特定の単語までの語数を数える

自分の作業用のメモです。

博論の進捗が遅れすぎていていよいよやばくなってきました。そこで,ちょっとでも博論を進めるための作業をやっていて,プログラムの修正も済んだので,あとはプログラムに刺激文を流し込むだけになりました。そこでちょっとした問題発生。あまり詳しいことを書くとネタバレするので書けませんが,プログラムの中で,ある特定の単語数になった場合に処理をするというようなことをやっています。それが刺激文ごとに異なるので,配列変数にその単語数を指定しているのですが,100ちょいある刺激文をいちいち目視して何語目かを数えるとかやってられません。ちなみに刺激文自体はExcelファイルにまとめています。こんな感じで。

ブログ記事用_20160811

Excel上で単語数を数える関数は,ウェブ上で情報が見つけられます。いつも使っているのはこちら。

エクセル関数を利用して文字列中の英単語の数を数える

英文の中の特定の単語までの語数を数えるというのは,分解して考えてみればいくつかの作業に分けて考えることができます。

  1. 英文の中にある特定の単語をみつける
  2. 特定の単語の前にある文字列を抽出する
  3. 特定の単語の前にある文字列から単語の数を数える

という感じです。英文に含まれる単語数を数えるのは,上の3つのうちで3の作業になります。この単語数を数えるのはどういう原理かというと,つまりはスペースの数を数えるということです。英文にはスペース区切りで単語が入っているわけですから,スペースの数を数えて,それに1を加えた数が単語の数というわけです。

1は,特定の単語,つまり特定の文字列を探すということです。FIND関数を使うと,指定した文字列が現れる位置を探してくれます。そして,2の文字列の抽出にはMID関数が使えます。MID関数は,文字列の任意の位置から指定した文字数を抽出してくれます。このFIND関数とMID関数を組み合わせれば,特定の単語を見つけて,それより前にある文字列を抽出することができるわけです(参考サイト)。例えば,さきほどのExcelでD2に入っていた

The boy saw the cute girls in the park last week.

という文の中で,parkがtarget語であるとしましょう。そして,target語はF2に入れているとします。すると

=MID(D2,1,FIND(F2,D2,1)-1)

とすれば,parkの前までの単語をすべて抽出できます。

ブログ記事用2_20160811

FIND関数で指定した位置からだとその単語の先頭も含まれてしまうので,-1をしています。これで,1と2のステップができました。あとは,この抽出した文字列に含まれる単語の数を数えれば良いということになります。

単語の数を数えるには,引き算を使います。先ほど,スペースの数を数えれば良いと言いましたが,スペースを数えるには,スペースありの文字数(≠単語数)から,スペースなしの文字数(≠単語数)を引けば求めることができます。文字列を数えるのはLEN関数を使い,スペースの削除はSUBSTITUTE関数を使います(上記サイト参照)。先ほどの画像の中でG2に入っているセルの文字列を使うとすると,

=(LEN(G2)-LEN(SUBSTITUTE(G2,” “,””)))

とすれば単語数がカウントできます。ここで注意が必要なのは,通常英文の単語数をカウントする場合は+1をしないといけないという点です。例えば,次のような英文を考えてみます。

He is always shy.

普通英文はピリオドで終わっていて,その後ろにはスペースはありません。よって,単語の数よりスペースの数は1少ないことになります。ですから,数えたスペースに1を足すことで,単語の数を求めることができます。しかしながら,さきほど文字列抽出したときには,ある文字列(単語)の直前までの文字列を抽出しました。指定した文字列は単語であり,英文では単語の前には必ずスペースがあります。つまり,G2に入っている文字列の”the”のうしろには実はスペースが入っています。このため,単語の数とスペースの数が一致しており,最後に+1をする必要がなくなっているというわけです。

ここまでで,target語であるparkの前にある単語の数を求めることができました。もともとの目的は,「parkはその文の中で何語目なのか」でしたから,実は結局のところ,先ほどのものに最終的には+1をすることになります。この+1は,英文中に含まれる単語の数を数えるためにするものではなく,その次の単語(1語後ろ)が全体の何語目かを知りたいから行うということには注意が必要です。

ということで,賛否両論おありかと思いますが,私はガンガン埋め込み派なので,G2というセルに一旦吐き出してから計算するのではなく,LEN関数の中に,MIDとFINDを埋め込んでしまいます。

=(LEN(MID(D2,1,FIND(F2,D2,1)-1))-LEN(SUBSTITUTE(MID(D2,1,FIND(F2,D2,1)-1),” “,””)))+1

どん。

こうすれば,あとはF列にtargetとなる単語を刺激文の数だけ入力してさえあれば,「見つける->抽出する->数える」という3つのステップを表現した上の関数を別の列に縦にコピーするだけで自動的にtarget語の出現位置を計算することができるというわけです。

この方法がわかったおかげで目を細めながら単語の数をひたすら数えるという土方作業をやらずに済みました。ただし博論完成までは程遠いです(白目

なにをゆう たむらゆう

おしまい。

 

 

 

PPPいいよっていう論文

ELT Journalから,PPPいいよっていう論文が出たようです。

Anderson, J. (2016). A potted history of PPP with the help of ELT Journal. ELT Journal. Advance Online Publication. doi: 10.1093/elt/ccw055

 今年の全国英語教育学会のシンポジウムでもPPP vs TBLTが取り上げられますよね。タイミング良いというかなんというか。読んだらまたここに追記しようと思います。

なにをゆう たむらゆう

おしまい。

アカデミックな議論をする能力を説明するのはインプット仮説?アウトプット仮説?

アカデミックな場面で,議論する力を身につけるにはどんな力が必要なのかなという話です。

私は例えばゼミでは,狭い意味で私の研究分野から外れるような発表でも,何かしらコメントしますし,それができないことは研究者としての能力がないことだと思っています。それから,発表資料を作って,わざわざ発表してくれた人に対して,何もコメントがないのは発表者に対しても失礼だと思っています。例えば1対1の状況なら,20分とか時間をかけて話をしてくれた人に対して何も言わないのって絶対あり得ませんよね。それがゼミとかになると普通にあり得てしまう。少なくとも私の参加しているゼミは「1人1回必ず質問」というようなルールはありませんから,90分間何も言わず,その場にいても居なくても同じような存在の人が大半です。例えばM1くらいだと,まだまだ知識や経験が足りないので議論についていけないということもあるかもしれせん。そんなこと言ってる間に修士なんか終わってしまうけどね,と個人的には思っていますけど。

よく聞くのは

  • どういうコメントや質問をしたらいいのかわからない
  • 自分の質問が的はずれで頓珍漢かもしれないから言えない

というものです。そこで,こういう人たち(多くは後輩,Dでゼミ中に一言も喋らない人ははっきり言ってDの院生としての自覚も足りないし資格もない)が,ゼミでの,または学会でのアカデミックな議論に参加できるようになるためには何が必要なのかなと考えました。

1つは先輩や先生のコメントから,どういうコメントや質問をすれば生産的な議論になるのかを「見て,聞いて,学ぶ」というもの。ゼミ中に出てくる質問やコメントが全て「良い」ものだとは限りませんが,ようするにインプット(肯定証拠みたいなもの)をたくさん受けるなかで学習されだろうという見方。この考え方だと,とにかくゼミに出て聞いてれば自然に学ばれることになると思います。そもそもインプットに注意向けてない(全然聞いてない)というのは論外だと思いますので,ゼミに参加する人はみなインプットをしっかり処理していることを前提としています。つまり,インプットさえあればいいというのが1つ目。

2つ目は,インプットだけでは不十分で,アウトプットの機会がなければいけないというもの。つまり,聞いているだけではダメで,なにかしらのアウトプットを行うことで,次第に能力が身についていくだろうという仮説です。アウトプットすれば,「自分の質問やコメントが的はずれか頓珍漢か」ということは検証できるはずです。もし的はずれなら,「いやそれは関係ない話です」というフィードバックを受けて(実際はもっとやんわりとした表現になるでしょうが),自分の質問が的はずれだったことを学習します。アウトプットすることで,否定証拠を手に入れる機会があり,その上でインプットによる肯定証拠もあるので,それによって内部のシステムが構築されていくと。インプットのみだと,「どんなコメントや質問はダメか」みたいなことはわかりません。もちろん,誰か別の人が頓珍漢な質問をして「それ頓珍漢」みたいなことを言われたというようなやり取りをインプットとして受ければ,否定証拠になる可能性はあります。それでも,自分の思考の過程から生み出された質問に対して受けるフィードバッとは違うのかなとも思います。

インプットだけでいいという立場をとると,インプットを浴び続ければ自然に議論に加われるようになるはずです。逆に,アウトプットが必要という立場だと,とにかくアウトプットを促すような介入が必要になってきます。さてどちらが正しいのでしょうか。個人差もあるかもしれませんね。

なにをゆう たむらゆう。

おしまい。

3単現の-(e)sは口をついて出るくらいまで練習

馬鹿じゃないのと思った。

今,とある原稿の執筆にあたって(〆切に間に合いそうになくてやばい),中学や高校の教科書のCAN-DOリスト,評価基準,年間指導計画なんかを見ている。そこで,とある教科書の(あえて名前は出さない)年間指導計画の,指導例というカラムに次のような記述があった。

3単現の-(e)sは理屈で覚えるよりも口をついて出るくらいまで文を言い,書く練習をする

まさに,「お前は何を言っているんだ」の気分である。そんな無駄なことをさせるくらいだったらもっといくらでもやること,やれることがあるだろう。これを書いた人は,自分が3単現の-sをまったく落とさない自信があるというのだろうか。3単現の-sは,超高熟達度の学習者でも習得が困難であると言われる文法項目の典型的な代表である。そして,文法的に主語をidentifyする機能はあるが,これがなくても文の理解に支障をきたすことはほとんどないと言っていい。なぜなら,英語は語順がわかれば主語が(ほとんどの場合)わかるからである。また,有生性も動作主-被動作主の関係を表すのに重要な手がかりとなる。3単現の-sが脱落していることが,意味理解を阻害することはほとんどない。過剰使用されている場合もそうだ(実は過剰使用の方が気づきやすいらしい)。

この「文を言い,書く練習をする」というのが,単なるパターンプラクティスのような物を意味していないのだとすれば,それに意味がないとは言わない。しかし,そうであったとしても,そのような活動は3単現の-sの習得を目指して行われるべきものではないだろう。誤解を恐れずに言えば,3単現の-sの習得など目指さなくても良い。それこそ,理屈を知っていて,ライティングの時などにモニタリングして直せれば良い程度のものではないか(それでも見逃すことだって私にはあるが)。3単現の-sが落ちていることにそんなに目くじら立てる必要はどこにあるのだろうかと思う。しかも,あろうことかそのどうでもいい形態素を習ったばかりの中学校1年生に対して,そんな無駄な苦行を強いるなんて言語道断である。もし本当に三単現の-sの習得を目指したいのであれば,それ以外のところにほとんど注意を向けなくとも書いたり話したりできるような訓練をした方がよっぽど良い。そういうことに時間を割いたほうが,全体としての英語力も上がるだろうし,結果的に3単現を落とすことも少なくはなるだろう(それでも母語話者レベルにはならないと思うが)。

私は英語の第二言語話者としてそれなりに機能できる自信があるし,相手の言っていることを理解したり,自分の気持ちや考えを伝えたりすることだってそれなりにはできると思っている(ただし,英語力に自信があるわけではない。語彙とかたぶん5000語くらいしかない)。英語を中学1年から勉強し始め,北米に2年間留学した私でさえ(むしろその程度だからこそ?),3単現はたまに落とす。英語教師として,正確無比な言語使用ができないことはプロとして恥じるべきだとは思うし,実際に毎週英語で授業をしながら「ヤベッ」と思うことがある。それはプロだからである。英語を教えることでお金をもらっているからである。プロを目指してもいない,英語学習を始めたばかりの中学生に(高校生や大学生だってそうだ),「口をついて出てくるまで」きっと無意味な文を言わせるなんて,そんな指導観を持っている人には絶対に教わりたくない。もちろん,そこまでして,情熱的に,なんとかして,英語を身につけさせてやりたいという熱意は素晴らしいと思う。しかしながら,圧倒的にベクトルが間違っている。その情熱はもっと別のところに注ぐべきだ。

余談だが,実はかくいう私も3単現の-sを減点したことがないかと言えば嘘になる。先日のテストのライティング問題である。語数,内容,文法・スペリングという3観点の評価方式を私はよく採用している。昨年度までは,このような形式を取る問題は1問だけで,ほかは文法の間違いは一切評価しない問題も出していた。今年は,そういう問題を出題できる環境でもないので,3観点方式のライティング問題だけを出した。そこで,私の担当しているクラスのうちの1つで,とびっきり出来の良い学生が,3単現の-sを落としたというだけで,99点を取った。私も採点しながら,本当に心苦しい気持ちになってしまった。途中まで採点していて,「これは満点だなぁ」と思っていた矢先,最後の最後のライティング問題で彼の「誤り」を見つけた時,この採点方式を取ったことを本当に後悔した。テストの他の大問も完璧で,ライティング自体もトピックに沿ってよく書けていた。そこにきて,3単現の-sがたった一箇所落ちていただけで,私は彼が満点を取ることを阻止してしまったのだ。そして,翌週テストを返却したとき,答案をみてその学生が言い放った一言を私は一生忘れることがないだろう。

「くだらねえ」

私はなにも言えなかった。そして,自分で問題を作っておきながら,私自身も「くだらねぇ」と思ってしまったのだ。大いに反省した。そして,今度の期末試験では,文法面に関しては「意味理解を阻害するかどうか」という観点で,おおまかにレベルを4段階設定し(Foster & Wigglesworth, 2016を参考にした),意味理解を阻害しない程度の誤りが少数見られる場合は,その観点では満点とすることにした。もちろん,このレベル分けや,誤りのレベルの頻度というやり方も完璧とは言えない。まず,「なにを持って意味理解を阻害しない」と考えるのかは非常に難しい問題である(もちろんいくつの誤りがあれば「少数」とするかも問題である)。意外なことに,第二言語習得研究の知見からこの観点に関して言えることはほとんどないと言っていい。「誤りの重み付け」に焦点をあてた前述のFosterらの研究が「新しい評価法考えたったー!!」と言ってAnnual Review of Applied Linguisticsの最新号に掲載されているくらいだから,本当に研究されてこなかったのだろう。博論が終わったらこういう問題に取り組みたいとは思っているが,誰か「面白そうだな」と思う方がいらっしゃったらどんどんやっていただきたい。というかむしろ誰かやってくださいという感じだ。

かなり脱線したが,3単現の-sは本当に厄介者である。というかむしろ,「数の一致 (number agreement)」という事象自体が実はかなりの厄介者なのである。結論を言うと,文法習得を専門に研究している私から言わせてもらえば

3単現の-sをなめんなよ

である。そして,文法の正確さばかりに目くじらを立てる英語教師(含む過去の自分)は全員引退した方がみんな幸せになると思う。

なにをゆう たむらゆう。

おしまい。

LMM?

Language Teaching ResearchでTaskの特集号が出ていました(裏話によると後づけで採択された論文を集めた特集号らしい)。そこで,とある論文を見たら,”linear mixed model analysis (LMM)”が使われたと書いてありました。

Focus on form through task repetition in TBLT

いわゆるLMEのことかな?と思いつつ読んでいると,固定効果とランダム効果をいれたモデルでうんぬんと書いてあるのでやっぱりそうかと。general linear modelというのは一般線形モデルなので普通の回帰分析や分散分析と同じだけれど,ランダム効果をいれたものは(general) linear mixed-effects modelと呼ばれる(ただし普通GLMMはgeneralized linear mixed-effects model)。つまりmixed effectsとつくものは変量効果をいれたもの。ちなみにgeneralized modelというのは確率分布が正規分布以外のもの。

結果のところを読んでいると,なんかF値とか報告されています。3つの2次交互作用と1つの3次交互作用がモデルに入っていると書いてあるのに交互作用項がどうなったのかとかの報告が一切ありません。そしてランダム効果の推定値も報告されていません。分析に用いたソフトウェア(RなりSPSSなりSASなり)の報告もありません。

??????????????????????????????????????

え?ていうかこれただ分散分析やっただけじゃないのか?

ちなみに,「GLM (general linear model)で分析しました」みたいなことが書いてある論文も以前みたことがあります。それって結局ただの分散分析ですよねみたいな。普通GLMはgeneralized linear modelの略です(APA第6版のp.119にもそう書いてある)。別に分散分析やったなら分散分析やったでいいからそう報告してほしいですね。なんか変にかっこつけてるのかなんなのか知らないですけど素人騙しでmixed-model使ったとかそういうの本当にやめてほしいです。ていうか査読でチェックされなかったんかいなこれっていう…

あまりLTRをdisると同じ号に載ってる先輩の論文にまで飛び火するのでこの辺にしておきましょう(※彼の論文は何も悪くありません)。

 

なにをゆう たむらゆう。

おしまい。

 

dplyrを使ってみる:long型から記述統計

今までデータをあれこれいじったり記述統計出したりするのはExcelで色々やってからRにいれて分析という流れでした。dplyr使ったら便利そう…というのはなんとなくわかっていたんですが,自分がよく扱うようなデータセットの構造に対してどうやって使えば今までやってたことが楽になるのかいまいちイメージがわかずにずっと放置していました。最近色々あってようやく基礎中の基礎だけを覚えたので以下メモ書きです。

まずはサンプルのデータを作ります

#事前・事後・遅延事後でCAFのデータを取ってるというデザイン
pre.fluency <-rnorm(50,mean=10,sd=2)
pre.accuracy<-rnorm(50,mean=7,sd=2)
pre.complexity<-rnorm(50,mean=4,sd=2)
post.fluency<-rnorm(50,mean=14,sd=4)
post.accuracy<-rnorm(50,mean=10,sd=3)
post.complexity<-rnorm(50,mean=7,sd=2)
delayed.fluency<-rnorm(50,mean=12,sd=2)
delayed.accuracy<-rnorm(50,mean=8,sd=1)
delayed.complexity<-rnorm(50,mean=6,sd=1)

#それぞれの列を横にくっつける
dat<-cbind(pre.fluency,pre.accuracy,pre.complexity,post.fluency,post.accuracy,post.complexity,delayed.fluency,delayed.accuracy,delayed.complexity)
dat<-as.data.frame(dat) #データフレーム型に変換
dat$subject<-rep(1:50) #実験参与者のID列をつける

とりあえずこんな感じでいまデータを持ってるとする

head(dat)
##   pre.fluency pre.accuracy pre.complexity post.fluency post.accuracy
## 1   11.916630     7.480500       4.644798     8.431656     13.070707
## 2   10.719751     7.090714       6.566487    13.652658     11.462576
## 3   11.980852     6.182161       5.731289    16.580042     11.287683
## 4   11.109400     7.256950       5.897070    16.966183      9.497555
## 5   10.488391     5.449349       2.673285    15.778588      9.994575
## 6    9.076144     8.621538       2.122296     9.465845      7.577611
##   post.complexity delayed.fluency delayed.accuracy delayed.complexity
## 1        8.639772       12.961946         7.740613           7.042510
## 2        6.397390        9.921947         7.520258           6.951231
## 3        6.917590       10.478401         9.378301           4.972710
## 4        5.897965        6.738074         8.983224           5.045168
## 5        6.214526       10.694636         8.510670           5.184044
## 6        7.644466        8.666421         8.863990           4.719461
##   subject
## 1       1
## 2       2
## 3       3
## 4       4
## 5       5
## 6       6

まずは縦横変換

参考までに以前tidyrの紹介を書いたブログ→変数が多い研究デザイン系の縦横変換(tidyr)

library(tidyr)
dat%>%
  gather(key=variable,value=score,-subject)%>%
    separate(col=variable,into=c('test','measure'))->dat2
head(dat2) #test, measure, scoreという列ができてるか確認
##   subject test measure     score
## 1       1  pre fluency 11.916630
## 2       2  pre fluency 10.719751
## 3       3  pre fluency 11.980852
## 4       4  pre fluency 11.109400
## 5       5  pre fluency 10.488391
## 6       6  pre fluency  9.076144

悩み

でもさーこうやってlong型にしちゃうとさー例えば事前のときの流暢さの指標の平均値とか出せないじゃん?wide型になってたら全部横にならんでるから列ごとに平均求めればいいだけじゃん?

long型になってても層ごとの記述統計出せちゃう

そう,dplyrならね

library(dplyr)
dat2%>%
    group_by(test)%>%
    group_by(measure,add=T)%>%
  summarise_each(funs(mean,sd,min,max),-subject) #summarise(mean=mean(score),sd=sd(score),min=min(score),max=max(score))でも同じ。もともとsummarise_eachは複数列に同じ関数を適用するときに威力を発揮するものだけど
## Source: local data frame [9 x 6]
## Groups: test [?]
## 
##      test    measure      mean        sd        min       max
##     (chr)      (chr)     (dbl)     (dbl)      (dbl)     (dbl)
## 1 delayed   accuracy  8.050833 1.0231177  5.5291358 10.250133
## 2 delayed complexity  6.043974 0.8633653  4.1740878  7.908483
## 3 delayed    fluency 11.966818 2.2327496  6.7231359 15.657528
## 4    post   accuracy  9.529745 2.4594148  2.7470626 16.876272
## 5    post complexity  7.211917 1.9710329  2.3591702 11.759346
## 6    post    fluency 14.624789 3.8821630  7.3521391 21.161635
## 7     pre   accuracy  6.941050 1.7114477  3.3338811 10.798454
## 8     pre complexity  4.326063 2.1271468 -0.7051241 10.391882
## 9     pre    fluency 10.239550 2.0043330  5.8044643 14.556087

※このデータの場合,test,measure,score,subjectの4つしかなく,グルーピング変数で2つ使っていて,-subjectするので必然的にscoreだけの計算になるけど,もっと列数多くて記述統計出したいのは1つだけの時は列を指定してあげる(下の例参照)


追記

  • もしも人ごとに1試行が1行になっているようなlong型の場合は,最初に人ごとにgroup_byすればOK
#こんな感じ
#dat2%>%
#  group_by(subject)%>%
#  group_by(test)%>%
#  group_by(measure,add=T)%>%
#  summarise_each(funs(mean,sd,min,max),score)
  • もし値に欠損があるときに関数が複数あるとちょっとめんどうだけど…
#こんな感じ
#dat2%>%
#  group_by(subject)%>%
#  group_by(test)%>%
#  group_by(measure,add=T)%>%
#  summarise_each(funs(mean(.,na.rm=T),sd(.,na.rm=T),min(.,na.rm=T),max(.,na.rm=T)),score)

ハッ,なに言ってるのこの人そんなのdplyrの威力をぜ~んぜんっ活かせてないんだからね!っていうのもあるかと思うのでもっと勉強したいと思いますがとりあえずtidyrからのdplyrを外国語教育研究のありそうなデータセットの形でやってみるとこんな感じになりますよというお話でした。

参考サイト

dplyrを使いこなす!基礎編

R dplyr, tidyr でのグルーピング/集約/変換処理まとめ

なにをゆう たむらゆう。

おしまい。

20160516追記

よくよく考えてみると,そもそもCAFって指標ごとに分析するからaccuracy, fluency, complexityの3列で待ってる形じゃないと分析できなくない?

そんなときはgather->separateのあとにspreadしてあげる

dat2%>%
  spread(measure,score) ->dat3 #measureごとにscoreの列を作る
head(dat3)
##   subject    test  accuracy complexity   fluency
## 1       1 delayed  7.740613   7.042510 12.961946
## 2       1    post 13.070707   8.639772  8.431656
## 3       1     pre  7.480500   4.644798 11.916630
## 4       2 delayed  7.520258   6.951231  9.921947
## 5       2    post 11.462576   6.397390 13.652658
## 6       2     pre  7.090714   6.566487 10.719751

あとは上のやり方と同じ

dat3%>%
  group_by(test)%>%
  summarise_each(funs(mean,sd,min,max),-subject)
## Source: local data frame [3 x 13]
## 
##      test accuracy_mean complexity_mean fluency_mean accuracy_sd
##     (chr)         (dbl)           (dbl)        (dbl)       (dbl)
## 1 delayed      8.050833        6.043974     11.96682    1.023118
## 2    post      9.529745        7.211917     14.62479    2.459415
## 3     pre      6.941050        4.326063     10.23955    1.711448
## Variables not shown: complexity_sd (dbl), fluency_sd (dbl), accuracy_min
##   (dbl), complexity_min (dbl), fluency_min (dbl), accuracy_max (dbl),
##   complexity_max (dbl), fluency_max (dbl)

列数が多いので表示されていないけど,出力はデータフレームなので,出力結果を何かの変数にいれてあげれば良い


ちなみに,実をいうとwide型の段階で列ごとにapplyしたほうが(ry

library(psych)
apply(dat,2,describe)
## $pre.fluency
##   vars  n  mean sd median trimmed  mad min   max range skew kurtosis   se
## 1    1 50 10.24  2  10.45   10.24 2.21 5.8 14.56  8.75    0     -0.6 0.28
## 
## $pre.accuracy
##   vars  n mean   sd median trimmed  mad  min  max range skew kurtosis   se
## 1    1 50 6.94 1.71   7.15    6.93 1.79 3.33 10.8  7.46 0.06    -0.43 0.24
## 
## $pre.complexity
##   vars  n mean   sd median trimmed  mad   min   max range skew kurtosis
## 1    1 50 4.33 2.13   4.09    4.33 2.07 -0.71 10.39  11.1 0.09     0.33
##    se
## 1 0.3
## 
## $post.fluency
##   vars  n  mean   sd median trimmed  mad  min   max range  skew kurtosis
## 1    1 50 14.62 3.88  14.78   14.67 5.19 7.35 21.16 13.81 -0.09    -1.27
##     se
## 1 0.55
## 
## $post.accuracy
##   vars  n mean   sd median trimmed  mad  min   max range skew kurtosis
## 1    1 50 9.53 2.46   9.48    9.44 2.69 2.75 16.88 14.13 0.24     0.67
##     se
## 1 0.35
## 
## $post.complexity
##   vars  n mean   sd median trimmed  mad  min   max range  skew kurtosis
## 1    1 50 7.21 1.97   6.93    7.22 2.18 2.36 11.76   9.4 -0.07    -0.31
##     se
## 1 0.28
## 
## $delayed.fluency
##   vars  n  mean   sd median trimmed  mad  min   max range  skew kurtosis
## 1    1 50 11.97 2.23  12.42   12.09 2.51 6.72 15.66  8.93 -0.42    -0.52
##     se
## 1 0.32
## 
## $delayed.accuracy
##   vars  n mean   sd median trimmed  mad  min   max range  skew kurtosis
## 1    1 50 8.05 1.02      8    8.06 1.06 5.53 10.25  4.72 -0.15     -0.2
##     se
## 1 0.14
## 
## $delayed.complexity
##   vars  n mean   sd median trimmed  mad  min  max range skew kurtosis   se
## 1    1 50 6.04 0.86   5.97    6.05 1.01 4.17 7.91  3.73 0.02    -0.65 0.12
## 
## $subject
##   vars  n mean    sd median trimmed   mad min max range skew kurtosis   se
## 1    1 50 25.5 14.58   25.5    25.5 18.53   1  50    49    0    -1.27 2.06

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の基礎がわかってなにこれめちゃ便利って感動したのでそのこともまた書きます。

なにをゆう たむらゆう。

おしまい。