Rでサンプルデータを作成するのが難しかったので、作ってみた
一昨日の勉強会で、参加者全員でモデルに当てはまるサンプルデータをRで作ってみようとなった時になかなか良いサンプルを作れなかったので、落ち着いて作ってみる。 data-refinement.connpass.com
勉強会の内容と作成するモデル
勉強会の内容は、発表者のSSAS3さんが書いてくれたこれ。ランダム化実験が驚くほどよくわかってすごかった。 qiita.com
作りたいサンプルは以下の条件を満たすことだけで、あとは適当でOKという条件(少し勉強会のときから条件を変えています)
Y1(任意) | Y2(ランダム) | |
---|---|---|
作業手伝いなし | a | b |
作業手伝いあり | A | B |
a,b,A,Bはテストの点数の平均。
- a<A
- 任意にやらせると、準備が整っている生徒が作業をするので、作業ありの方が点数が高くなる
- b>B
- ランダムで作業をやらせると、作業なしグループは準備ができるので点数が高くなる
使う関数の候補
関数 | 概要 |
---|---|
rnorm | 正規分布に従う乱数を発生 |
runif | 一様分布に従う乱数を発生 |
sumple | 無作為抽出 |
round | 少数点以下を丸める |
floor | 少数点以下を繰り下げ |
ceiling | 小数点以下を繰り上げ |
練習
n <- 10 # クラスの人数を10人とする pre <- runif(n,min=-1,max=1) # 一様分布から乱数を作成 ceiling(pre) # preを切り上げて、0と1にする sample(c(1,0),size=n,replace=TRUE) #ランダムでトリートメントグループとコントロールグループに分ける sample(rep(c(1,0),times=n/2),size=n) # 半分ずつトリートメントグループとコントロールグループに分ける sample(rep(c(1,0),times=c(10,30)),size=n) #10人、30人のトリートメントグループとコントロールグループに分ける
サンプルデータ作成
library(dplyr) set.seed(2) NO <- 1:40 # 出席番号 pre <- runif(40,-1,1) # 準備ができているか Tvol <- ceiling(pre) # 準備ができていれば1で作業を手伝う、できていなければ0で作業を手伝わない y1 <- round(pre*20+70) +(1-Tvol)*sample(1:5,40,replace=TRUE) # 1回目の点数 Trand <-sample(c(0,1),40,replace = TRUE) # ランダムに作業手伝いを決める y2 <- round(pre*20+70)+(1-Trand)*sample(1:5,40,replace=TRUE) # 2回目の点数 sample1 <- data.frame(出席番号=NO,Tvol,y1,Trand,y2) # データフレームを作成 # 1回目の小テストをクロス集計 sample1 %>% group_by(Tvol) %>% summarise(n=length(y1),mean=mean(y1)) # 2回目のテストをクロス集計 sample1 %>% group_by(Trand) %>% summarise(n=length(y2),mean=mean(y2))
jupyterのファイルを下記にあげています。 他にもやり方が色々あるだろうから、コメントとか次の勉強会で教えてください。