層別サンプリングした結果を綺麗に持ちたい
層別サンプリングをするには、samplingパッケージのstrata関数使えばいいんだけど、出力とインターフェイスがイケてないのでラップする。
下記の`stratified_sampling`関数を使えば、各層(クラス)の割合を一定に保ったままサンプリングしてくれる。
library("sampling") stratified_sampling <- function(df, name, size) { sizes <- df %>% count_(name) %>% mutate(size_sampling=round(n/nrow(df)*size)) %>% select(size_sampling) %>% unlist %>% as.numeric getdata(df, strata(df, name, size=sizes, method="srswor"))[, colnames(df)] }
実行結果
> stratified_sampling(iris, "Species", 9) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 5 5.0 3.6 1.4 0.2 setosa 14 4.3 3.0 1.1 0.1 setosa 25 4.8 3.4 1.9 0.2 setosa 65 5.6 2.9 3.6 1.3 versicolor 82 5.5 2.4 3.7 1.0 versicolor 93 5.8 2.6 4.0 1.2 versicolor 102 5.8 2.7 5.1 1.9 virginica 109 6.7 2.5 5.8 1.8 virginica 147 6.3 2.5 5.0 1.9 virginica
これでCross Validationするのに使うには、どのデータがどこから来たのか覚えるようにしないとだめだなぁ。。。