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

Prolificを使うときのポイント

はじめに

Prolificというクラウドソーシングサービスを使って参加者を集めて,ウェブ上で実験に参加してもらう,ということを何回かやりました。右も左もわからずでしたが,なんとなくこういうところに気をつけたほうがいいかな,とか,こういうのが便利,みたいなのを使っているうちに気づいたところがあるのでそのメモです。オンラインでデータ収集をすることに興味がある方にも参考になれば。

基本の流れ

  1. プロジェクト(Project)を作る
  2. 実験(Study)を作る
  3. 参加者グループの設定をする
  4. お金をぶち込む
  5. 実験(Study)を公開
  6. 終了した人をチェックして報酬を支払う

以上が基本的な流れです。個人的には,「3. 参加者グループの設定をする」は「2. 実験(Study)を作る」とは別で行うのが良いと思っています。2のページ内でも参加者のスクリーニングの設定はできるのですが,それは保存ができません。よって,前にデータを取ったときと同じ設定でデータを取りたいな,と思っても,またそのページを見に行って,設定をメモして,それと同じ設定をする,ということをしなくてはいけなくなります。例えばですが,「UK在住英語母語話者」みたいな特定の集団に対して募集をかける,ということが複数予想される場合には,先にその自分が想定する参加者集団の設定を”Participants”のページで作っておけば,何度も使いまわしができます(もちろん,設定の一部を変更することはあとからできますし,グループは複数作れます)。下記画像は,私が最近英語母語話者向けのデータ収集で使った設定です。

同じ参加者から何度もデータ収集をしたい

pre-postとか,あるいは複数の実験のデータを統合したりなどといった実験デザイン上の制約で,同じ参加者に複数回の実験に参加してもらいたいという場合がありますよね(3つの実験をやってもらいたいけど,一度に参加してもらうには時間が長すぎるので複数回に分けたい場合なども含みます)。普通にデータ収集をしたら,その設定に当てはまる人の中で早い者順で埋まっていくくので,同じ人が参加してくれるとは限りません。そういうときには,2つの方法があると紹介されています。

How do I set up a longitudinal / multi-part study?

How can I invite specific participants to my study?

1つ目が,参加者のスクリーニングで,過去に特定の実験に参加して,”approveされた人のみ”を含む設定にすることです。2つ目は,時間的に先行する実験に参加した人のIDリストを使って,カスタムでそのIDリストの人たちのみが次の実験に参加できるようにするものです(”custom allowlist”)。どちらも2つ目のリンク先で説明されているのでそちらを読んでみてください。私は2つ目の方法を用いました。理由はいくつかありますが,時間的な制約で1つ目の実験が終了する前に2つ目の実験を公開したかったというのがあります。このようにすると,2つ目の実験を公開したあとに1つ目の実験に参加して終了した人は,2つ目の実験公開時点では参加者プールの中には含まれません。しかし,”custom allowlist”は,あとからそのリストにIDを追加していくことができるのです。よって,例えばですが90/100人くらいが終わった時点で2つ目の実験をその90人をリストに入れた状態で公開し,残りの10人はあとからIDを追加する,ということができます。

この方法は,とくに2回目->3回目以降で力を発揮します。というのも,1回目のデータ収集は,母語話者にしろ第二言語学習者にしろ,設定した集団があまりにも特殊すぎなければ,かなりの人数が対象になるので,割とすんなりと枠が埋まります。一方で,2回目から3回目は,1回目に参加した人が対象になります。その人達が必ず2回目,3回目とすべての実験に参加してくれるとは限りませんので,枠が埋まるスピードがかなり遅いです。時間的に先行する実験枠がすべて埋まってから次の実験を公開する,とやるよりも,ある程度の人数が参加してくれたら次を公開する,というように流していくのがベターだと思いました。

以前の実験に参加した人を除外する

前節のパターンと逆で,同じような実験だから過去に自分の実験に参加したことがある人には募集がいかないようにしたいケースです。これは,前節とまったく逆のパターンをすればよいです。スクリーニング設定で”Participation on Prolific”というカテゴリがあり,そこに”Exclude participants from other studies”というサブカテゴリがあるので,それでどの実験に参加している人を除外するかを選択することができます。もちろん,custom allowlistと同じ要領で,”custom blocklist”というのもあるので,任意のIDを参加不可能にすることもできます。

Attention Check

ちゃんとやっているかを確認する手段を用意して,それに基づいてリジェクトしないといけません。なんかちゃんとやってなさそう,くらいだと根拠としては弱いです。Prolificでは,下記のような基準を出しています。

  • They should check whether a participant has paid attention to the question, not so much to the instructions above it
  • Questions must not assume prior knowledge
  • Participants must be explicitly instructed to complete a task in a certain way (e.g. ‘click ‘Strongly disagree’ for this question’), rather than leaving room for mis-interpretation (e.g. ‘Prolific is a clothing brand. Do you agree?’)
  • They must be easy to read (i.e., should not use small font, or have reduced visibility)
  • They cannot rely on memory recall
  • If your study is 5 minutes or longer, then participants must fail at least two checks to be rejected, any shorter studies can use a single failed check to reject
詳しくはこちら->https://researcher-help.prolific.com/hc/en-gb/articles/360009223553-Prolific-s-Attention-and-Comprehension-Check-Policy#h_01FS4DYYVP24GDYK7D0A8PSYF8

上の引用している基準が掲載されているページには,どういうのがいいIMC(Instructional Manipulation Checks)の例でどういうのが良くない例なのか,というのも載ってます。

個人的なポイントは一番目と最後のブレットポイントかなと思います。どのように質問に答えるのか,という指示よりも質問それ自体に注意を払っているのかをチェックすることというのが一番目ですね。最後のやつは,5分以上かかるなら2つIMCを用意しないと,リジェクトできない(参加者に報酬を払うことを拒否できない)ということになります。

報酬について

すべてポンド換算で,小数点第二位まで指定できます(e.g., 4.51, 6.89)。だいたいどのくらいの時間がかかるかを見積もって,その時間に対していくら,という設定をします。例えば実験が30分だとすると,

  • £3.8 – £4.4(7.60 – 8.80/hr) -> Fair
  • £4.5 – £5.2(9.00 – 10.40/hr)-> Good
  • £5.3 – £5.9(10.60 – 11.80/hr)-> Great
  • £6.0 – (12.00/hr)-> 最高

みたいな感じになっているようです。これは参加者に支払う金額です。これ以外にも,Service feeが約3割かかります。例えば,50人に対して£6の報酬を設定すると,報酬が£300,Service feeが£100です。

実験を行うプラットフォーム

普通のアンケート調査のようなものであれば,Googleフォーム等のURLを使えば問題ないでしょう。私はGorilla Experiment Builderを使ったのと,jsPsychで作ったプログラムをGoogleのFirebaseと連携させてデータ収集をしました。前者のGorillaはGUIが基本で,それでも結構複雑な実験を作ることができますし,実験プログラムを作ってそのデータを保存するところもすべてシステム上でできるので,安心感もありますね。もちろん,利用するためにお金はかかるのですが(こちらの料金設定等はちょっと自分では払ってないのでわからないです)。

後者のjsPsychとFirebaseの連携は,実質無料です。Firebaseで有料枠にいくのはかなりの量のデータを短期間に動かさないといけないと思うので,私が利用する分には特に有料にしないといけないということにはなりませんでした。使い方等はウェブ上に日本語で書かれたものも含めてかなりリソースがあるので,それを参考にしました。ただ,ChatGPTやCopilotに手伝ってもらえるとはいえ自分でコードを書いたり,データベースの設定をしたり,と自分でやる部分がかなり多いので,少しハードルは高いかもしれません。私も結局数年間ずっと取り組もうと思って挫折をしまくり,この春休みで鬼のように取り組んでようやく自分がやりたいと思う実験(プライミング付き語彙性判断課題,自己ペース読み課題,語数判断課題)についてはプログラムを書いて保存してという基本的なところはできるようになりました。もちろん,細かいところは改善の余地があるのですが,まあ実際にプログラムが動いて,そのデータが保存される,という根本的なところはなんとか,という感じですね。たぶんいつかウェブにソース公開すると思います。

データベースに保存がうまくできているのかとか,プログラムが上手く動いているのかといった確認が必要なのは,GorillaでもjsPsych×Firebaseのどちらのやり方でも一緒ですね。いずれの方法でも

  1. ProlificのIDを何らかの形で取得
  2. “Completion Code”(これはProlificのStudyページで自動生成されます)を実験の最後に提示されるようにして,それをProlific上で提出させる

という2つによって,実験に参加したことが確認されるようになっています。

おわりに

この記事では,Prolificで参加者を集めてオンラインでデータ収集をする,という話について書きました。後半の実験を行う2つのプラットフォームの話やProlificを実際に使ってみてのあれこれのエピソードなんかはまた別の記事にしたいと思います。

もし,これってどうなんだろう?と気になったことがあれば,下記のリンク先から質問していただければ,私が答えられることであればお答えします。

https://querie.me/user/tam07pb915

なにをゆう たむらゆう。

おしまい。

採択率の低い学会誌

はじめに

ある特定の学会誌の話をします。学会の中でどんな議論がされているのかは全く知りません。

学会誌はなんのために?

