タグ別アーカイブ: R

[R] mutateとacrossでデータの下処理を少しだけエレガントに

まえおき

私はdplyrは5年前くらいから使っていて,自分が扱うようなデータについて自分がやりたいことを(その表現方法のエレガントさは別として)表現することはできていました。ただ,近年dplyrはアップデートを重ねていました。昔覚えたやり方でやろうとしても,その関数は使えませんとか,その表記方法は違いますとか言われることが増えました。分析の下処理でやりたいことは基本的に研究が変わらないので同じです。よって,過去に自分が書いたスクリプトのコピペをすることが多いわけです。それができなくなっていたと。

特に,最近の更新でacross()という関数が導入されたことが変更として大きいなと思います。まだまだこのacross()に関する記事も少なかったので,自分が使うにあたって覚えたことをメモ代わりに書いておきます。ここでは,mutate関数と一緒に使うケースです。つまり,ある特定の列について,ある処理を施して,その処理を施した列をデータフレームに追加するという作業です。単純に列に対して処理を施すだけというのは結構記事があったんですが,列を追加することについては全部列挙するみたいな方法しか見つかりませんでした。そこでacross関数の出番というわけですね。

やりたいこと

例えば,今やってる研究のデータでは,データフレームの中に頻度のデータが入っています。これをログ変換したいとします。すると,これまでは以下のように書いていました。

log(dat$ColFreq)->dat$ColFreq_log #コロケーション頻度
log(dat$AdjFreq)->dat$AdjFreq_log #コロケーション内の形容詞の頻度
log(dat$NounFreq)->dat$NounFreq_log #コロケーション内の名詞の頻度
log(dat$MIScore)->dat$MIScore_log #Mutual Information Score

別にコピペ&書き換えみたいなことをしながらやればいいし,これでだめだってことはないんですけど,複数の列について

  1. 同じ関数を適用
  2. 列を追加する

という同じ動作をしているわけなので,これは一気にできたほうが応用可能性があがります。私は手作業でやるの無理みたいな列数のデータを扱うことはないんですが,もし仮にそういうデータを扱う場合には何十行も使うのは好ましくないし無駄な作業だといえます。そこで列に対して処理を施して追加するという機能があるmutate関数と,それを複数列に適用する際に便利なacross関数を組み合わせます。

やりかた

ちなみに,なんだかんだでdplyrのパッケージのPDFが一番わかりやすかったです(pp. 3-6のacross関数のセクションとpp. 43-46のmutate関数のセクション)。across関数の引数は,列(.cols),関数(.fns),追加する列の名前(.names)という3つの引数があります。よって,今回のケースで言えば列のところで頻度情報が入ってる列を選択し,関数はlogを選べばOKです。ただ,.namesがないと情報を上書きしてしまいます。.namesのところは手書きで全部列名指定してやらなかんのかと思いましたが,そんなことはありません。”{.col}”を使えば,もとの列名を使えます。これにあとは自分で好きなタグのようなものをつけてあげればいいですね。”{.fn}”というのも使えて,これは使った関数名が入ります。

ということで,以下のようにすれば頻度情報にログ変換して列追加という作業ができます。

dat%>%
  mutate(across(c(ColFreq, AdjFreq, NounFreq, MIScore),log,.names = "{.col}_log"))->dat

.namesの部分は”{.col}_log”としていますが,”{.col}_{.fn}”でも同じです。dat$ColFreq_log, dat$AdjFreq_log,dat$NounFreq_log,dat$MIScore_logという4つの列が追加されます。ちなみに,列指定の部分は列の数値(e.g., 1, 2)でも可能です。頻度の情報が5~8列目にあるなら,次のように書くこともできます。ある特定の文字列が含まれる列を選ぶcontains()関数starts_with()関数とかも使えるはずです(こういうのは調べれば結構例があります)。

dat%>%
  mutate(across(5:8,log,.names = "{.col}_log"))->dat

ちょっと応用

さて,mutate関数とacross関数でたいぶすっきりしたコードを書くことができました。そこでふと,私がもう一ついつも下処理で複数列に適用する作業を思い出しました。それは,変数の標準化です。いつもなら次のようにしてました。

dat$z.oqpt <-scale(dat$oqpt)[,1] #Oxford Placement Testの点数の中心化
dat$z.rating <-scale(dat$rating)[,1] #評定値の中心化

これも別に2行だけなので大したことないんですが,やってることは先ほどのログ変換と同じですので,これもmutate関数を使って書き直してみましょう。次のようになります。

dat%>%
  mutate(across(c(oqpt,rating),scale,.names = "z.{.col}"))->dat

これでうまくいっているようにも見えますが,実はscale関数って出力された結果がベクトルではありません(データ型を調べるとmatrix型なのがわかります)。よって,大抵の場合は分析に問題はありませんが,あとで(私の場合だと分析結果の図示とか)ベクトル形式が求められる関数に渡した際に問題が発生することがよくあります。データフレームをただ眺めるだけではそのことはわからないので,次のように工夫してあげる必要があります。

dat%>%
  mutate(across(c(oqpt,rating),~scale(.x)[,1],.names = "z.{.col}"))->dat

さきほどと関数部分の書き方が変わっているのがわかると思います。このように”~”をつける書記法はpurrr-styleと呼ばれるそうですが,これは一般的には関数内の引数を指定する場合によく用いられます。例えば,~mean(.x, na.rm=T) のように使います。”na.rm=T”は欠損値は外して関数を適用するという設定のようなものです。今回は引数の設定ではなく,~scale(.x)[,1]としています。”[,1]”とすることで,行列の1つ目の要素(つまりこれは標準化された数値のベクトル)だけを出力してくれます。ちなみに,この方法で.namesに{.fn}をつかって次のようにすると,出力される列名はoqpt_1, rating_1のようになりました(理由は不明)。

dat%>%
  mutate(across(c(oqpt,rating),~scale(.x)[,1],.names = "{.col}_{.fn}"))->dat

おわりに

というわけで,改良されているんだろうけれども前のやり方に慣れてるこっちからしたらアップデートたびにコードを書き換えるのまじで面倒…って思っていたのですが,調べてみるとやっぱり便利でしたというお話でした。

またこういう系のことで新しく覚えたことがあれば記事に書こうと思います。

なにをゆう たむらゆう。

おしまい。

[R] [Excel] 多肢選択の正答をランダムにする

はじめに

いままであまり深く考えたことなかったんですけど,多肢選択式のテストを作るとき,正答をどれに指定するかって規則性がないように,同じものが連続にならないように,とかを「なんとなく」,「雰囲気で」やってきたところがあります。それを,ちゃんとランダムにできないかな,というお話。

R編

なにはともあれ,Rを使います。エクセルでもできるのにRです。Rなら一瞬です。

sample関数とLETTERS関数の組み合わせ

要するに,例えば4択問題であればABCDの4つの中からランダムに1つ選ぶのを問題数分だけ繰り返すってことになりますよね。それを表現してあげれば良いだけです。めっちゃ簡単。

例として,ABCDの4択問題を20問作ることにしましょう。

sample関数を使います。sample関数は次のような引数を取ります。

sample (x, size, replace = FALSE, prob = NULL)
  • x: もとデータのベクトル(今回はこれをABCDにしたい)
  • size: サンプリング回数(20問なのでここに20をいれる)
  • replace: 繰り返しありかどうか(デフォルトだとFALSEで同じものが繰り返し出てこないようになってますが,今回はむしろ繰り返し出てきてOKなのでTRUEにしないとだめ)
  • prob: サンプリングの重み付け確率(どれが何%の割合でてくるようにするか決められます。後述します)

さて,次に問題になるのは,ABCDをベクトルにすることですね。もちろん,

> d <- c("A", "B", "C", "D")

で簡単にできます。よって,

> d <- c("A", "B", "C", "D")
> sample (d, 20, replace = TRUE)

