2017-12-24 19 views
3

多項式の項のみが異なるモデルのrmseを比較する次のコードがあります。若干異なるモデルを繰り返し計算する

library(tidyverse) 
data(mtcars) 
cv_mtcars = mtcars %>% 
    crossv_kfold(k = 10) 
cv_mtcars %>% 
    mutate(model1 = map(train, ~lm(disp ~ wt, data = .)), 
     model2 = map(train, ~lm(disp ~I(wt^2), data = .)), 
     model3 = map(train, ~lm(disp ~I(wt^3), data = .)),   
     model4 = map(train, ~lm(disp ~I(wt^4), data = .)), 
     model5 = map(train, ~lm(disp ~I(wt^5), data = .)), 
     model6 = map(train, ~lm(disp ~I(wt^6), data = .)), 
     order1 = map2_dbl(model1, test, ~rmse(.x, .y)), 
     order2 = map2_dbl(model2, test, ~rmse(.x, .y)), 
     order3 = map2_dbl(model3, test, ~rmse(.x, .y)), 
     order4 = map2_dbl(model4, test, ~rmse(.x, .y)), 
     order5 = map2_dbl(model5, test, ~rmse(.x, .y)), 
     order6 = map2_dbl(model6, test, ~rmse(.x, .y))) %>% 
    select(order1,order2,order3,order4,order5,order6) %>% gather(1:6,key=model,value=value) %>% 
    ggplot()+ 
    geom_point(aes(x=factor(model),y=value))+ 
    labs(y="rmse",x="polynomial",title="Model Assesment",subtitle="disp~I(wt^x)") 

私のモデルをより効率的に反復する方法はありますか?私は必要以上のコードを書いているような気がします。

答えて

2

mapの外側の呼び出しを持つモデルを繰り返して、多項式の次数を反復し、mapの内部呼び出しを10回繰り返すことができます。以下のコードでは、I(wt^i)の代わりにpoly(wt, i)を使用しました。I(wt^i)は最高次数の項のみを持つ多項式を生成し、poly(wt, i)は最高次数までのすべての次数の項を持つ多項式を生成するためです。私はmodel_cvオブジェクトの各折りたたみについてrmseを保存しましたが、もちろんggplotに直接パイプすることができます。

set.seed(50) 
model_cv = setNames(1:6, 1:6) %>% 
    map_df(function(i) { 
    map2_dbl(cv_mtcars[["train"]], cv_mtcars[["test"]], function(train, test) { 
     model = lm(disp ~ poly(wt,i), data=train) 
     rmse(model, test) 
    }) 
    }) %>% 
    gather(`Polynomial Order`, rmse) 

ggplot(model_cv, aes(`Polynomial Order`, rmse)) + 
    geom_point() + 
    stat_summary(fun.y=mean, geom="point", pch="_", colour="red", size=7) + 
    labs(title="Model Assesment",subtitle="disp ~ poly(wt, order)") 

enter image description here

関連する問題