学会誌って,学会員の成果を発表する場ですよね。たくさん投稿してもらって,その中から選ぶプロセスが多少あったとしても,1本しか載らないような学会誌に私は投稿しようとすら思いません。また,存在意義もわかりません。

そんな低い採択率突破したところで,語弊を恐れずに言えば「たかが」学会誌です。著者の知り合い以外に大して読まれもしないでしょうし,ごく少数の論文を除いては誰にも引用されない可能性だってありうるのではないでしょうか。

そうであるならば,それなりに通りやすい国際誌に出した方が,そもそも届けられる読者の数が段違いですし,国際誌に載った,という「箔」もつきます。そういう状況ならそっちに出すでしょう。そういうひっくり返しようのないヒエラルキーを認めたら学会誌として価値がなくなってしまうんでしょうか。私はそうは思いません。学会は発表してもらって,論文投稿してもらってなんぼでしょう。

論文の質=著者の評価

「ヤバい」論文を載せたら学会誌の評価が下がるとか,学会の評判が悪くなる,とかそうした考えがあるのかもしれません。それが全くわからないわけではないし,何でもかんでも載せていいとは思いません。

ただ,論文の質が低かったらそれは著者の責任でしょうし,論文の評価は著者の評価に最も直結するのではないでしょうか。質の悪い論文があったら,いの一番に著者が批判にさらされるべきでしょう。そういう議論だって表立って行われれば健全な学術コミュニティのあるべき姿とも言えるはずです。

少なくとも今の段階では,多くの国際誌のように,インパクトファクターがついていて,どれだけ引用されるかといった指標で評価されたりランキングされたりするわけではないわけです。

どういう査読してるのだろう

自分自身が国際誌の査読をしてても,結果としてリジェクトになる率の方が多いです。そういう現実があっても,論文の質(研究の質)を引き上げる役目も査読のプロセスの中にはあるはずでしょうし,学会誌を出している学会にはそうした役割もあるはずです。

いい研究がどんなものか,という評価はある程度さまざまな観点があると思います。それ自体が悪いとはと思いません。でも,どちらかというと査読って,これはダメだよね、というのを弾いて(またはそこを修正してもらって)あとはどんどん載せればいいのではないでしょうか。もしも,これがいい研究なんだ,というのを対外的に示したいのであれば、その中から論文賞のようなものを選べばいいでしょう。

上で貼ったX(旧Twitter)で話題になった学会誌の査読委員や編集委員が論文書いていないとか論文指導していないってことはないような気もしますが(知らんけど),こういう意見もあります↓

学会をこの先どうしたい?

今後,学会がしぼんでいって終いにはたたむ予定,というのなら,今の方針でも全く問題ないと思います。ただし,「若い人が減っている」みたいなことを嘆くようなら,やってることちゃんちゃらおかしいと思います。

昔の名残りなのか驕りなのかわかりませんけど,時代が変わっていることを認識して学会のあり方みたいなのも変えていかないと,ただでさえ存続が難しい学会が多いのに小規模学会はもっと厳しくなること間違いないと思います。

おわりに

学会誌の査読って(というより査読システム全般って),そろそろ見直す時期に気ていると思います。こういう意見もあります↓

シンポジウム面白そうなんですけど,登壇者を誰にするか,っていうのは結構難しい問題だよな〜というのは具体的な企画をイメージして思いました。

なにをゆう たむらゆう。

おしまい。

LME/GLMMで変量効果の相関を外すときのアレコレ

はじめに

線形混合モデル(LME)・一般化線形混合モデル(GLMM)で,変量効果をデザイン上で最も複雑なものにする最大モデルを作って,それでだめなら切片と傾きの間の相関パラメータを除いたモデルにトライする,という提案(Bates et al., 2015)をやろうとするとき,相関を除くのは”||”(double-bar syntax)なんですが,単に”|”を”||”に変えるだけじゃうまくいかないのどうすんだろうなと思っていたら解決策が見つかったぽいというお話です。

ちなみに,この方法はdata-drivenで探索的な側面があり,best practiceというわけではありません。

問題とは

具体的なコードとかは参考のところにも挙げたReduction of Complexity of Linear Mixed Models with Double-Bar Syntaxを見てください。

要するに,

m1 <- lmer (res ~ factorA + factorB + (1+factorA | ID), data =dat)

みたいになってるとして,factorAが因子型だとするじゃないですか。そのときに,「相関を外そう」ということで

m2 <- lmer (res ~ factorA + factorB + (1+factorA || ID), data =dat)

としてもうまくいかないよ,というお話です。これ,私もなんかうまくいかないなと思っていたんですが,解決策わからないので放置してました。「うまくいかない」というのはどういうことかというと,ただ単に”|”を”||”で置き換えるだけだと,切片とfactorAの第一水準(どういうコーディングしたかにもよりますけど)との相関パラメータは排除されるけれども,第一水準と第二水準の相関パラメータは残っちゃいますってことなんですね。でも,本当は全部の相関パラメータをなくしたいわけですね。

解決策

単純で,相関ありでfitさせたモデルの入った変数から,model.matrix()関数を使って変数名を直に取ってくる,ということです。m1という変数に相関ありのモデルが入ってるとすると,

model.matrix(m1)

とやってみます。そうすると,モデルの中に入ってる変数の列がガーッと出てきます。その中で,自分が使いたい列名をモデル式にいれる,ということですね。例えば,factorAが事前,事後,遅延テストという3つの水準からなっているとすると,

pre_post <- model.matrix(m1)[,2] #列番号は適当です
pre_del <- model.matrix(m1)[,3] #列番号は適当です

みたいな感じで一旦変数に代入した上で,

m2 <- lmer (res ~ factorA + factorB + (1+ pre_post + pre_del || ID), data =dat)

のようにさきほど代入した変数を使うと,”||”の指定によって相関パラメータがすべて除外されたモデルが作れるよ,ということのようです。

おわりに

詳しくは下記の参考記事を御覧ください。lme4長いこと使ってますが,知らないことまだまだありますね…。

なにをゆう たむらゆう。

おしまい。

参考記事

The Correlation Parameter in the Random Effects of Mixed Effects Models

Reduction of Complexity of Linear Mixed Models with Double-Bar Syntax

2023年度LET関西支部秋季大会を終えて

はじめに

11月4日(土)に開催された2023年度外国語教育メディア学会(LET)関西支部秋季大会のシンポジウムに登壇したので,その雑感みたいなものを忘れないうちに(その日の夜はほぼ記憶を失いましたが)メモしておきたいと思います。私の資料はウェブに公開しているので,下記から御覧ください。

この資料の中のメインの話は以下の2つの書籍を読めばほとんど書いてあることなので,詳しい話はそちらをお読みください。

特に,私の話は結構端折っているので,本を読んでいただかないとつながりとかも分かりにくくなっていしまっていると今になって反省しています。

第二言語研究の思考法: 認知システムの研究には何が必要か

英語教育のエビデンス: これからの英語教育研究のために

ちなみに,下の本についてるAmazonのレビューは全く参考にならないので,レビューでこき下ろされているからといって買うのを躊躇しないでください(このブログ記事を読む人が私のこの記事の内容とAmazonのレビューで後者を参考にするとは思いたくないですけど)。

全体をざっくり

司会の浦野先生をはじめ,南先生,私と,3人とも言いたいことが結構あったなと思いましたし,それぞれに違うポイントを強調されていたのが(当然ですが)よかったなと思いました。浦野先生は,司会だから抑えめにされていたと思いますが,学会誌の投稿基準の話や追試,外的妥当性・内的妥当性の話など,外国語教育研究の大きなところの中で重要なところをピンポイントに指摘されていた印象です。南先生はとにかく実践研究を広めたい,もっと多くの人に実践研究に取り組んでもらうことで実践も研究も状況が良くなるという信念があるように感じました。

機材のトラブル等があって最後のディスカッションの時間が短くなってしまったことや,オンラインで参加された方に議論を届けられなかったことが非常に残念でした。あと何より私が残念だなと思ったのは,登壇者の南先生がマイクを持って質問者のところに行っていたことです。あれ,南先生がいい人だから自然と身体が動いてそうなりましたし,私も最初マイクを持って走り出そうとして南先生とぶつかりそうになったのですが,あの場にいた実行委員(運営委員を含めても良い)の中の誰もがその役割(シンポジウムを回す役割)を積極的に担おうとしなかったことは,端的に言って登壇者に失礼だったと思います。参加者としてあの場にいたから意識が向かなかったのかもしれませんが,さすがにシンポジウムの登壇者がやることではなかったと思います。そのこともあってか,南先生が議論になかなか加われていませんでした。私も登壇者だったのでなかなか南先生の代わりに誰かとその場で声をあげるほどの頭の余裕がその時はなくて何もできなかったのですが,後から冷静に振り返るととても心苦しかったです(途中から誰かが変わっていたかもしれませんが,記憶がそこはありません)。

フロアとのディスカッションで出た質問

私が覚えている限りの質問について,書いてまとめます。質問された方で私のまとめ方が異なるようでしたらご指摘ください。

実践研究と理論研究が相似系であること

私は探求の論理学の例で,アブダクションによる仮説形成と演繹的推論を用いた予測,そして実験から一般化するというプロセスを提示しましたが,そのプロセス自体は実践研究でも同じことなのではないかということでした(その前にも色々な話があったと思いますが)。それはそういうところもあるかなと思いましたが,アブダクションによる仮説形成時に理論的構成概念を扱うことを重視するという点は理論と実践の違いと言えるかもしれないと思いました。実践の時には構成概念の実在はそこまで重要視されないかなと思うので。

