2016-09-14 13 views
2

私はいくつかのモデル適合をブートストラップし、毎回モデルを再実行することなく統計を計算しようとしています。最初のdo()の中でr2を計算すると、これはうまくいくが、データにアクセスする方法を知りたい。グループごとのブートストラップと統計の計算

library(dplyr) 
library(tidyr) 
library(modelr) 
library(purrr) 

allmdls <- 
    mtcars %>% 
    group_by(cyl) %>% 
    do({ 
    datsplit=crossv_mc(.,10) 
    mdls=list(map(datsplit$train, ~glm(hp~disp,data=.,family=gaussian(link='identity')))) 
    data_frame(datsplit=list(datsplit),mdls) 
    }) 

、今のようなもの:

allmdls %>% 
    by_slice(dmap,.f=map2_dbl(.$mdls,.$datsplit$test,rsquare)) 

が、私はcの

Error: .y is not a vector (NULL)

または

allmdls %>% 
    group_by(cyl) %>% 
    do({ 
    map2_df(.x=.$mdls, .y=.$datsplit, .f=map2_dbl(.x=.x,.y=.y$test,.f=rsquare)) 
    }) 

Error in map2_dbl(.x = .x, .y = .y$test, .f = rsquare) : object '.x' not found

を取得構文の権利を得ていないようです。

help? おかげ

EDIT:

mtcars %>% 
    group_by(cyl) %>% 
    do({ 
    datplit=crossv_mc(.,10) %>% 
     mutate(mdls=map(train, ~glm(hp~disp,data=.)), 
      r2=map2_dbl(mdls,test,rsquare) 
      pctmae=map2_dbl(mdls,test,function(model,data) {mae(model,data)/mean(model$model$hp,na.rm=T)*100}) 
    ) 
    }) 
+1

リストのこれらのリストはrealtivelyように見えますうまく動作しません。ネストされた 'map2'sで' mutate(allmdls、rsq = map2(mdls、map(datsplit、 "test")、〜map2(.x、.y、rsquare))) 'を実行して、リスト。もしあなたが 'at_depth'でもできることはあるかもしれませんが、このようなリストの複数のリストを使って作業するときは分かりません。 – aosmith

+0

@aosmith私はあなたのソリューションのバリエーションを明らかにしました。これはより簡単で、インスピレーションのおかげでほとんど機能します。私はリストのリストが理想的ではないことに同意します。 引用符で "test"をどうやって知りましたか? – Dominik

+0

クール、あなたは解決策としてそれを置くべきです。 'datsplit'からテストカラムをドル記号で表記し、括弧を取り除く' map(datsplit、 "test") 'は動作しませんでした。 'map'のドキュメンテーションは' .f'のためのこれのかなり良い説明をしています。 – aosmith

答えて

2

一つの選択肢はmutatemap2を使用することです:@ aosmithさんのコメントに おかげで、私はやや簡単な解決策を作成しました。あなたがリストのリストを使用しているので、最も内側のリストにアクセスするためにネストされたmap2で終了しました。ドル記号の演算子も抽出括弧も私のために働いていなかったので、map(datsplit, "test")testのデータを取り出しました。ここで

mutate(allmdls, rsq = map2(mdls, map(datsplit, "test"), ~map2_dbl(.x, .y, rsquare))) 

はすべて一緒にネストされたリストを回避し、別のオプションです:

mtcars %>% 
    split(.$cyl) %>% 
    map_df(crossv_mc, 10, .id = "cyl") %>% 
    mutate(models = map(train, ~glm(hp ~ disp, data = .x)), 
      rsq = map2_dbl(models, test, rsquare)) 
1

@aosmithは私の質問に答えたが、ここで簡単なソリューションである全体的な

mtcars %>% 
    group_by(cyl) %>% 
    do({ 
    datplit=crossv_mc(.,10) %>% 
     mutate(mdls=map(train, ~glm(hp~disp,data=.)), 
      r2=map2_dbl(mdls,test,rsquare) 
      pctmae=map2_dbl(mdls,test,function(model,data) {mae(model,data)/mean(model$model$hp,na.rm=T)*100}) 
    ) 
    }) 
関連する問題