これでOKです。ただ,ほんのちょっとだけ便利なやり方は,LETTERSを使うことです。Rはデフォルトで,LETTERSの中に,A~Zまでのアルファベットが入っています(小文字のa~zはlettersです。

> LETTERS
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

今回は,A~Dの4つだけでいいので,1番目から4番目までをつかいます。sample関数と組み合わせて…

> sample(LETTERS[1:4],20,replace = TRUE)
 [1] "B" "D" "C" "A" "D" "D" "C" "A" "A" "C" "B" "A" "D" "A" "B" "C" "C" "C" "A" "C"

これでばっちりですね。もしも,「えーなんかこれC多くない?」みたいなことが気になる方はこのコード何回か走らせていい感じの組み合わせが出たらそれを使えばいいんじゃないかと思いますが,probでABCDがでる確率の重み付けをつけてあげることもできます。

> sample(LETTERS[1:4],20,replace = TRUE, prob=c(0.25,0.25,0.25,0.25))
 [1] "D" "B" "A" "C" "C" "A" "C" "D" "C" "A" "A" "C" "B" "B" "B" "D" "B" "D" "B" "D"

絶対にいつでも等確率で現れるわけではないみたいで,4つだったり6つだったりするものもありますが,完全なランダムよりは出現確率が揃ってるんじゃないかなと。もしもこれをエクセルにはりつけたければ,出力されたものをそのままコピペして,Text Import Wizardでスペース区切りにしてあげればOKです。縦にしたい場合は転置してください。

Excel編

Excelでもそこまで難しくないです。INDEX関数とRANDBETWEEN関数を組み合わせます。下の画像のようにすればOKです。

B3からB21までは,B2を下にコピーしたものが入ってます。INDEX関数の第一引数で参照元の範囲をしています。これがつまりABCDってことですね。そして,次の引数が縦位置の指定です。本当はこの後ろの第三引数で横位置指定もできますが,今回は1列だけなのでこれでOKです。この位置指定が1のときはA,2のときはB,3のときはC,4のときはDってな感じになるというわけです。そして,RANDBETWEEN関数をここに使うことで,1から4がランダムに出てくれる=ABCDがランダムに出てくれる,ということになります。ちなみに,RANDBETEEN関数は,始点と終点の数値を入れればその間の整数をランダムに返す関数です。

ちなみに,横位置指定を使おうと思えば,ABCDを1列ではなく2列に分割することになります。こちらのほうが数式が長くなるのでおすすめしないですが,INDEX関数の挙動のイメージを理解するために見てみます。

こっちだと範囲が2*2のマトリックスになるわけですね。そして,第二引数(縦位置指定)で1か2のどちらかの数字,第三引数(横位置指定)で1か2のどちらかの数字をランダムに返すようになっています。つまり,(1, 1), (1, 2), (2, 1), (2, 2)の4つのパターンがランダムにできて,それに対応するABCDが返ってきます。(1, 1)ならAというような感じ。もっと大きなデータを扱う場合には縦横指定が必要になるでしょうが,今回の用途には不要なので,ABCDを一列にするほうがいいと思います。

おわりに

別に適当に正答指定して何も悪いことはないのですが,ランダムにするのってできるかな?という頭の体操でした。

なにをゆう たむらゆう。

おしまい。

【R】JSON形式で刺激リスト作成

はじめに

この記事では,よくある刺激のリストをJSON形式で保持するということをRを使ってやってみます。ただのデータフレームをJSON形式に変換するのはそれほど難しいことではありません。むしろ,Rを使わなくてもウェブ上で変換してくれるサービスがあります。
https://tableconvert.com/

こういうのを使うと,下記のようなテーブル形式のデータをcsvで持っていたとしたら,それをJSON形式に変換するのは一瞬です。

id name age gender
1 Roberta 39 M
2 Oliver 25 M
3 Shayna 18 F
4 Fechin 18 M
#JSON形式
[
    {"id":1,"name":"Roberta","age":39,"gender":"M"},
    {"id":2,"name":"Oliver","age":25,"gender":"M"},
    {"id":3,"name":"Shayna","age":18,"gender":"F"},
    {"id":4,"name":"Fechin","age":18,"gender":"M"}
]

問題の所在

じゃあ別にそのウェブサービスでいいじゃんということになるんですが,問題は少しこれより複雑です。というのも,私は今 jsPsychを使って実験ができるようにと勉強しています。jsPsychではJSON形式で刺激を読み込むのですが,その際に,データに階層性が必要になってくるようです。別に,反応の取得だけを目的とするなら必要ないのですが,のちのデータ分析を楽にすることを考えると,これは実験の前の段階でやっておきたいです1jsPsychのページでは以下のように例が示されています。

var test_stimuli = [
  { stimulus: "img/blue.png", data: {test_part: 'test', correct_response: 'f'}},
  { stimulus: "img/orange.png", data: {test_part: 'test', correct_response: 'j'}}
];

この例では,刺激として画像を提示するので,“stimulus”として画像ファイルが指定されています。そして,その後ろにdataという変数があって,要するに,実際に表示される刺激と,その刺激に付随する情報(正誤,刺激の種類等)が分かれていて,付随する情報は一つ階層が下のレベルに入っているということです。リストの中にリストがあるということですね。こうなると,ただのデータフレームからの変換というわけにはいかないので,先ほど紹介したようなウェブブラウザで変換というわけにもいきません。というわけで,Rを使って,できるだけ簡単にデータフレームから階層性のあるリストをゲットしましょう。というのが今回の目標です。実は,リスト->データフレームという話は,rlistパッケージ周りでやってる方が結構いらっしゃるようです(Googleで「rlist データフレーム 」と検索してみてください)。ところが,今回のようにデータフレーム->リストはあまり例が見つかりませんでした。ということでやってみましょう。結論から先にいうと,めちゃくちゃ単純でした。

1. データの準備

まずは,わかりやすい刺激リストの例として自分が最近実験で使った刺激リストを読み込みます。

dat<-read.csv("stimuli.csv")
head(dat)

一応,各列に何が入っているかを簡単にまとめると,以下のようになります。

  1. itemID: 刺激のID(かぶりがありますが,nonwordは分析から最初に外すのでとりあえずOK。ほんとは連番のがいいですけど)
  2. type: 刺激の種類
  3. word: ターゲットとなる英単語
  4. kana: 対応するカタカナ語
  5. pic: 提示する画像
  6. lang: 提示する言語
  7. prime: プライミング条件
  8. answer: 正答
  9. form: フォーム
  10. freq_J: カタカナ語の頻度
  11. freq_E: 英単語の頻度

この実験では,まずはじめに画像を提示して,参加者はその画像を見ます。画像を理解したら次に注視点が表示されます。その後に提示された文字列が実在語かどうかを判断する語彙性判断課題です。プライミングの条件がshare, spec, baseと3条件あります。さて,プログラム上では,

  1. 画像(pic)を提示
  2. 語(word)を提示

ということで,上で紹介した例と異なって,提示する刺激が2種類あります(ここでは,提示刺激は英単語のみとして進めます。カタカナ語の場合は英単語の部分をカタカナ語の列に置き換えれば良いと考えます)。つまり,

{ pic: "img/2_C_sh.jpg", word: "interview", data: {itemID: '2', kana: 'インタビュー', lang: 'eng', prime: 'share',answer: 'TRUE',form: 'A',freq_J: '29.5098', freq_E: '17.5744'}}

というのを読み込んだデータフレームのすべての行において作ることができれば成功となります。

2. パッケージの準備

とりあえず,これ入れとけばいいかなということでtidyverseパッケージと,最後にJSON形式に変換する際に使うjsonliteパッケージ。

install.packages("tidyverse")
install.packages("jsonlite")
library(tidyverse)
library(jsonlite)

3. データハンドリング

tibbleという比較的新しいデータ形式を使います。tidyrとかdplyrとか使うようになって,数年前からこのtibble形式がよく出てきてたんですが,私もいまいちよくわかってませんでした。というか,データフレームを扱うことがほとんどなので,データフレーム形式しか受け付けない関数にtibbleで出力された結果をうっかり渡してエラー吐くみたいなことが頻発したのでいちいちas.data.frame()でデータフレーム型に強制的に直すみたいなことをしてました。

ところが,今回みたいな階層性のある形については,tibble型が便利なようですね。tibbleでは,リスト型の列を持つことができるので,“data”の列に刺激の情報をまとめたリストを入れていけばいいということになります。そう考えて,次のようにやってみました。

tibble::tibble(
  pic=dat$pic,
  word=dat$word,
  data=list(dat[,c(1,2,4,6,7,8,9,10,11)])
)->dat2

ところが,これで中身を見てみると…

head(dat2)
## # A tibble: 6 x 3
##   pic         word        data             
##   <fct>       <fct>       <list>           
## 1 2_C_sh.jpg  interview   <df[,9] [48 × 9]>
## 2 3_C_sp.jpg  court       <df[,9] [48 × 9]>
## 3 6_C_sh.jpg  alien       <df[,9] [48 × 9]>
## 4 7_C_sp.jpg  appointment <df[,9] [48 × 9]>
## 5 10_C_sh.jpg stamp       <df[,9] [48 × 9]>
## 6 14_C_sh.jpg channel     <df[,9] [48 × 9]>
head(dat2$data,3)
## [[1]]
##    itemID    type               kana lang prime answer form   freq_J
## 1       2  target       インタビュー  eng share   TRUE    A  29.5098
## 2       3  target             コート  eng  spec   TRUE    A 100.7255
## 3       6  target         エイリアン  eng share   TRUE    A  17.4314
## 4       7  target   アポイントメント  eng  spec   TRUE    A  30.5686
## 5      10  target           スタンプ  eng share   TRUE    A   5.9216
## 6      14  target         チャンネル  eng share   TRUE    A  24.4118
## 7      15  target           クロール  eng  spec   TRUE    A  12.0392
## 8      18  target             センス  eng share   TRUE    A 131.8039
## 9      19  target             ベンチ  eng  spec   TRUE    A   9.6667
## 10     22  target     プロモーション  eng share   TRUE    A  10.9216
## 11     23  target               ツナ  eng  spec   TRUE    A   8.0000
## 12      1  target           アイロン  eng  base   TRUE    A  17.9412
## 13      4  target         グラウンド  eng  base   TRUE    A  72.4706
## 14      5  target           アドレス  eng  base   TRUE    A  52.2745
## 15      8  target       プレッシャー  eng  base   TRUE    A  53.1176
## 16      9  target         プロポーズ  eng  base   TRUE    A  13.0000
## 17     12  target         ボリューム  eng  base   TRUE    A   6.9412
## 18     13  target             ベース  eng  base   TRUE    A  35.3725
## 19     16  target       エクスプレス  eng  base   TRUE    A  17.9216
## 20     17  target           ストーブ  eng  base   TRUE    A   7.5882
## 21     20  target           リコール  eng  base   TRUE    A  19.6667
## 22     21  target             レター  eng  base   TRUE    A  82.6078
## 23     24  target             ガッツ  eng  base   TRUE    A  23.7451
## 24     25  target             バイク  eng  base   TRUE    A  25.8824
## 25     17 nonword     ドートレギング  eng  <NA>  FALSE <NA>       NA
## 26     18 nonword     フィスティレド  eng  <NA>  FALSE <NA>       NA
## 27     19 nonword       ストネヘンデ  eng  <NA>  FALSE <NA>       NA
## 28     20 nonword   ポリディフィエス  eng  <NA>  FALSE <NA>       NA
## 29     21 nonword   メストレイヤーズ  eng  <NA>  FALSE <NA>       NA
## 30     22 nonword         ドンスーン  eng  <NA>  FALSE <NA>       NA
## 31     23 nonword           スプラム  eng  <NA>  FALSE <NA>       NA
## 32     24 nonword ティソベディエント  eng  <NA>  FALSE <NA>       NA
## 33     25 nonword             ムイン  eng  <NA>  FALSE <NA>       NA
## 34     26 nonword           ドソーム  eng  <NA>  FALSE <NA>       NA
## 35     27 nonword             ヘイド  eng  <NA>  FALSE <NA>       NA
## 36     28 nonword         オンテナー  eng  <NA>  FALSE <NA>       NA
## 37     29 nonword         タンサック  eng  <NA>  FALSE <NA>       NA
## 38     30 nonword           フロール  eng  <NA>  FALSE <NA>       NA
## 39     31 nonword アンチヒスタモーネ  eng  <NA>  FALSE <NA>       NA
## 40     32 nonword         パラックス  eng  <NA>  FALSE <NA>       NA
## 41     33 nonword     ハイプノジスト  eng  <NA>  FALSE <NA>       NA
## 42     34 nonword       クロリエイジ  eng  <NA>  FALSE <NA>       NA
## 43     35 nonword         コラプソス  eng  <NA>  FALSE <NA>       NA
## 44     36 nonword             ビキナ  eng  <NA>  FALSE <NA>       NA
## 45     37 nonword スティメレーション  eng  <NA>  FALSE <NA>       NA
## 46     38 nonword         スキマッド  eng  <NA>  FALSE <NA>       NA
## 47     39 nonword     ディロクトネス  eng  <NA>  FALSE <NA>       NA
## 48     40 nonword         ケグファグ  eng  <NA>  FALSE <NA>       NA
##     freq_E
## 1  17.5744
## 2  21.4056
## 3   0.5272
## 4   0.5272
## 5   3.3743
## 6  20.8784
## 7   0.3163
## 8  11.7045
## 9  13.9541
## 10  2.4253
## 11  5.2020
## 12  3.6555
## 13  9.2793
## 14 31.5284
## 15  5.7292
## 16  2.2847
## 17 14.9382
## 18 40.7726
## 19  2.5307
## 20  3.5852
## 21  0.7030
## 22  3.5500
## 23  3.6906
## 24 13.8135
## 25      NA
## 26      NA
## 27      NA
## 28      NA
## 29      NA
## 30      NA
## 31      NA
## 32      NA
## 33      NA
## 34      NA
## 35      NA
## 36      NA
## 37      NA
## 38      NA
## 39      NA
## 40      NA
## 41      NA
## 42      NA
## 43      NA
## 44      NA
## 45      NA
## 46      NA
## 47      NA
## 48      NA
## 
## [[2]]
##    itemID    type               kana lang prime answer form   freq_J
## 1       2  target       インタビュー  eng share   TRUE    A  29.5098
## 2       3  target             コート  eng  spec   TRUE    A 100.7255
## 3       6  target         エイリアン  eng share   TRUE    A  17.4314
## 4       7  target   アポイントメント  eng  spec   TRUE    A  30.5686
## 5      10  target           スタンプ  eng share   TRUE    A   5.9216
## 6      14  target         チャンネル  eng share   TRUE    A  24.4118
## 7      15  target           クロール  eng  spec   TRUE    A  12.0392
## 8      18  target             センス  eng share   TRUE    A 131.8039
## 9      19  target             ベンチ  eng  spec   TRUE    A   9.6667
## 10     22  target     プロモーション  eng share   TRUE    A  10.9216
## 11     23  target               ツナ  eng  spec   TRUE    A   8.0000
## 12      1  target           アイロン  eng  base   TRUE    A  17.9412
## 13      4  target         グラウンド  eng  base   TRUE    A  72.4706
## 14      5  target           アドレス  eng  base   TRUE    A  52.2745
## 15      8  target       プレッシャー  eng  base   TRUE    A  53.1176
## 16      9  target         プロポーズ  eng  base   TRUE    A  13.0000
## 17     12  target         ボリューム  eng  base   TRUE    A   6.9412
## 18     13  target             ベース  eng  base   TRUE    A  35.3725
## 19     16  target       エクスプレス  eng  base   TRUE    A  17.9216
## 20     17  target           ストーブ  eng  base   TRUE    A   7.5882
## 21     20  target           リコール  eng  base   TRUE    A  19.6667
## 22     21  target             レター  eng  base   TRUE    A  82.6078
## 23     24  target             ガッツ  eng  base   TRUE    A  23.7451
## 24     25  target             バイク  eng  base   TRUE    A  25.8824
## 25     17 nonword     ドートレギング  eng  <NA>  FALSE <NA>       NA
## 26     18 nonword     フィスティレド  eng  <NA>  FALSE <NA>       NA
## 27     19 nonword       ストネヘンデ  eng  <NA>  FALSE <NA>       NA
## 28     20 nonword   ポリディフィエス  eng  <NA>  FALSE <NA>       NA
## 29     21 nonword   メストレイヤーズ  eng  <NA>  FALSE <NA>       NA
## 30     22 nonword         ドンスーン  eng  <NA>  FALSE <NA>       NA
## 31     23 nonword           スプラム  eng  <NA>  FALSE <NA>       NA
## 32     24 nonword ティソベディエント  eng  <NA>  FALSE <NA>       NA
## 33     25 nonword             ムイン  eng  <NA>  FALSE <NA>       NA
## 34     26 nonword           ドソーム  eng  <NA>  FALSE <NA>       NA
## 35     27 nonword             ヘイド  eng  <NA>  FALSE <NA>       NA
## 36     28 nonword         オンテナー  eng  <NA>  FALSE <NA>       NA
## 37     29 nonword         タンサック  eng  <NA>  FALSE <NA>       NA
## 38     30 nonword           フロール  eng  <NA>  FALSE <NA>       NA
## 39     31 nonword アンチヒスタモーネ  eng  <NA>  FALSE <NA>       NA
## 40     32 nonword         パラックス  eng  <NA>  FALSE <NA>       NA
## 41     33 nonword     ハイプノジスト  eng  <NA>  FALSE <NA>       NA
## 42     34 nonword       クロリエイジ  eng  <NA>  FALSE <NA>       NA
## 43     35 nonword         コラプソス  eng  <NA>  FALSE <NA>       NA
## 44     36 nonword             ビキナ  eng  <NA>  FALSE <NA>       NA
## 45     37 nonword スティメレーション  eng  <NA>  FALSE <NA>       NA
## 46     38 nonword         スキマッド  eng  <NA>  FALSE <NA>       NA
## 47     39 nonword     ディロクトネス  eng  <NA>  FALSE <NA>       NA
## 48     40 nonword         ケグファグ  eng  <NA>  FALSE <NA>       NA
##     freq_E
## 1  17.5744
## 2  21.4056
## 3   0.5272
## 4   0.5272
## 5   3.3743
## 6  20.8784
## 7   0.3163
## 8  11.7045
## 9  13.9541
## 10  2.4253
## 11  5.2020
## 12  3.6555
## 13  9.2793
## 14 31.5284
## 15  5.7292
## 16  2.2847
## 17 14.9382
## 18 40.7726
## 19  2.5307
## 20  3.5852
## 21  0.7030
## 22  3.5500
## 23  3.6906
## 24 13.8135
## 25      NA
## 26      NA
## 27      NA
## 28      NA
## 29      NA
## 30      NA
## 31      NA
## 32      NA
## 33      NA
## 34      NA
## 35      NA
## 36      NA
## 37      NA
## 38      NA
## 39      NA
## 40      NA
## 41      NA
## 42      NA
## 43      NA
## 44      NA
## 45      NA
## 46      NA
## 47      NA
## 48      NA
## 
## [[3]]
##    itemID    type               kana lang prime answer form   freq_J
## 1       2  target       インタビュー  eng share   TRUE    A  29.5098
## 2       3  target             コート  eng  spec   TRUE    A 100.7255
## 3       6  target         エイリアン  eng share   TRUE    A  17.4314
## 4       7  target   アポイントメント  eng  spec   TRUE    A  30.5686
## 5      10  target           スタンプ  eng share   TRUE    A   5.9216
## 6      14  target         チャンネル  eng share   TRUE    A  24.4118
## 7      15  target           クロール  eng  spec   TRUE    A  12.0392
## 8      18  target             センス  eng share   TRUE    A 131.8039
## 9      19  target             ベンチ  eng  spec   TRUE    A   9.6667
## 10     22  target     プロモーション  eng share   TRUE    A  10.9216
## 11     23  target               ツナ  eng  spec   TRUE    A   8.0000
## 12      1  target           アイロン  eng  base   TRUE    A  17.9412
## 13      4  target         グラウンド  eng  base   TRUE    A  72.4706
## 14      5  target           アドレス  eng  base   TRUE    A  52.2745
## 15      8  target       プレッシャー  eng  base   TRUE    A  53.1176
## 16      9  target         プロポーズ  eng  base   TRUE    A  13.0000
## 17     12  target         ボリューム  eng  base   TRUE    A   6.9412
## 18     13  target             ベース  eng  base   TRUE    A  35.3725
## 19     16  target       エクスプレス  eng  base   TRUE    A  17.9216
## 20     17  target           ストーブ  eng  base   TRUE    A   7.5882
## 21     20  target           リコール  eng  base   TRUE    A  19.6667
## 22     21  target             レター  eng  base   TRUE    A  82.6078
## 23     24  target             ガッツ  eng  base   TRUE    A  23.7451
## 24     25  target             バイク  eng  base   TRUE    A  25.8824
## 25     17 nonword     ドートレギング  eng  <NA>  FALSE <NA>       NA
## 26     18 nonword     フィスティレド  eng  <NA>  FALSE <NA>       NA
## 27     19 nonword       ストネヘンデ  eng  <NA>  FALSE <NA>       NA
## 28     20 nonword   ポリディフィエス  eng  <NA>  FALSE <NA>       NA
## 29     21 nonword   メストレイヤーズ  eng  <NA>  FALSE <NA>       NA
## 30     22 nonword         ドンスーン  eng  <NA>  FALSE <NA>       NA
## 31     23 nonword           スプラム  eng  <NA>  FALSE <NA>       NA
## 32     24 nonword ティソベディエント  eng  <NA>  FALSE <NA>       NA
## 33     25 nonword             ムイン  eng  <NA>  FALSE <NA>       NA
## 34     26 nonword           ドソーム  eng  <NA>  FALSE <NA>       NA
## 35     27 nonword             ヘイド  eng  <NA>  FALSE <NA>       NA
## 36     28 nonword         オンテナー  eng  <NA>  FALSE <NA>       NA
## 37     29 nonword         タンサック  eng  <NA>  FALSE <NA>       NA
## 38     30 nonword           フロール  eng  <NA>  FALSE <NA>       NA
## 39     31 nonword アンチヒスタモーネ  eng  <NA>  FALSE <NA>       NA
## 40     32 nonword         パラックス  eng  <NA>  FALSE <NA>       NA
## 41     33 nonword     ハイプノジスト  eng  <NA>  FALSE <NA>       NA
## 42     34 nonword       クロリエイジ  eng  <NA>  FALSE <NA>       NA
## 43     35 nonword         コラプソス  eng  <NA>  FALSE <NA>       NA
## 44     36 nonword             ビキナ  eng  <NA>  FALSE <NA>       NA
## 45     37 nonword スティメレーション  eng  <NA>  FALSE <NA>       NA
## 46     38 nonword         スキマッド  eng  <NA>  FALSE <NA>       NA
## 47     39 nonword     ディロクトネス  eng  <NA>  FALSE <NA>       NA
## 48     40 nonword         ケグファグ  eng  <NA>  FALSE <NA>       NA
##     freq_E
## 1  17.5744
## 2  21.4056
## 3   0.5272
## 4   0.5272
## 5   3.3743
## 6  20.8784
## 7   0.3163
## 8  11.7045
## 9  13.9541
## 10  2.4253
## 11  5.2020
## 12  3.6555
## 13  9.2793
## 14 31.5284
## 15  5.7292
## 16  2.2847
## 17 14.9382
## 18 40.7726
## 19  2.5307
## 20  3.5852
## 21  0.7030
## 22  3.5500
## 23  3.6906
## 24 13.8135
## 25      NA
## 26      NA
## 27      NA
## 28      NA
## 29      NA
## 30      NA
## 31      NA
## 32      NA
## 33      NA
## 34      NA
## 35      NA
## 36      NA
## 37      NA
## 38      NA
## 39      NA
## 40      NA
## 41      NA
## 42      NA
## 43      NA
## 44      NA
## 45      NA
## 46      NA
## 47      NA
## 48      NA

このように,各行にすべての情報が入ってしまいます。よって,行ごとに入れることを考えないといけません。これを一発できれいにできたらかっこいいんですが,思いつかなかったので,とりあえずfor関数でi行目を取り出してtibbleに入れる,を繰り返すことにしました。まずは,dataのところがリスト型になるようにtibbleを作ります。

tibble::tibble(
  pic=dat$pic,
  word=dat$word,
  data=list()
)->dat3
head(dat3)

しかしここでもまた失敗。dataの列の長さがあってないと怒られてしまいます。これを解決するためにlistの中に空のリストを入れます(正直ここで入れる要素はなんでもOK)。

tibble::tibble(
  pic=dat$pic,
  word=dat$word,
  data=list(list())
)->dat3
dat3
## # A tibble: 48 x 3
##    pic         word        data      
##    <fct>       <fct>       <list>    
##  1 2_C_sh.jpg  interview   <list [0]>
##  2 3_C_sp.jpg  court       <list [0]>
##  3 6_C_sh.jpg  alien       <list [0]>
##  4 7_C_sp.jpg  appointment <list [0]>
##  5 10_C_sh.jpg stamp       <list [0]>
##  6 14_C_sh.jpg channel     <list [0]>
##  7 15_C_sp.jpg crawl       <list [0]>
##  8 18_C_sh.jpg sense       <list [0]>
##  9 19_C_sp.jpg bench       <list [0]>
## 10 22_C_sh.jpg promotion   <list [0]>
## # … with 38 more rows

できあがった dat3 という変数の“data”列に,pic( dat の5列目)とword( dat の3列目)を除いたものを1行目から順にとってきてlistにして,それを dat3 の“data”列に順番にいれていきます。

for (i in 1:length(dat3$pic)){
  dat3[i,3][[1]]<-list(dat[i,c(1,2,4,6,7,8,9,10,11)])
}
head(dat3)
## # A tibble: 6 x 3
##   pic         word        data            
##   <fct>       <fct>       <list>          
## 1 2_C_sh.jpg  interview   <df[,9] [1 × 9]>
## 2 3_C_sp.jpg  court       <df[,9] [1 × 9]>
## 3 6_C_sh.jpg  alien       <df[,9] [1 × 9]>
## 4 7_C_sp.jpg  appointment <df[,9] [1 × 9]>
## 5 10_C_sh.jpg stamp       <df[,9] [1 × 9]>
## 6 14_C_sh.jpg channel     <df[,9] [1 × 9]>

こうすると,できあがったtibbleのdata列には1行目から順に,interview, court,…の刺激の情報が入ることになります。確認のために見てみましょう。

dat3$data[[1]];dat3$data[[2]]
##   itemID   type         kana lang prime answer form  freq_J  freq_E
## 1      2 target インタビュー  eng share   TRUE    A 29.5098 17.5744
##   itemID   type   kana lang prime answer form   freq_J  freq_E
## 2      3 target コート  eng  spec   TRUE    A 100.7255 21.4056

ちゃんと入ってますね。最後に,このtibbleをJSON形式に変換すれば完成です。

toJSON(dat3)
## [{"pic":"2_C_sh.jpg","word":"interview","data":[{"itemID":2,"type":"target","kana":"インタビュー","lang":"eng","prime":"share","answer":true,"form":"A","freq_J":29.5098,"freq_E":17.5744}]},{"pic":"3_C_sp.jpg","word":"court","data":[{"itemID":3,"type":"target","kana":"コート","lang":"eng","prime":"spec","answer":true,"form":"A","freq_J":100.7255,"freq_E":21.4056}]},{"pic":"6_C_sh.jpg","word":"alien","data":[{"itemID":6,"type":"target","kana":"エイリアン","lang":"eng","prime":"share","answer":true,"form":"A","freq_J":17.4314,"freq_E":0.5272}]},{"pic":"7_C_sp.jpg","word":"appointment","data":[{"itemID":7,"type":"target","kana":"アポイントメント","lang":"eng","prime":"spec","answer":true,"form":"A","freq_J":30.5686,"freq_E":0.5272}]},{"pic":"10_C_sh.jpg","word":"stamp","data":[{"itemID":10,"type":"target","kana":"スタンプ","lang":"eng","prime":"share","answer":true,"form":"A","freq_J":5.9216,"freq_E":3.3743}]},{"pic":"14_C_sh.jpg","word":"channel","data":[{"itemID":14,"type":"target","kana":"チャンネル","lang":"eng","prime":"share","answer":true,"form":"A","freq_J":24.4118,"freq_E":20.8784}]},{"pic":"15_C_sp.jpg","word":"crawl","data":[{"itemID":15,"type":"target","kana":"クロール","lang":"eng","prime":"spec","answer":true,"form":"A","freq_J":12.0392,"freq_E":0.3163}]},{"pic":"18_C_sh.jpg","word":"sense","data":[{"itemID":18,"type":"target","kana":"センス","lang":"eng","prime":"share","answer":true,"form":"A","freq_J":131.8039,"freq_E":11.7045}]},{"pic":"19_C_sp.jpg","word":"bench","data":[{"itemID":19,"type":"target","kana":"ベンチ","lang":"eng","prime":"spec","answer":true,"form":"A","freq_J":9.6667,"freq_E":13.9541}]},{"pic":"22_C_sh.jpg","word":"promotion","data":[{"itemID":22,"type":"target","kana":"プロモーション","lang":"eng","prime":"share","answer":true,"form":"A","freq_J":10.9216,"freq_E":2.4253}]},{"pic":"23_C_sp.jpg","word":"tuna","data":[{"itemID":23,"type":"target","kana":"ツナ","lang":"eng","prime":"spec","answer":true,"form":"A","freq_J":8,"freq_E":5.202}]},{"pic":"1_C_b.jpg","word":"iron","data":[{"itemID":1,"type":"target","kana":"アイロン","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":17.9412,"freq_E":3.6555}]},{"pic":"4_C_b.jpg","word":"ground","data":[{"itemID":4,"type":"target","kana":"グラウンド","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":72.4706,"freq_E":9.2793}]},{"pic":"5_C_b.jpg","word":"address","data":[{"itemID":5,"type":"target","kana":"アドレス","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":52.2745,"freq_E":31.5284}]},{"pic":"8_C_b.jpg","word":"pressure","data":[{"itemID":8,"type":"target","kana":"プレッシャー","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":53.1176,"freq_E":5.7292}]},{"pic":"9_C_b.jpg","word":"propose","data":[{"itemID":9,"type":"target","kana":"プロポーズ","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":13,"freq_E":2.2847}]},{"pic":"12_C_b.jpg","word":"volume","data":[{"itemID":12,"type":"target","kana":"ボリューム","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":6.9412,"freq_E":14.9382}]},{"pic":"13_C_b.jpg","word":"base","data":[{"itemID":13,"type":"target","kana":"ベース","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":35.3725,"freq_E":40.7726}]},{"pic":"16_C_b.jpg","word":"express","data":[{"itemID":16,"type":"target","kana":"エクスプレス","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":17.9216,"freq_E":2.5307}]},{"pic":"17_C_b.jpg","word":"stove","data":[{"itemID":17,"type":"target","kana":"ストーブ","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":7.5882,"freq_E":3.5852}]},{"pic":"20_C_b.jpg","word":"recall","data":[{"itemID":20,"type":"target","kana":"リコール","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":19.6667,"freq_E":0.703}]},{"pic":"21_C_b.jpg","word":"letter","data":[{"itemID":21,"type":"target","kana":"レター","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":82.6078,"freq_E":3.55}]},{"pic":"24_C_b.jpg","word":"guts","data":[{"itemID":24,"type":"target","kana":"ガッツ","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":23.7451,"freq_E":3.6906}]},{"pic":"25_C_b.jpg","word":"bike","data":[{"itemID":25,"type":"target","kana":"バイク","lang":"eng","prime":"base","answer":true,"form":"A","freq_J":25.8824,"freq_E":13.8135}]},{"pic":"17_n.jpg","word":"dootlegging","data":[{"itemID":17,"type":"nonword","kana":"ドートレギング","lang":"eng","answer":false}]},{"pic":"18_n.jpg","word":"fistilled","data":[{"itemID":18,"type":"nonword","kana":"フィスティレド","lang":"eng","answer":false}]},{"pic":"19_n.jpg","word":"stonehende","data":[{"itemID":19,"type":"nonword","kana":"ストネヘンデ","lang":"eng","answer":false}]},{"pic":"20_n.jpg","word":"polidifies","data":[{"itemID":20,"type":"nonword","kana":"ポリディフィエス","lang":"eng","answer":false}]},{"pic":"21_n.jpg","word":"mestroyers","data":[{"itemID":21,"type":"nonword","kana":"メストレイヤーズ","lang":"eng","answer":false}]},{"pic":"22_n.jpg","word":"donsoon","data":[{"itemID":22,"type":"nonword","kana":"ドンスーン","lang":"eng","answer":false}]},{"pic":"23_n.jpg","word":"splum","data":[{"itemID":23,"type":"nonword","kana":"スプラム","lang":"eng","answer":false}]},{"pic":"24_n.jpg","word":"tisobedient","data":[{"itemID":24,"type":"nonword","kana":"ティソベディエント","lang":"eng","answer":false}]},{"pic":"25_n.jpg","word":"muin","data":[{"itemID":25,"type":"nonword","kana":"ムイン","lang":"eng","answer":false}]},{"pic":"26_n.jpg","word":"dothorme","data":[{"itemID":26,"type":"nonword","kana":"ドソーム","lang":"eng","answer":false}]},{"pic":"27_n.jpg","word":"hade","data":[{"itemID":27,"type":"nonword","kana":"ヘイド","lang":"eng","answer":false}]},{"pic":"28_n.jpg","word":"ontener","data":[{"itemID":28,"type":"nonword","kana":"オンテナー","lang":"eng","answer":false}]},{"pic":"29_n.jpg","word":"tansack","data":[{"itemID":29,"type":"nonword","kana":"タンサック","lang":"eng","answer":false}]},{"pic":"30_n.jpg","word":"frool","data":[{"itemID":30,"type":"nonword","kana":"フロール","lang":"eng","answer":false}]},{"pic":"31_n.jpg","word":"antihistamone","data":[{"itemID":31,"type":"nonword","kana":"アンチヒスタモーネ","lang":"eng","answer":false}]},{"pic":"32_n.jpg","word":"parracks","data":[{"itemID":32,"type":"nonword","kana":"パラックス","lang":"eng","answer":false}]},{"pic":"33_n.jpg","word":"hypnojist","data":[{"itemID":33,"type":"nonword","kana":"ハイプノジスト","lang":"eng","answer":false}]},{"pic":"34_n.jpg","word":"croilage","data":[{"itemID":34,"type":"nonword","kana":"クロリエイジ","lang":"eng","answer":false}]},{"pic":"35_n.jpg","word":"collapsos","data":[{"itemID":35,"type":"nonword","kana":"コラプソス","lang":"eng","answer":false}]},{"pic":"36_n.jpg","word":"bikina","data":[{"itemID":36,"type":"nonword","kana":"ビキナ","lang":"eng","answer":false}]},{"pic":"37_n.jpg","word":"stimelation","data":[{"itemID":37,"type":"nonword","kana":"スティメレーション","lang":"eng","answer":false}]},{"pic":"38_n.jpg","word":"skimmud","data":[{"itemID":38,"type":"nonword","kana":"スキマッド","lang":"eng","answer":false}]},{"pic":"39_n.jpg","word":"diroctness","data":[{"itemID":39,"type":"nonword","kana":"ディロクトネス","lang":"eng","answer":false}]},{"pic":"40_n.jpg","word":"kegfug","data":[{"itemID":40,"type":"nonword","kana":"ケグファグ","lang":"eng","answer":false}]}]

テキストファイルとして保存する場合は,以下のようにします。

toJSON(dat3) %>%
write(.,file = "json.txt")

おわりに

この記事では,データフレーム形式のものを階層性をもった形でJSON形式に変換するということをやってみました。tibbleという形式ができたことで,データフレームの中にリスト型変数を持つということができます。これができれば,あとは toJSON関数 で一発で変換ができました。もしかしたらもっとエレガントな方法もあるかもしれませんが,とりあえず現状の課題は解決できました。

なにをゆう たむらゆう。

おしまい。


  1. 注: 私はこれまで,大学院で習ったHot Soup Processorというゲームを作る目的で使われることが多いプログラミング言語を使って実験プログラムを作っていました。その際にも,特にRでのデータハンドリングに習熟するようになってからは,刺激を読み込む際に,その刺激の情報も一緒に読み込んで,実験結果の出力時にロング型で表示されるようにしていました。

【R】カタカナの非語を自動生成する

はじめに

実験に使うために作ったのですが,結局ボツになったので,どうやってカタカナの非語を作成しようとしたのかの方法をブログの記事に書くことで成仏させたいと思います。考え方は簡単で,カタカナ語の含まれる変数と,任意の数字が入った変数を作って,後者の変数から任意に1つの数字を選び出し,その数だけカタカナ語のリストから任意に取ってきてくっつける,という感じです。よって,生成される文字列は日本語らしさとかはまったく無視されたものになります(まれに日本語っぽいものや完全に日本語のものもできますランダムなので)。

カタカナのリストを用意

まずはカタカナのリストを作ります。アルファベットとかは簡単なんですが,カタカナのリストがRのデフォルトにはない(たぶん)ので,自分で用意します。ただ,50音の表だと扱いづらいので,カタカナを縦にガーッと並んだものをコピーできたら便利だなと思っていたら,そんなサイトがありました。

http://desilysis.seesaa.net/article/423176853.html

ここにあるものをコピーして,kanaという変数に入れます。ちなみに,この記事で使う「リスト」は一般的な意味で,Rにおける「リスト型」という意味のリストではありませんのでご注意ください。

kana <-read.table("clipboard") #Windows
kana <-read.table(pipe("pbpaste")) #Mac
print(kana)


すると,こんな感じでカタカナが入った変数が手に入ります。read.tableで読み込んでるのでデータフレームになります。濁音と半濁音が抜いてあります。入れてもいいのですが,入れるとそれっぽいカタカナ語が生成されづらくなるというのが理由です。

##    V1
## 1  ア
## 2  イ
## 3  ウ
## 4  エ
## 5  オ
## 6  カ
## 7  キ
## 8  ク
## 9  ケ
## 10 コ
## 11 サ
## 12 シ
## 13 ス
## 14 セ
## 15 ソ
## 16 タ
## 17 チ
## 18 ツ
## 19 テ
## 20 ト
## 21 ナ
## 22 ニ
## 23 ヌ
## 24 ネ
## 25 ノ
## 26 ハ
## 27 ヒ
## 28 フ
## 29 ヘ
## 30 ホ
## 31 マ
## 32 ミ
## 33 ム
## 34 メ
## 35 モ
## 36 ヤ
## 37 ユ
## 38 ヨ
## 39 ラ
## 40 リ
## 41 ル
## 42 レ
## 43 ロ
## 44 ワ
## 45 ヲ
## 46 ン

任意の数字のリストを作る

次に,任意の数字のリストを作ります。もしも,4文字の非語だけで良いというような場合はこの作業はスキップしてもらってOKです。ここでは,3文字から8文字の非語を作ることにします。

kazu <-c(3:8)
print(kazu)
## [1] 3 4 5 6 7 8

これで2つの道具が揃ったので,あとはこの2つを組み合わせるだけです。

カタカナをランダムに組み合わせる

非語をいれるハコを用意

まず,できあがった非語を入れるためのハコを用意します。ここでは,100個作ることにしましょう。 nonword という列に,0を100個いれてます。

dat<- data.frame(nonword=rep(0,100))
print(dat)
##     nonword
## 1         0
## 2         0
## 3         0
## 4         0
## 5         0
## 6         0
## 7         0
## 8         0
## 9         0
## 10        0
## 11        0
## 12        0
## 13        0
## 14        0
## 15        0
## 16        0
## 17        0
## 18        0
## 19        0
## 20        0
## 21        0
## 22        0
## 23        0
## 24        0
## 25        0
## 26        0
## 27        0
## 28        0
## 29        0
## 30        0
## 31        0
## 32        0
## 33        0
## 34        0
## 35        0
## 36        0
## 37        0
## 38        0
## 39        0
## 40        0
## 41        0
## 42        0
## 43        0
## 44        0
## 45        0
## 46        0
## 47        0
## 48        0
## 49        0
## 50        0
## 51        0
## 52        0
## 53        0
## 54        0
## 55        0
## 56        0
## 57        0
## 58        0
## 59        0
## 60        0
## 61        0
## 62        0
## 63        0
## 64        0
## 65        0
## 66        0
## 67        0
## 68        0
## 69        0
## 70        0
## 71        0
## 72        0
## 73        0
## 74        0
## 75        0
## 76        0
## 77        0
## 78        0
## 79        0
## 80        0
## 81        0
## 82        0
## 83        0
## 84        0
## 85        0
## 86        0
## 87        0
## 88        0
## 89        0
## 90        0
## 91        0
## 92        0
## 93        0
## 94        0
## 95        0
## 96        0
## 97        0
## 98        0
## 99        0
## 100       0

forで繰り返す

では,for文を使って,1行目から100行目まで順番に非語をぶちこんでいきます。sample関数は,次のような引数をとります。

sample(x,size,replace=FALSE,prob=NULL)

  • x ->無作為抽出元のベクトル
  • size ->無作為抽出で何個とってくるか
  • replace ->重複ありでとってくるか(同じものが2回でてもいいかどうか)
  • prob ->xの要素が抽出される確率

ここではprobは特にこだわらなくてOKですね。重複はなしでいってみましょう。xはkanaでsizeは3~8がランダムに出てほしいので,ここにもsample関数を使いましょう。つまり,kazuという変数から任意に1つ選んで,その数字の長さの非語を作ろうということです。3がでたなら3文字,7が出たなら7文字ということです。ここを固定した数字にすれば,その文字数の非語のみができます。ということで,以下のような感じで走らせます。

for (i in 1:100){
    dat[i,]<-   paste(as.character(sample(kana[,1],sample(kazu,1))),sep="",collapse="")
    }


kanaというデータフレームの1列目から,kazu(3~8)から選ばれた任意の数字の数だけ要素を無作為に選んできて,paste関数で合体させるということですね。一応,paste関数の中でas.character関数を使って文字列の扱いを指定してますが,なくてもたぶん動くかなと思います。

##              nonword
## 1           サカフヌ
## 2     トセヲクロヨサ
## 3   ケトカヲヤイアタ
## 4   ツヒオセコミルハ
## 5             キセア
## 6     クタロヲマヒモ
## 7       ワニレシヘン
## 8         イキニオレ
## 9           ヤイケマ
## 10    ヌラテホメムネ
## 11  ハヨスヌセリエム
## 12            カリク
## 13            フロヲ
## 14      ルテロヘサタ
## 15      テユヨマクト
## 16        ヲホロケニ
## 17          リミユソ
## 18  ホシヲリカテレミ
## 19          モメスル
## 20        ホキヤコカ
## 21    ネコオモトユレ
## 22          ワラソヲ
## 23            ニユナ
## 24        タフテモス
## 25          キノラケ
## 26            ルヨモ
## 27      トンルフヌロ
## 28        エロスヨフ
## 29  レテキアタホロハ
## 30      キリナコロヘ
## 31          アキタル
## 32        キニユミイ
## 33        トムテルネ
## 34      ホンタヨヌイ
## 35          セエシト
## 36        キテチハソ
## 37        ヌソハチエ
## 38            ヨヒマ
## 39          ハモクシ
## 40    カオトヌリフキ
## 41      ホヨオトカリ
## 42          ヤヌホト
## 43      メクユイソテ
## 44  カフトルムリレマ
## 45        ヤチツテシ
## 46            シヌメ
## 47  ムアコチワノウネ
## 48  ヲリノイヒフウミ
## 49      サムヤトシラ
## 50            ユミケ
## 51        レカフヤン
## 52      ミノリヤタホ
## 53            ツケイ
## 54  ニロネウモトソナ
## 55        レセシノラ
## 56          コヌメニ
## 57          ツユニン
## 58            クトス
## 59          スツヌリ
## 60    メユマヲウチロ
## 61            ネヨタ
## 62      ヤハケミソセ
## 63            リチキ
## 64            ハネマ
## 65          ツノウタ
## 66        ヌツセアラ
## 67          ヘサキウ
## 68      タセルユヲチ
## 69      カンシナテヨ
## 70      ラロモオヲノ
## 71  ホムニヨイリンク
## 72      トロイアネツ
## 73    ケモレクメトア
## 74            ミカセ
## 75          スホアセ
## 76  ラルマノヤキユテ
## 77      ニチノマヤイ
## 78            ワリサ
## 79      ヤラヲスソム
## 80      タトクンシア
## 81      ニフシユトヒ
## 82      トメマケヤオ
## 83        オリクツル
## 84  ラリオホメヘモシ
## 85            オヌエ
## 86        トサヌンス
## 87            ワオウ
## 88        ヒラキメノ
## 89    サエアカラハメ
## 90      ネフミナモワ
## 91            サヤフ
## 92        クヤヨイナ
## 93  コキソユクホマノ
## 94            メムヌ
## 95      オヲユカスン
## 96          ケヌニタ
## 97    ユキラチヨネテ
## 98          ヒレニエ
## 99    メワセモオネク
## 100     ヤタセンノウ


サカフヌとかテユヨマクトとかわけわからないのがたくさんできてますね。もしも,4文字の非語だけで良いということであれば,

for (i in 1:100){
    dat2[i,]<-  paste(as.character(sample(kana[,1],4)),sep="",collapse="")
}


のように, sample(kazu,1) の部分を任意の数字に入れ替えてあげることになります。そうすれば,4文字だけの非語リストが手に入ります。

dat2<- data.frame(nonword=rep(0,100))
for (i in 1:100){
    dat2[i,]<-  paste(as.character(sample(kana[,1],4)),sep="",collapse="")
}
print(dat2)
##      nonword
## 1   スメヘウ
## 2   セイオヒ
## 3   ホラリヤ
## 4   ニチメセ
## 5   ヌナメコ
## 6   ヌサトヤ
## 7   レチシイ
## 8   コフハチ
## 9   ヨヘユハ
## 10  マンツメ
## 11  ヒホソム
## 12  スヲテユ
## 13  スヒチレ
## 14  ルヒホヘ
## 15  テシフユ
## 16  ロテカウ
## 17  トノルニ
## 18  ヨホオハ
## 19  ヨキミチ
## 20  ワナヘノ
## 21  ヌヨナマ
## 22  クタンイ
## 23  ハムンシ
## 24  ネロレナ
## 25  アムネノ
## 26  ハフソト
## 27  ヨスクヌ
## 28  サスキホ
## 29  ヨワツノ
## 30  イトセム
## 31  オセンエ
## 32  ホミレル
## 33  リラハフ
## 34  ツラソカ
## 35  テチサシ
## 36  ツヲヌヒ
## 37  ヲタカム
## 38  ハアワレ
## 39  オクネケ
## 40  ミムルヤ
## 41  ヘテロホ
## 42  アサヤケ
## 43  チヤラウ
## 44  クハサケ
## 45  ンテリム
## 46  メネサム
## 47  マシトリ
## 48  クヌワマ
## 49  ナヤリロ
## 50  ナヤウン
## 51  タンナレ
## 52  メヘオテ
## 53  ソキヨニ
## 54  ソユヘタ
## 55  ルサスノ
## 56  ネウフセ
## 57  ムメシヒ
## 58  ネシムセ
## 59  ケヘシノ
## 60  ヒケルメ
## 61  メンタモ
## 62  エケチコ
## 63  ニチシヤ
## 64  テルメキ
## 65  モツロイ
## 66  エレサセ
## 67  ンスイハ
## 68  アモチセ
## 69  ノヤミネ
## 70  ヨストカ
## 71  ニヒラン
## 72  リノシナ
## 73  ハタヘス
## 74  メオヘセ
## 75  エヘミロ
## 76  トソテマ
## 77  ネイトフ
## 78  スイツヲ
## 79  カセレム
## 80  ツウコユ
## 81  ヤムニネ
## 82  サメネン
## 83  シテフケ
## 84  セロヲヌ
## 85  マシスエ
## 86  オンヤナ
## 87  トルキエ
## 88  ソヘトヌ
## 89  ヒカクニ
## 90  クケコツ
## 91  ヌリルホ
## 92  トサセリ
## 93  コロツム
## 94  ホリトク
## 95  モヲネヘ
## 96  ケシヨフ
## 97  テレメヘ
## 98  ナハヲモ
## 99  オレトル
## 100 レノケマ

おわりに

この記事では,Rを使ってカタカナの非語をランダムに生成するということをやってみました。いつか誰かの役に立ちますように。

なにをゆう たむらゆう。

おしまい。

余談

実は,以前RmarkdownからWordpressに直接流し込む方法という記事を書いていて,その方法を使ってRmarkdownで書いたものをブログ記事にしようとしました。ところが,knit2wp関数がうまくいってないのかエラーが出てしまって,結局うまく行きませんでした。これのために時間溶かすのもなんだかなと思ったので,HTMLで書き出して,それをテキストエディタで開いたものをコピペしてこの記事をつくりました(トホホ

[R] Rmarkdown(xaringan)で学会発表スライド作るときの超初心者メモ

ちょっと放置してあったので一部思い出しながらですがメモ書きです。もう一ヶ月も前になりますが,発表資料をRmarkdownで作って公開するということをしました。これまでならkeynoteで作ってPDFにしてslideshareやspeakerdeckにしてたのですが,分析が結構モリモリでこの部分はすでにRmarkdownで作ってあったので,その部分をベースにして他のスライドを作ってしまうほうが早いと思ってすべてRmarkdownでいくことにしました(結果的にそれで時間が余計にかかった気も笑)。

Rの講習的なものや、論文投稿時に実験データの分析レポートを添えて出す、という時以外でRmarkdownを使う機会が今までなく、学会発表スライドを作るときにいくつかつまずくポイントがあったので、今後同じことにならないように自分用のメモとして残しておきます。基本的なこともきっと含まれていると思うので、本当に初心者向けです。ちなみに、私が使っているのはオンラインプレビューができるxaringanというやつです。

  1. R chunkオプションでcache =T
  2. 画像を2枚並べて表示する
  3. 画像の埋め込みに注意

Cache = Tオプション

分析の結果を提示する際に、R上で分析したものをそのままスライドに埋め込める(いちいち表にまとめ直してパワポに貼り付けるとかの必要がない)というのがRmarkdownの強みですよね。しかし、中には1つの分析にかなりの時間がかかる場合もあります。その分析コードの部分以外のところを修正したりしてknitすると、分析に時間がかかるので修正したかった部分が反映されたのかとかを見るのにも無駄な時間を費やしてしまいます。特に、xaringanはRmdを保存したら自動的にknitするので、こまめに保存しながらやる癖がついていたらなおさら大変です。分析が1度だけならまだしも、いくつも分析がある場合には数時間とかかかることもあるかもしれません。ベイズとかだったらもっとですよね。

で、これを回避するために、分析コードのRチャンクのオプションとしてcache =Tというのがあります。これをすることで、一度knitして分析をすれば、その計算結果を保存しておいてくれます。よって、分析をいちいちし直すことをしないので時間もかかりません。注意点は,この分析コードのあるチャンク内での変更があった場合と、この分析コードのチャンクオプションに変更があった場合にはもう一度分析をやり直すということです。よって,時間を要する分析のコードは最初にcache =Tにして一度knitしてしまい,細かいところをいじるのは後にするというのがいいのかなと思います。

画像を並べて表示

普通にRで描くプロットを並べて出すには,par(mfrow=(c1,2))みたいにしてあげれば1行2列でできますよね。で,xaringanでこれやってもどうしても2枚横並びの表示になりませんでした。そこで色々調べたところ,出力の際の幅を半分にしてあげればよいというアドバイスを見かけたので,Rチャンクオプションでout.width =”50%”としてあげました。画像の解像度はdpiオプションで調整できるので,この2つの組み合わせでいい感じに仕上げてあげればよいのかなと。

画像の埋め込み

これがxaringan使うときのネックになるポイントなのですが,xaringanは画像ファイルなどがself-containedではないんですよね。よって,ウェブ上にスライドを公開しようとしたときにHTMLファイルだけアップロードすればよいというわけにはいきません。GitHubなどに画像ファイルなどもすべてアップロードする必要がありました。もしかすると何か方法があるのかもしれませんが,結局ウェブにアップロードするしか解決策が見つからなかったのでこういう方法にしました。xaringanはオンラインでプレビューできるという点が強みなのですが,アップロードとかにちょっと手間がかかるというのが難点かもしれません。また,画像ファイルもアップロードすることでオンライン上での閲覧は問題なくなりますが,DLすると見た目が変わる&画像が見れないということになるので,他の媒体でPDF公開されているスライドをDLしてオフライン環境で見ることが多いというような方々にとっては,普通にPDFで公開してくれよめんどいなぁということになってしまうのかもしれません。非常に悩ましいです。

おわりに

私自身GitHub初心者なので,毎回やるたびにどうやってやるのかいちいち調べながらやっていて,もしかすると普通のプレゼンソフトでスライド作ったほうが時間かからないんじゃないか…とか思いつつ,無駄なこだわりでRmarkdownを使って投影資料を作るようにしています。他にもいくつかつまづいたポイントがあったような記憶があるのですが,いかんせんもう覚えていないのでとりあえず上記3点だけメモとして残しておきます。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パッケージのモデルにも対応しているようです。まだ試してはいないので,いつかまたブログに書こうかなと思います。

では。

なにをゆう たむらゆう。

おしまい。