オルタナティブ・アプローチについて(※注)

SLAの話の中にいわゆる認知的「ではない」アプローチをとる研究が一切出てこなかったのですが,というコメントが有りました。私が認知的アプローチを取る研究者を代表して今回登壇したということを浦野先生が補足してくださいました。私がまず答えたのは,社会文化理論なり複雑系理論なり,Atkinson (2011)に収録されているような「オルタナティブ・アプローチ」で言われているように,認知的アプローチでは第二言語習得はわからないのだ,大事なものを捨象しているのだ,というようなものがもし仮に真であったとしても,そのアプローチを取る人たちが,認知的メカニズムを一切仮定しない第二言語習得理論を作ることはできないし,学習者の外側の要因がどれだけ重要であったとしても何からの認知的メカニズムを考えずに第二言語習得を研究することはできないというものです。あらゆる要因をすべて考慮して,全部を包括的に説明することを目指そうとというのは個人的には失敗だと思っています。let all the flowers bloomでは無理だったということを,少なくともメカニズムの探求をするのであればそれを認めた上で(まあ最初からそう思っていた人が多いと思いますが),説明する対象を限定した上でメカニズムの探求をする必要があるだろうというのが「思考法本」の中で書いてあることでもあります。

事例研究の積み重ねの重要性

医学の分野では,厳密なRCT実験ではない事例研究も全く意味がないわけではなく,それはそれで価値のあるものだと認識されているので,事例研究も…というような意見がありました。事例研究の話はこれまた寺沢さんのブログで言及されている話があるので(EBEE本の寺沢さんの5章の最後にも事例研究の話があったと思います),そちらをお読みいただくと良いと思います。

寺沢さんの話は,何を事例として取り上げるのかという選択が非常に重要で,その事例が何らかの形で理論構築なり他者なりに貢献できるような事例でなくては事例研究としての価値が低いということだと理解しています。私はそれ以外にもう一つ医療系と教育系で違う点があると思っています(これは懇親会で亘理先生とも話したことですが)。それは,介入の手順や測定の厳密性や標準化度合いです(これもEBEE本の中でPKテストが扱われる8章で述べられている話でもあります)。医療では,おそらく何らかの介入を行う際に,その手順が厳密に規定されていて,その効果を測る手段も標準化されていると思います。よって,そこのブレがない分だけ事例の共有が容易でしょう。しかしながら,言語教育において何かしらの介入指導の手順がどのくらい厳密に規定されていて,それがどれくらい標準的なものとして共有されているかというと,そこが難しいと思います。「ディクテーション」とか「英作文」とかそういうざっくりしたものは当然のこと,「間違い探しタスク」や「他己紹介」のように多くの人が内容を容易に思い浮かべることができる活動であったとしても,それをどう実施するかには多くの選択肢やバリエーションが存在しています。そして,そのバリエーションが有ることは何ら悪いことではないというか,文脈に即した活動にするためにそのバリエーションが有効に機能します。効果の測定についても,パフォーマンスで評価するにしても正確さ,流暢さ,複雑さを使って言語使用を仮に測定できたとしても,無数の指標からどれを選択するのかについて,合意形成はなされていませんし,あるタスクに固有の標準化されたルーブリックのようなものもないでしょう。これでは,仮に事例研究が多く行われていったとしてもそれを解釈するのは難しいように思います。

ただし,何をやったらどうなったのか,についての主観的な記述を蓄積していくことには意味があると思います。ある実践を行ったとき,その手順についての詳細な記述とそれを実施した教師がどういう主観的な見方をしたのか(うまくいったのか,うまくいかなかったのか),なぜそういう見方をしたのか,というようなものが蓄積されていけば,それはあとから参照する価値の高い資料になると思います。上の寺沢さんのブログでは量的な事例研究もあるので質的なものだけが事例研究だけではないと書いてあって,そこはとても大事な指摘です。量的な事例研究もありますが,教育系で理論に貢献しうる事例研究って結構難しそうだなと個人的には思っています。

おわりに

今回のシンポジウムに登壇することで,自分の考え方もより整理されたなと思います。ただ,発表自体はまだまだで,もっと伝え方を工夫しないとなかなか理解されないということも痛感しました。これは私の力不足です。意見論文をある程度の国際誌に載せるのが簡単じゃないのはよくわかっているのですが,そういうことしないと結局何も変わらないので,たくさんの人と議論を重ねながら,学界がいい方向に進んでいくといいなと思います。

なにをゆう たむらゆう。

おしまい。

注(2023年11月8日追記)

オルタナティブ・アプローチの話のところで,質問いただいた方からTwitterで補足・訂正をいただいたので追記します(直接メールももらいました)。

まず,私が質問を理解できていなかったことが原因で噛み合ったやりとりにならなかったこと,お詫び申し上げます。多分聞いてるときにバイアスがめちゃくちゃかかってしまっていたのだと思います。申し訳ございません。

さて,英語教育研究の中にオルタナティブ・アプローチがどう位置づけられるのかという話ですが,オルタナティブ・アプローチが今後何を目指していくのかによるのかなと思いました。認知的メカニズム以外の部分の言語習得のメカニズム的説明を目的としてやっていくのであれば,それはそれで意味があると思うので,やっていったらいいのではと思います。ただし,メカニズム的説明をやるのであれば,私が扱った批判というのはいわゆるオルタナティブ・アプローチの研究にも当てはまることだと思っています。

英語教育研究の中にどう位置づけられるのか,という話だと,「socialな側面を研究するスタディ」がどれだけ英語教育研究の「中で」やられているのかっていうと,ほとんどやられていないのではと個人的には思っています。英語教育学会に入っている人が,そういうところに興味があるのかっていうのもどうなんだろうなと個人的には思っています。だから意味がないということではなくて,だからこそ位置づけるって難しいなと言う話です。合意形成を得るのが難しそうなので。浦野先生が下記のツイート内で補足してくださっているように,”broad SLA research”と考えるとそこにはsocial SLAも入ってくるでしょうね。じゃあその”broad SLA research”と英語教育研究(外国語教育研究)がピッタリ重なるのかっていうとなんかそういう感じはしないな〜と個人的には思います。というのが私の個人的な理解ですね。

また,オルタナティブ・アプローチがメカニズム的説明を求めるのであれば,私の資料でいうと11枚目の浦野先生の作ったスペクトラムの中に英語教育研究を位置づけたものの中には入らないと思います。オルタナティブ・アプローチであったとしても,メカニズム的説明を求めるのであればそれは政策科学ではないからです。もしもオルタナティブ・アプローチがそうではなく意思決定の科学を目指すのであれば,あのスペクトラムの中の真ん中より右側に位置づけられるのかもしれません。

[宣伝] 言語テスト学会(JLTA)第26回全国研究大会でワークショップをやります

はじめに

言語テスト学会の第26回(2023年度)全国研究大会(9/9-10 @ 東北大学)で下記のタイトルでワークショップをやります(私のWSは10日午前です)。

Rを用いた一般化線形混合モデル(GLMM)の分析手法を身につける:言語研究分野の事例をもとに

過去の資料について

資料を準備している中で,私自身が最初にLME関係でウェブに上げた資料がslideshareにあり,それが有料版でないとダウンロードできないことに気づきました。そこで,その資料をそのままspeakerdeckにもアップロードしました。

2014年の資料なのでもう9年前になり,かなり古いですが,全く知らない人にとってはわかりやすいのかなと思います。

その後,2016年には下記のテクニカルレポートを書きました。

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

Rでロジスティック回帰をやる方法についてコードとともに解説したものです。このレポートをベースにしたワークショップも2019年に行いました。

田村祐(2019) 「統計ワークショップ」JACET英語語彙・英語辞書・リーディング研究会合同研究会. 早稲田大学. (2019年3月9日)[資料]

そして,2021年にはこれまでに書いたり話したりしたものよりももう少し違う視点からの講演も行いました。

今回の内容

今回のワークショップは,2019年にやったロジスティック回帰がメインですが,もう少し「泥臭く」,実際に出版された次の論文のデータを使って,下処理のところからモデリングのところまでをやる予定です。

Terai, M., Fukuta, J., & Tamura, Y. (2023). Learnability of L2 collocations and L1 influence on L2 collocational representations of Japanese learners of English. International Review of Applied Linguistics in Language Teachinghttps://doi.org/10.1515/iral-2022-0234 

この論文のデータはOSFで公開されているものですので,どなたでもアクセスできます。

Terai, M., Fukuta, J., & Tamura, Y. (2023, June 7). Learnability of L2 Collocations and L1 Influence on L2 Collocational Representations of Japanese Learners of English. https://doi.org/10.17605/OSF.IO/ZQE56

この研究の分析ではカテゴリカル変数は使っていないのですが,カテゴリカル変数も扱いたいなと思ったので,データは Terai et al. (2023)ですが,論文中に行っている分析とは異なる分析をする予定です。

当日使用する資料は下記のページにまとめています(当日ギリギリまで投影資料は微修正すると思います)。

https://github.com/tam07pb915/JLTA_2023_WS

投影資料を直接ウェブでご覧になりたい方は,下記のURLで投影資料をご覧いただけます。

https://tam07pb915.github.io/JLTA_2023_WS/

一応前半は理論編,後半は実践編となっていて,Rのコードをアウトプットに文章の解説を入れています。ごちゃごちゃして見にくいかもしれませんがご容赦ください。

今回のWSは3時間ですが,たぶんそれだけでは消化不良になると思うので,私が過去に公開している他の資料と合わせて読んでいただくと良いのではと思います。

おわりに

統計関係の話は専門家ではないのですが定期的にお声がけいただき,そのたびに勉強し(なおし)ているような気がします。

仙台までお越しになれないという方も,学会ウェブサイトにて動画が後日公開されるようですので,そちらをご覧いただければと思います。また動画が公開されましたらこのブログ記事にも追記します。

なにをゆう たむらゆう。

おしまい。

追記(2023年9月13日)

動画が公開されたようです。前後半に分かれています。

基礎研論集2015の論文に修正を加えました

むかしむかし,D2のときに,下記のテクニカルレポートを出しました。

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

外国語教育研究って,二値データを扱うことが結構多いのにそれを全部割合だったりに変換して線形モデル使ってるけど,ロジスティック回帰したほうがよくないですか?という話を,Rのコードとサンプルデータとともに分析の流れを紹介したものです。

当時はまだまだコードとデータを共有するというのが一般的ではなく,researchmapの「資料公開」という場所にデータとコードを置いて,そのリンクをbit.lyをかませて論文中の附録としてつけて,読者が実際にコードを走らせながら分析を学べるようにしていました。とはいっても,私は統計の専門家ではないので,当時自分が学んだことをまとめたかったことと,分析の相談を受けた際に「これ読めばできます」と言って済ませたかったのでした。

最近,知り合いから,リンクが死んでるんだけど,どっかに移した?みたいな連絡を受けて,そんなはずはないけどなと思って確かめてみると,確かに論文中のリンクからはアクセスできなくなってしまいました。おそらくですが,researchmapの仕様変更でURLが変わってしまったためかと思われます。それはちょっとまずいなと思い,コードとデータをOSFに移行し,そちらのリンクを論文中に貼り付けたものを訂正版として,編集委員長にお願いして訂正版のPDFを公開してもらいました(bit.lyのリンク修正は有料でないとできなかったので断念。またOSFのほうが利便性高そうなので)。一応もとのPDFにもアクセス可能です。編集委員長様,迅速な対応ありがとうございました。

7年も前のコードで(D2が7年前という衝撃),当時学びたてだったdplyrなんかは今と書き方が異なる部分も多いので,おそらく今の環境では動かなくなってしまっているコードも結構あるのではと思いますが,それも全部書き直すだけの余裕はちょっとなかったので,それはしていません。ただ,読み直していたら表番号の参照がずれているのに気づき,それは直した上で後ろに正誤表をつけました。

何年ぶりかにファイルを開いたら,Word上での見た目がなぜか公開されているPDFファイルの見た目と異なり,ページの設定は同じはずなのに行送りが微妙にずれていたりして若干もとの論文とページ数が異なる箇所がありますが,内容は変わっていません。researchmapを見ると,コードは300件以上,論文中のサンプルスタディ1は600件以上のダウンロードがあり(この差はなんで?),LET中部のサイト上にある論文PDF自体も400件近くダウンロードされています。

おそらくですが,附録のリンクが機能せず,「なんやねん!しばくぞボケ!」ってなった方も100人くらいはいらっしゃるのではないかと思います。申し訳ありません。データとコードは私のresearchmapの「資料公開」にあります。また,OSFは以下のURLです(余談ですが,researchmapはURLに日本語が含まれているのでそれまじでやめてほしい)。

https://doi.org/10.17605/OSF.IO/2FS9B

別に引用はされないですけれども(そもそもこの論文が引用されていても通知も来ないしわからないと思います),今でも閲覧しようと思う人(まあ知り合いなんですが)がいるというのは,あのとき頑張ってよかったなぁとなんとなく思います。時間があったからできたことではあるのですけれど。

最近はRT(not retweet but reaction time)使う分析しかしていないので,ロジスティック回帰はやっていませんが(…とまで書いて,共著でロジスティック回帰使っている研究が先日リジェクトされたことを思い出したんですが),この論文のRコードのアップデートはなかなか難しそうなので,ロジスティック回帰やってる論文が出たらそのときはおそらくRのコードとデータも当然公開すると思いますので,そちらでご勘弁ください。

余談

LET中部支部は新しいウェブサイト(https://letchubu.org/)が動いているので,いずれ今の基礎研論集のページのURLも変わったりするのかなと思いつつ,これ全部移行するの業務委託とかじゃなく誰かがやるのだとしたら100万くらいもらっていいのではと思ったり(LET関西支部もウェブサイト再構築検討中ですが委託です)。

なにをゆう たむらゆう。

おしまい。

最近出た論文

2022年度にいくつか論文が出たので,ちょっとした宣伝です。

International Review of Applied Linguistics in Language Teachingの論文

この論文は最近といっても実際には春頃に出版されたものです。 概要は自分のウェブサイトに書いたのでそちらを引用します。

L2英語学習者が英語母語話者のように効率性を重視した数の一致処理を行っているかどうかについてを検討した論文で,Tamura et al. (2021)の追研究の位置づけです。Tamura et al. (2021)では,L2英語学習者は母語話者と違って,there | is/are | a | cat | and | とandを読んだ際に,複数一致の文(e.g., there are a cat and….)の読みが早くなる傾向が見られることを明らかにしました。そして,それは”A and B”のような等位接続名詞句は常に複数であるという明示的な知識の影響である可能性を指摘しました。今回は1つ目の実験で,there is/are |a cat and a dog| behind the sofa.のようにフレーズ単位での自己ペース読み課題を行い,単語単位の呈示ではなくフレーズ全体として等位接続名詞句をどう処理しているかを調査しました。結果として,やはりL2学習者は複数の読みが早くなることが明らかになり,there構文内の等位接続詞を複数として処理していることがわかりました。2つ目の実験ではTamura et al. (2021)同様に再度単語単位呈示での自己ペース読み課題を行いました。Tamura et al. (2021)では呈示順の影響が考慮されていなかったためです。例えば,andの後ろも名詞句が後続するとは限りません(e.g., there is a pen and it is broken)し,理論的にも,数の一致を再解釈する可能性があるとすれば2つ目の名詞句を処理した際であると仮定されています。したがって,Tamura et al. (2021)でandの時点で複数の読みが早くなった原因は,実験中にthere構文内に等位接続名詞句が生起する刺激文に晒されたことで複数一致の読みを予測するようになったからかもしれないからです。2つ目の実験の結果,there | is/are | a | catの段階では複数一致で遅れがみられ,直近の一致は単数で行う効率優先の処理が行われている可能性が示唆されました。ところが,この影響は実験が進むにつれて薄れていき,逆に実験が進むにつれて2つ目の名詞の領域で複数読み条件の読解時間が早くなる傾向があることが明らかになりました。これらの結果から,直近の動詞と名詞で数の一致を完結させる効率駆動型処理はL2英語学習者にも利用可能であることが示唆されました。しかしながら,2つ目の名詞句で一致を再解釈し直す現象はL2英語学習者に特有の現象であり,この原因として実験中に等位接続名詞句が埋め込まれたthere構文のインプットを受けることによって学習者の持つ等位接続名詞句は常に複数であるという明示的な知識が活性化され,それが言語処理に影響している可能性を指摘しました。

https://tamurayu.wordpress.com/2022/04/05/tamura-et-al-2022/

この論文は,もともと明示的知識・暗示的知識の枠組みで行っていた研究でしたが,研究を進めていくにしたがってそのフレームワークを使うよりも,第二言語の文処理研究として論文にするほうが話がスッキリすると考え直し,ほぼすべて書き直しました。第一言語話者と異なり,第二言語話者が持つ知識が文処理中にユニークな形で用いられているのではないかということを示唆したというところが面白いポイントかなと思っています。

オープンアクセスにはなっていませんが,著者原稿は上記の概要のページからダウンロードできますのでご興味がおありのかたはどうぞ。また,英語ですが,論文をできるだけ専門用語を使わずに説明したOASIS Summaryがありますので,そちらもお読みいただければと思います。

Journal of Psycholinguistic Researchの論文

この論文はつい最近出た論文で,私の博士論文研究の後続研究的な位置づけです(その博士論文の実験の研究はまだ査読中で,こっちが先に出ることになってしまったのですが…)。

関西大学に着任して,若手研究者育成研究費という学内研究費をいただいたので,それで行った研究です。関西大学に来てから始めたもので,また単著は久しぶりでした。内容としては,名詞の有生性階層というものを参照し,日本語と英語で名詞の複数形の許容される部分が異なるという点に着目してその複数形の習得について調査した研究です。

日本語には「たち」や「ら」といった複数形の標識がありますが,これらは主に有生名詞に付与するという特徴があり,無生名詞につく例はあまり多くありません(実際に日本語のコーパスを見てみると用例がないわけではありませんが非常に限定的です)。一方で,英語は有生名詞でも無生名詞でも複数形形態素が付与します。そこで,無生名詞の複数形の処理は有生名詞の複数形の処理よりも難しいのではないかという予測を立てました。この予測は,私の博士論文研究の結果の考察に一部依拠しています。

この研究で行った実験は,第二言語習得研究ではほとんど用いられていない特殊なものでした。参加者は,画面に表示された単語が1語が2語かをすばやく判断することが求められるというものです。母語話者を対象とした先行研究では複数形名詞を1語と判断するほうが,単数形名詞を1語と判断するよりも遅れることが明らかになっています。これは,複数形に付与される意味が1語という語数の判断に干渉するためだという解釈です。いわゆるストループ効果です。伝統的なストループ課題では,参加者は書かれている文字の色を答えるように指示されます。実験では,色を表す文字がその文字が示す色と異なる色で提示されたりします。

,のような感じですね。このように提示されると,のように,文字の色と文字が表す色が一致している場合よりも反応が遅れたり,あるいは判断を間違えてしまったりするというのがストループ効果の代表例です。これを数に応用したのが語数判断課題ということになります。

結果はどうだったかというと,有生名詞でも無生名詞でも複数形の判断は単数形の判断よりも遅れるという結果になりました。つまり,有生性は関係なかったということです(ズッコケ)。ちなみに,有生性の影響が見られなかったことについては,上述のように日本語でも無生名詞に複数形を表す「たち」や「ら」などが用いられるケースがあることに言及しています。

ただし,それはつまり複数形名詞が持つ意味を,言語処理中に第二言語学習者が用いている可能性が高いということでもありますので,少なくとも複数形の形態素を無視して単数形と同じように処理しているという可能性はないだろうということは言えるかなと思っています。数の一致処理は第二言語学習者にとって難しいとされていますが,その原因が複数形形態素の処理である可能性が低いのではないかということも論文の中では議論しています。ただし,今回の実験参加者に対して数の一致処理が求められる課題は行っていませんので,あくまで推測です。

ちょっとした裏話

実は,このJournal of Psycholinguistic Researchに載った論文は,国内の学会紀要で不採択となったものです。国内の査読のほうが厳しいのだなと勉強になりました。院生時代に,「落ちたら国際誌」というブログ記事を書いたことがあり,まさか自分がそういうことをする日がくるとは当時は思っていませんでした。普通,まずはチャレンジとして国際誌に論文を投稿し,不採択であったら,国際誌よりも通りやすいであろうとおそらく多くの人が思うであろう国内の学会紀要に出すと思います。その逆(国内落ちたら国際誌)は私の敬愛する福田パイセンくらいしか例を知りません(経験者の方いたらQuerie.meで教えて下さい)。ちなみに,私がブログ記事を書くきっかけになったのはある後輩の発言なのですが,その時は普通に国内誌に通ったので結果として「落ちたら国際誌」にはなりませんでした。

査読で不採択となるというのはそれ相応の理由があり,今回のケースも通らなかったことについては自分自身でも納得しています。査読のプロセスでいただいたコメントを元に加筆した部分も多くありますが,決定的な理由を改善する事はできなかったのでそこについては「ママ」で再投稿しました。Journal of Psycholinguistic Researchはそんなに査読が厳しくないので,それで通ってしまったという感じです。個人的にも,この論文がそこまで面白いとも自信があるとも思っていないですが(そういうのは一生かかっても書けないと思っています),とりあえず,出版されたこと自体についてはホッとしています。2019年にとった研究費の研究で,「成果」を必ず出さなければならず,論文がなかなか出ずに事務の方に毎年催促されていたので…。

この論文もオープンアクセスにはしていませんが,Springerはオンライン上であれば無料で論文が読めるシステムになっていますので,ダウンロードはできませんが,完成版の原稿は以下のURLから無料で読むことができます。

https://rdcu.be/cYGjZ

採択後の校正からオンライン公開までのプロセスがめちゃくちゃ早くてびっくりしたのですが,Journal of Psycholinguistic Researchの論文はしょっちゅうCorrectionが出ているイメージなので,ちょっと不安もありつつ,ツイッターで共有してくださっている方も何人かいらっしゃってありがたい気持ちです。

おわりに

私が第一著者ではないですが,私の敬愛する福田パイセン(2回目)が第一著者の論文も3月に出ました。

こちらはオープンアクセスになっていますので,どなたでも無料でお読みいただけます。Journal of Second Language Studiesは割と新しいジャーナルですが,このジャーナルで現在の”Most Read This Month”の論文となっています。個人的にはこれはめちゃくちゃ尖っていて多くの人に読まれてほしいやつですので,上の2つの論文よりはこちらをお読みください(余談ですが偶然にも”Most Cited”は私と福田パイセンの博士課程時代の指導教官である山下先生の論文です)。

なにをゆう たむらゆう。

おしまい。

[R] 1列だけの選択ならselect関数よりpull関数を使う

はじめに

dplyr使いの方で,select関数を使って特定の1列に対して何かしらの処理をするということをしたいときにエラーが出る人はpull関数を使いましょうという話です。ちなみに,$使えば問題は解決です。今回は,それ以外の方法で,というお話。

具体的になにをしようとしたか

私がどんな処理をしようとしたかについて少し触れておきます。ここはスキップしてもらっても構いません。

ある列の単語(1単語または2単語の英単語が入っている)の文字数をカウントするということをやろうとしていました。ピリオドが含まれていたり(e.g., “dogs.”),2語の場合は間に空白もあるので(e.g., “beautiful lake”,それらを除去して文字数を数える必要があります。そのためには,str_extract,str_replace, str_lengthなどの文字列処理関数を使う必要があります。しかし,これらの関数はベクトルを受け取って処理をするので,データフレームを渡してもエラーが出てしまうという問題に直面しました。

select関数の挙動

データフレームからある特定の列を引っ張ってくるというとき,もちろん$を使って,dat$wordのようにするのが一番簡単なのでそれでもいいのですけども,dplyr使いの方はselect関数を使っている方も多いのではと思います。ただし,select関数はデータフレームの中から特定の列を引っ張ってくると,それがたとえ1列であってもdata.frame型になります。

よって,処理に使う関数がベクトル型を要求するものだとエラーが発生することになるわけです。しかもやっかいなのは,「じゃあas.vector()関数」を噛ませればいいやんとやってみてもそれでは解決しないからです。理由はよくわかりません。

  dat %>% 
  select(word) %>% #wordという列に文字数カウントしたい文字列があるとする
  as.vector() %>%
  is.vector() #このコードではFALSEとなります

pull関数がすること

pull関数は,要するにdat$x1のように$を使って,またはdat[, x1]のように[,]を使ってデータフレームの中の特定の列を指定するのと同じ挙動をするということです(参考)。よって,pull関数の出力はベクトル型になります。

  dat %>% 
  pull(word) %>%
  is.vector() #このコードではTRUEとなります

というわけで,1列だけ持ってくるときに関数を使う場合はpull()関数を使いましょうというのが結論です。私は結局こういう感じで文字数カウントをしました。

  dat %>% 
  pull(word) %>%
  str_extract(.,"[^\\.]+") %>% #ピリオドを除去
  str_replace(.,pattern = "\\s",replacement = "") %>% #半角スペースを除去
  str_length()->rt_dat$length #文字数をカウント

$を使うと次のようになります。

  str_extract(dat$word,"[^\\.]+") %>% #ピリオドを除去
  str_replace(.,pattern = "\\s",replacement = "") %>% #半角スペースを除去
  str_length()-> dat$length #文字数をカウントしてlengthという列に入れる

$を使ったほうが行数が少なくなるので,そっちのほうがいいような気もしますが,工程の見やすさでいうとpull関数を使うほうが上かなという感じがします。

おわりに

もともと文字数はカウントしてあったのですが,ちょっと査読者の指摘でフィラー項目も入れて分析をやり直さないといけなくなってこういった処理が必要になりました。データ型って基本といえば基本なのですが,以外に気づかずにエラーで困ることもあるので,select関数の挙動について勉強になるいい機会でした。

ということで,pull関数とselect関数,場合によって使い分けましょう。

なにをゆう たむらゆう。

おしまい。

「業績的価値」が低く見積もられる論文を書く意味

はじめに

水曜の会議で,研究科の紀要への投稿が少ないみたいな話題が出ていました。私は(研究科の担当をしていないため)厳密には研究科委員会の構成員ではないのですが,慣例で学部教授会構成員は出るような感じなので大学院はこういう感じなのだなぁといつも思いながら話を聞いています。この話題に関しては思うところがちょっとあったので,Twitterに書いたことも含めて再構成してまとめておこうと思います。ちなみに,分野横断的に通じる話ではないと思いますので,私が所属しているのは外国語学部(そしてその上にあるのは外国語教育学研究科)であるということを念頭に以下をお読みください。

「業績的価値」

一応カッコ書きにしました。研究の価値を決めるための代理指標としては一定程度論文が掲載される媒体というのが機能している部分は否めないと思います。そして,そのことを研究者(または研究組織)の業績評価に使用している部分もあると思います。査読システム自体を全否定するほどラディカルな意見は私は持っていません。ただし,現状の査読システムは問題も多いとは思っています。今回はその話はしません。あくまで現状として,査読があるかないか,紀要であれば地方レベルか全国レベルか,国内誌か国際誌か,国際誌でいえばSJRはどれくらいかというような,それなりに研究者が持っていそうな(あるいは表立ってはいないけれども組織内で数値的に優劣がつけられていそうな)「業績的価値」が低いと考えられているような媒体へ投稿することにはどんな意味があるだろうか,そこに院生が投稿しようと思えるにはどうしたらいいのか,そういうことを書きます。

そもそも研究科の紀要とはどういったものか

ウェブで公開されている情報が少ないですが,編集規定は以下のようになっています

ポイントとしては,

  • 学生主体で刊行(院生協議会の会員は在籍院生に限られるという規約があります)
  • 研究科に在籍している院生しか投稿できない(費用が院生の学費から捻出されているという理由で修了生の投稿が認められなくなったらしいです)
  • 原稿のタイプは論文だけに限らず割と幅広い(実践報告や書評もある)
  • オンラインで公開されていない

あたりでしょうか。「5. 論文の掲載」の記述がややこしいですね。査読があるとは書いてありませんが,「掲載を許可される」というのは,拒否されることもあるというようにも読めます。ただし,院生の研究成果を報告する様式では「その他紀要等(査読なし)」のカテゴリに「【『千里への道』を含む】」とあります。したがって,無査読という扱いになっているのは間違いないでしょう。

院生にとってのメリット

さて,投稿する院生にとってどういうメリットがあるのかなと考えてみます。まず,論文を書いて出版するということの(私が考える)最も大きな動機は自分の研究を多くの人に届けたい(そしてそのことによって研究者コミュニティやもっと広く社会に貢献したい)ということがあると思います。そう考えると,インターネット上で公開されているかどうかというのは非常に大きな要素になります。学内紀要のようなものであっても,大学の学術レポジトリに登録されていればインターネットに接続した世界中の人たちがアクセスできるわけですから,たとえその「業績的価値」が低く見積もられたとしてもそこに投稿するメリットはあると言えるはずです。なんなら学部生とかに論文を探してこさせるとその多くは学内紀要みたいなものだったりすることもしばしばあります。そういうところに掲載されたものは読者側に価値判断をする力がないといけないことが多く,その判断力に乏しい学生が内容を鵜呑みにしてしまうと良くないという問題がありますが,これは今回の記事の内容からずれるので深堀りしません。

院生忙しい問題

これは特にうちの研究科に特有の問題である気もしますが,院生からすると「そんなとこに書いてる暇ない」というのがありそうな気がしています。フルタイム院生の数があまり多くないので,例えば私が名古屋大学大学院に所属していたときのように常時フルタイム院生が一定数いて,なおかつ毎日研究室に来るほど熱心な院生が多かった(ちなみに研究室に行くことを私の半径数メートル以内では「出勤」と言っていました)環境とは訳が違います。そういった環境なら,就活に求められる業績を目指しつつも,そのレベルではないなという論文を出す先としては無査読の媒体があればそこに出す選択を取れる院生もいました。また,フルタイムだからこそ,「なんか書いて出して」って言われたら書いて出せるくらいの余裕はありました。そして,それが『基礎研報告論集』であったわけです。

基礎研論集の話

名古屋大学大学院の学生の多くは外国語教育メディア学会中部支部に所属していました。私がちょうど入学する前くらいの当時の院生を中心に,その支部学会の研究部会として,「外国語教育基礎研究部会」というものが発足しました。部会の活動の一環として,毎年報告論集を発行しています。この報告論集は学会の所属とはまったく関係なく投稿を受け付けているので(というか部会の活動自体が学会員限定になっていないはず。昔の例会の発表は除く),過去の論集を見ると「え!この人が!」みたいなのがあったりします(2014年度報告論集)。とはいえ,投稿者の多くは名古屋大学大学院の学生が占めてきていたと思います。私も過去に部会長をやっていましたし,投稿の経験があります。過去に「キソケンとはなんだったか」という記事でこの組織がどういうものだったかというのを振り返って書いたりしているので気になる方はそちらをお読みいただくとして,論集に関してはこう書いていました。少し長いですが引用です。

…報告論集についても,「書きたいことを書いて載せられた」という点で自分にとっては良かったです。私は2014年度から2016年度まで,つまり私が博士後期課程に在籍している間は毎年1本を報告論集に投稿していました。キソケンの報告論集は査読なし扱いなので,査読なしだから出しても意味がないというように思う人もいるかもしれません。それはそれで有りだと思います。ただ,私にとってはだからこそ,「書いて残しておきたいもの」ではあるけれども「ジャーナル論文にするような性格のものではないようなもの」を書いて出すのにちょうどよい場所でした(そういうアイデアが当時割とあったとも言えます)。例えば,2014年度には「実験研究の過程と手法のよりよい理解のためにーマイクロリサーチ体験という試みー」と題した論文を出しました。これは,2014年度に静岡で行った学生向けのワークショップについてまとめたものです。マイクロリサーチ体験というのは,事前テスト-処遇-事後テスト-分析-結果-議論といった一連の流れをその場で実演し,研究の進め方についての理解を深めるというものでした。これは,キソケンのメンバーで行ったWSであったので基礎研論集に出したということもありますが,例えばどこかの学会誌に出そうとしたとしてもどの枠で出せばいいのかわかりません。ただ,どうしてもやって終わりではなく文章として形にしておきたかったのです。

2015年度は,「外国語教育研究における二値データの分析ーロジスティック回帰を例にー」というテクニカルレポートを書きました。これは,当時自分で勉強していたことをまとめたかったことと,Rのコードとともに残すことで自分の後輩にも読んでもらいたかったという意図がありました。院生時代にもデータ分析に関する相談を受けることは多く,その際に一般化線形モデルや一般化線形混合モデルを使ったらどうでしょうということがしばしばありました。そのときに,もちろんそれに関する書籍を紹介することもできましたし,グーグル検索すればロジスティック回帰に関する記事はたくさん見つけることができます。ただ,外国語教育研究の例で,Rのコードとともに,ということになるとなかなか例がありませんでした。そこで,「この論文がウェブで無料で公開されていますので読んでください」と言いたかったということです。これも,もちろんmethodological reviewというような形でジャーナルに投稿することもできたかもしれません。私にはその力はなかったというのもありますが,そこにリソースを割くよりも手っ取り早くpublishしたかったというのもあります。

2016年度は査読付き雑誌に2回落ちた論文を横流しする形で出したので,それまでのものとはやや性格は異なります。ただ,これも「教育実践について形になった論文をとにかく出したかった」ということと,同じような研究をやっている方々に読んでもらうためにオープンにウェブで公開したかったということが理由です。実際,自分も関わったプロジェクトに関する論文で引用したりもしました。草薙さんと共著で書いた「外国語教育研究における事後分析の危険性」という論文も,読まれる価値はあるけれども,学会誌等の投稿規定にはそぐわないだろうということがあって基礎研論集に書きました。

キソケンとはなんだったか

院生の業績ハードルもあがってる(下がってる?)

これは私たち(mid 30世代。いいですか私達がもうmid 30ですよ)世代よりも下の世代で顕著になってきているのかなと思います。海外の大学院でPh.Dをやっていて,院生時代から国際ジャーナルにどんどん論文を出している世代と同世代の国内の院生は結構プレッシャーに感じているところもあったりするんじゃないかなと思っています。昔(私が大学院生の頃とかそれより前も多分)なら院生で国内全国誌に通っていればとりあえずはまあ院生としてはいい方だという認識もあったように思います。ただ,今では院生でも国際雑誌に投稿するのは何も珍しくないことになってきているように思います(私も投稿自体は院生時代に何回かした経験があります)。そうなると,それが「当たり前」のような雰囲気になっているところがあるような気がします。ある意味では,国際誌投稿のハードルが下がっていると捉えることもできるとは思いますが,自分が院生時代にその環境だったらどうだっただろうと思うと,きついよねぇと思います。御存知の通り,どこに投稿するにせよ国際雑誌投稿は出版までにかかる査読のプロセスにかかる労力がすごいです。最近はOpen Data, Open Materialとか事前登録とか国際雑誌の基準自体もあがっていますから,そこに出そうと思ったら査読なしのところに出している余裕なんかあるかいなとなりますよね。

また,もしそこに出せなかったとしても,査読付きの国内誌や地方学会紀要に出すという判断も当然理解できます。特に,うちの研究科では博士号の審査にかかるときに「いいとこ」に載っていることが推奨されるので,査読なしの論文に手をかける暇なんてないでしょうね。私の記憶が正しければ,私が名古屋大学大学院国際開発研究科で博士号をとったときはそもそも博士論文の内容が査読付き雑誌に載った論文の内容に基づいていることすら要件ではなかったと思います。査読付き雑誌に2本?だったか論文が掲載されたことがあるというのは要件だったと思いますが。このことは私が着任した1年目か2年目に研究科委員会でも話題になったように記憶しています。要するに,「いいとこ」に載っている論文の内容がベースなら博士論文の質も担保されるでしょうというようなロジック。それ自体は私も十分理解できます。

それに加えて,上述のようにそもそもフルタイムの院生が少なく,博士号取得にかかる期間も長い人が多いわけですから,より一層とにかく学位取得に全エフォートを注ぎ込まないといけないという状況になっているのだと思います。そういう環境に身を置いていたら,そりゃあ査読なしで公開もされない学内紀要に投稿なんてしないという判断を責められないですよね。だってその仕組みをつくっているのは教員なんですから。

先輩・後輩の縦横つながり問題

また,そういう院生が自分の学位論文取得に注力せざるを得ない状況というのはもう一つ,縦の関係の意味でもあんまりよくないんだろうなと思います。院生時に論文を出版できるかどうかは,教員の引き上げかもしくは院生同士の切磋琢磨,この2つの要因が大きいのではと個人的に思っています。この中で後者の部分においては,(院生指導していないので実態はよくわかっていないですが),少なくとも自分が経験した大学院生活とはずいぶん違う環境なんだろうなとは思っています。フルタイムの院生が少ないと,そもそも院生同士のつながりがそこまで強固に形成されにくいんだと思います。私がいた名古屋にいた頃は「全寮制なんでしょ?」といじられるほどに縦横のつながりが外部からも認識されていたわけですが,おそらくうちの研究科にはそういうものはなさそうです。そうなると,先輩が後輩の面倒を見て論文の出版を後押しするみたいなことや,院生同士で「なんかネタない?」とか,「あれちょっと書いてまとめとこうや」みたいなことにもなりづらいんだと思います。

大学院を担当される先生方は授業担当という意味でも,学内のその他の業務担当という意味でも私のような若手(学内だと次の公募で私より下の方が来なかったらまだ私が当分は最若手では…?)よりも業務量が多いです。となると,そういう先生たちも学位論文指導以外の面で院生の研究をサポートするところまでできるというようにはあまり思えません(繰り返しますが実際に先生方がどうなさっているかは知りません)。また,教員側からしても投稿するメリットを学生になかなかアピールしづらかったり,そもそもそれを言いづらい(学位論文に注力してもらわないと困るわけなので)という現状もあると思います。

そもそも査読なし媒体自体の価値が見出しづらい?

メソ研論集も一時期すごい活気があったように思いますが,あれも投稿が集まりづらいのは時代なのかなぁと思ったりもします。もちろん,10年前くらいに今の私たちくらいの年齢でイケイケだった人たちが今や学内組織や学会組織を回す側になり,研究以外の業務で忙しくなってしまったので余裕がなくなってしまったというのもあるでしょう。メソ研論集や基礎研論集はそれでもインターネット上でオープンに公開されていますから,それでもなかなか集まらないとなったらインターネット上でも公開されていないものに投稿が集まらないなんて当然では?と思います。なんのために発行しているの?という媒体そのものの価値を見直さない限りは投稿も増えることは見込めないでしょう。私としては,上で自分の過去記事を引用したような部分が査読なし媒体の存在価値だと思っていますので,利用する機会がなくなったりはしないかなと思います。

ただし,やっぱり広く読まれるのは国際誌だと思っていて,例えば全国英語教育学会紀要(ARELE)に載ってもたいして引用されないですよね。自分のやった研究が学術コミュニティの議論に貢献しているのかなと思うので,よほど理由がなければ(あるいは国際誌に出すほどではないかぁという質のものでなければ)国際誌を基本的には目指してやるだろうなぁと思います。先日届いたARELEの編集後記に投稿数が減っているみたいなことが書いてありましたが,昔ならARELEに出していたようなものを国際誌に投稿するようになっているんだと思います。コロナで研究活動が滞っているということも原因としてなくはないでしょうが,今後も国内の紀要は全国誌・地方誌,査読ありなしに関わらず存在意義を突きつけられていくのではないでしょうか。

公開はまずい的議論

査読なしで公開することに関して,「やばいのが公開されたらやばい」というロジックで公開に後ろ向きな人がいるのだろうなぁとか,そういう議論がされてきたこともあるだろうなぁということは想像できます。つまり,公開しないのは質が低いから,みたいな話です。一理あるとは思いますが,別に査読がないからといって著者以外の誰も原稿に目を通さずに公開に至ることはないわけですし(「専門家の講評」があると編集規定に書かれていますし),教員や院生同士で投稿前の原稿をそれなりのレベルに引き上げるプロセスをすればいいだけでは?と個人的には思います。教員側にその余裕がないのであれば,院生同士が自主的に切磋琢磨しあえる環境を作るようにしていけばいいですし,それも難しいのであれば院生限定でしか投稿できない媒体を維持すること自体が難しいという結論になると思います。

さらに身もふたもないことを言えば,公開されたからといってそんなにたくさん「読まれない」とも思います。有名な研究者の書いたものならまだしもどこの者ともしれぬ院生が出した論文であれば,データベースに載ったりしない限りは研究者の目に引っかかることもあまりないでしょう。研究者の目に引っかからないということはつまり,厳しい目で読まれることもないわけですから,「こんなやべえ論文出してる組織やべえな」ってなることもあまりないように思います。多くの場合は,へーこんな研究やってる院生がいるのねーとか,ここの院生は頑張ってるねーくらいの感じで目次やアブストを眺めるくらいなんじゃないでしょうか。基礎研論集だってちゃんとダウンロードして中身読んだらこれ大丈夫か?みたいなのも見たことありますよ。それでどういう評判になっているかは私のところに聞こえてくることはないですけれども。

それに,審査のプロセスがあった上で「やばい」のがあったら審査した側の責任も問われるべきだと思いますが,無査読であれば(よほど倫理的にやばいみたいなのを覗いて)研究の質が低い・論文の質が低い,みたいなものの責任を負うのは執筆者自身でしょう(編集規定にも「応募論文に関する一切の責任は執筆者が負う」とあります)」。そのことで組織の評判が落ちることを気にするのであれば,やっぱり教員が介入するなり院生同士のネットワークを強化するなりして,院生の投稿を支援する仕組みづくりが欠かせないはずです。あとは,大学院の授業のタームペーパーとして論文のベースになりそうなものを求める授業があるかどうかということも院生の投稿を促すことにつながると思います。実際,名大ではそういうケースでMの院生がタームペーパーをもとに論文化することがありましたし,それは今でもおそらくそうなっていると思います。

おわりに

一言でまとめると,院生が「出してみようかな」と思える環境にそもそもなっていないというか,それを後押しする要素が欠けているということに尽きるのではないかと思います。よって,査読なしであっても院生が投稿しようと思うような媒体にすること(ウェブ公開)と,組織としてそれを支援する仕組みを作ること(教員のサポート&院生同士の切磋琢磨)が取り組むべき課題かなというのが私の結論です。

なにをゆう たむらゆう。

おしまい。

[R] 初心者向け pivot_longer関数で縦型変換

はじめに

以前(というかかなり昔),tidyrやdplyrについての記事を書きました。

どちらの記事を書いたときからもだいぶ月日が経っていて,dplyrのアップデート等もあって色々とやり方が変わっているのですが,自分自身が研究で分析をする際にアップデートしていたことをブログ記事には反映させられていないので,上の2本の記事のアップデート版のようなことを書いておこうと思います。

まずはサンプルデータ

#事前・事後・遅延事後で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    9.344978     3.921626      4.5778491    13.932376      2.241629
## 2    9.126920     7.307178      3.2309289    13.624622     12.813440
## 3   13.433524     6.048270      5.0082008     7.932601     11.832851
## 4   11.937755     5.859142      0.6414096    11.289177      7.009059
## 5    7.913083     5.748651      2.6099159    17.933721     10.765706
## 6    8.683515     4.363661      5.4608116    16.550468     16.483160
##   post.complexity delayed.fluency delayed.accuracy delayed.complexity subject
## 1        9.381369       10.628923         6.929672           7.923673       1
## 2        4.485729       14.456886         9.048825           5.306266       2
## 3        7.534226       13.031400         7.144670           7.781451       3
## 4        8.076248       12.390157         9.247418           6.244443       4
## 5        8.702016        9.604130         7.530200           5.927892       5
## 6        8.973912        8.060271         8.188526           6.458383       6

縦横変換

昔の縦横変換は,gatherでやっていました。現在は,pivot_関数を使います。その名の通り,縦長(long型)にするのがpivot_longer関数で,横長にするのがpivot_wider関数です。

library(dplyr)
dat %>%
  tidyr::pivot_longer(cols = 1:9)
## # A tibble: 450 × 3
##    subject name               value
##      <int> <chr>              <dbl>
##  1       1 pre.fluency         9.34
##  2       1 pre.accuracy        3.92
##  3       1 pre.complexity      4.58
##  4       1 post.fluency       13.9 
##  5       1 post.accuracy       2.24
##  6       1 post.complexity     9.38
##  7       1 delayed.fluency    10.6 
##  8       1 delayed.accuracy    6.93
##  9       1 delayed.complexity  7.92
## 10       2 pre.fluency         9.13
## # … with 440 more rows

colsのところでどの列をまとめるかという指定をします。ここの指定は,上のやり方だと数字で列指定(1列目から9列目)としています。この部分はc()関数を使って文字列で指定してもいいですし,列指定のときに使えるstarts_with()やcontains() なんかもできます。例えば,まあこれはあくまで偶然そうなだけですけど,ここではまとめたい1列目から9列目はすべて”y”で終わっているので,以下のようにすることもできます。

dat %>% 
  tidyr::pivot_longer(cols = ends_with("y"))
## # A tibble: 450 × 3
##    subject name               value
##      <int> <chr>              <dbl>
##  1       1 pre.fluency         9.34
##  2       1 pre.accuracy        3.92
##  3       1 pre.complexity      4.58
##  4       1 post.fluency       13.9 
##  5       1 post.accuracy       2.24
##  6       1 post.complexity     9.38
##  7       1 delayed.fluency    10.6 
##  8       1 delayed.accuracy    6.93
##  9       1 delayed.complexity  7.92
## 10       2 pre.fluency         9.13
## # … with 440 more rows

また,まとめたくない列を”!“で指定することもできるので,今回のようにまとめないでほしい列が少ないという場合については,次のようにも出来ます。

dat %>% 
  tidyr::pivot_longer(!subject)
## # A tibble: 450 × 3
##    subject name               value
##      <int> <chr>              <dbl>
##  1       1 pre.fluency         9.34
##  2       1 pre.accuracy        3.92
##  3       1 pre.complexity      4.58
##  4       1 post.fluency       13.9 
##  5       1 post.accuracy       2.24
##  6       1 post.complexity     9.38
##  7       1 delayed.fluency    10.6 
##  8       1 delayed.accuracy    6.93
##  9       1 delayed.complexity  7.92
## 10       2 pre.fluency         9.13
## # … with 440 more rows

「まとめる」という感覚がいまいちよくわからないなぁとか,どの列を「まとめ」て,どの列は「まとめ」なくていいのかというのがピンと来ない場合には,次のように考えてください。

分析の際に従属変数(応答変数)となる列をまとめる

さて,今の段階ではまとめた際の列名が”name”になっていて,数値の部分が”value”という列名になっていますよね。ここも次のように指定できます。

dat %>% 
  tidyr::pivot_longer(!subject, names_to = "variable", values_to = "score")
## # A tibble: 450 × 3
##    subject variable           score
##      <int> <chr>              <dbl>
##  1       1 pre.fluency         9.34
##  2       1 pre.accuracy        3.92
##  3       1 pre.complexity      4.58
##  4       1 post.fluency       13.9 
##  5       1 post.accuracy       2.24
##  6       1 post.complexity     9.38
##  7       1 delayed.fluency    10.6 
##  8       1 delayed.accuracy    6.93
##  9       1 delayed.complexity  7.92
## 10       2 pre.fluency         9.13
## # … with 440 more rows

ただ,今回のケースではまとめた列に”pre”, “post”, “delayed”というテスト実施時期(test)という要因と,“complexity”, “accuracy”, “fluency”という測定値の要因が混在していますね。よって,あまり”name”の列名を変えることは意味がありません。むしろ,この列を分割してそれぞれの列に名前をつける必要があります。この列分割をseparate関数で行うという点は私が以前ブログ記事を書いた際と同じです。というわけで,次のようにします。

dat %>% 
  tidyr::pivot_longer(!subject) %>% 
  tidyr::separate(name, c("test","measure"), sep = "\\.")
## # A tibble: 450 × 4
##    subject test    measure    value
##      <int> <chr>   <chr>      <dbl>
##  1       1 pre     fluency     9.34
##  2       1 pre     accuracy    3.92
##  3       1 pre     complexity  4.58
##  4       1 post    fluency    13.9 
##  5       1 post    accuracy    2.24
##  6       1 post    complexity  9.38
##  7       1 delayed fluency    10.6 
##  8       1 delayed accuracy    6.93
##  9       1 delayed complexity  7.92
## 10       2 pre     fluency     9.13
## # … with 440 more rows

これで,完璧ですね。と思いきや…!実はpivot_関数には”name_sep”という便利な引数があります。これはどういう時に使うかと言うと,まとめた際に一つの列に複数の要因が混在してしまうときに,それを指定した区切り文字によって分割するために使います。まさに上で起こった問題ですよね。テスト実施時期と測定値が一緒の列になっていたのをseparate関数で分割したわけですが,なんとseparateを使わなくても縦型に変換する段階で分割までできてしまいます。

dat %>% 
  tidyr::pivot_longer(!subject, names_to = c("test", "measure"), names_sep = "\\.", values_to = "score")
## # A tibble: 450 × 4
##    subject test    measure    score
##      <int> <chr>   <chr>      <dbl>
##  1       1 pre     fluency     9.34
##  2       1 pre     accuracy    3.92
##  3       1 pre     complexity  4.58
##  4       1 post    fluency    13.9 
##  5       1 post    accuracy    2.24
##  6       1 post    complexity  9.38
##  7       1 delayed fluency    10.6 
##  8       1 delayed accuracy    6.93
##  9       1 delayed complexity  7.92
## 10       2 pre     fluency     9.13
## # … with 440 more rows

このときのポイントは2点あります。1つは”names_to”で列名を2つ指定すること。縦型変換の際に列の分割もするので,ここでのnames_toの指定は分割後の列名とします。もう一つは,区切り文字は正規表現を受け付けるということ。区切り文字がドット(.)なので,ここでnames_sep= “.”としてしまうと,正規表現におけるドットだと認識されてしまいます。これでは任意の1文字ですので,列名がうまく分割されずに以下のようになってしまいます。

dat %>% 
  tidyr::pivot_longer(!subject, names_to = c("test", "measure"), names_sep = ".", values_to = "score")
## Warning: Expected 2 pieces. Additional pieces discarded in 9 rows [1, 2, 3, 4,
## 5, 6, 7, 8, 9].
## # A tibble: 450 × 4
##    subject test  measure score
##      <int> <chr> <chr>   <dbl>
##  1       1 ""    ""       9.34
##  2       1 ""    ""       3.92
##  3       1 ""    ""       4.58
##  4       1 ""    ""      13.9 
##  5       1 ""    ""       2.24
##  6       1 ""    ""       9.38
##  7       1 ""    ""      10.6 
##  8       1 ""    ""       6.93
##  9       1 ""    ""       7.92
## 10       2 ""    ""       9.13
## # … with 440 more rows

したがって,正規表現ではありませんよということを追記する必要があります。このことをエスケープするなんて言いますが,Rにおけるエスケープは “\\”です。一般的にはエスケープは”\“ですが,R上では2つ重ねないといけないことに注意が必要です。

おわりに

とりあえず,long型に変換する作業をこの記事では説明しました。少し長くなってしまったので,記述統計を出すという話はまた別の記事にしたいと思います。

なにをゆう たむらゆう。

おしまい。

追記(2022.03.16)

従属変数を3列待ちにしたい(横長にしたい)

よく考えたら,分析するときはcomplexity, accuracy, fluencyの3つの列があったほうが便利ですよね。ということで,その形に変形させましょう。ここで,横長に変換するためのpivot_wider関数を使います。“names_from”の引数で「分解」したい列を指定します。ここでは,accuracy, complexity, fluencyの入っている“measure”の列を「分解」して横長にするので,“measure”を指定します。あとは,横長にしたときに持ってくる数値がどこに入っているかを“values_from”の引数で指定します。これは“score”に入ってますから,これを指定すればいいですね。というわけで,次のようになります。

dat %>% 
  tidyr::pivot_longer(!subject, names_to = c("test", "measure"), names_sep = "\\.", values_to = "score") %>% 
  tidyr::pivot_wider(names_from = "measure", values_from="score")
## # A tibble: 150 × 5
##    subject test    fluency accuracy complexity
##      <int> <chr>     <dbl>    <dbl>      <dbl>
##  1       1 pre       10.1     10.0        3.97
##  2       1 post      15.8      8.50       9.81
##  3       1 delayed   15.5      8.59       4.67
##  4       2 pre       12.0      6.40       1.03
##  5       2 post       6.90    10.1        7.30
##  6       2 delayed   15.0      8.54       7.70
##  7       3 pre        9.07     8.49       2.78
##  8       3 post       7.11    10.2        8.55
##  9       3 delayed   10.7      7.97       5.54
## 10       4 pre       12.5      6.03       2.26
## # … with 140 more rows

もしも,fluency, accuracy, complexityなどの順番が気になる場合は,select関数で指定してください。

dat %>% 
  tidyr::pivot_longer(!subject, names_to = c("test", "measure"), names_sep = "\\.", values_to = "score") %>% 
  tidyr::pivot_wider(names_from = "measure", values_from="score") %>%
  dplyr::select(subject, test, complexity, accuracy, fluency)
## # A tibble: 150 × 5
##    subject test    complexity accuracy fluency
##      <int> <chr>        <dbl>    <dbl>   <dbl>
##  1       1 pre           3.97    10.0    10.1 
##  2       1 post          9.81     8.50   15.8 
##  3       1 delayed       4.67     8.59   15.5 
##  4       2 pre           1.03     6.40   12.0 
##  5       2 post          7.30    10.1     6.90
##  6       2 delayed       7.70     8.54   15.0 
##  7       3 pre           2.78     8.49    9.07
##  8       3 post          8.55    10.2     7.11
##  9       3 delayed       5.54     7.97   10.7 
## 10       4 pre           2.26     6.03   12.5 
## # … with 140 more rows

この変換後のデータを別の変数に保存するのを忘れずに!

dat2 <- dat %>% 
  tidyr::pivot_longer(!subject, names_to = c("test", "measure"), names_sep = "\\.", values_to = "score") %>% 
  tidyr::pivot_wider(names_from = "measure", values_from="score") %>%
  dplyr::select(subject, test, complexity, accuracy, fluency)

head(dat2)
## # A tibble: 6 × 5
##   subject test    complexity accuracy fluency
##     <int> <chr>        <dbl>    <dbl>   <dbl>
## 1       1 pre           3.97    10.0    10.1 
## 2       1 post          9.81     8.50   15.8 
## 3       1 delayed       4.67     8.59   15.5 
## 4       2 pre           1.03     6.40   12.0 
## 5       2 post          7.30    10.1     6.90
## 6       2 delayed       7.70     8.54   15.0