を複数のモデルフィッティング、リサンプリングデータをlist-columnsを使用して編成されている:modelr:リサンプリングデータと<a href="https://github.com/hadley/modelr" rel="noreferrer"><code>modelr</code></a>に実装<a href="http://r4ds.had.co.nz/" rel="noreferrer">tidy model of data science (TM)</a>で
library(modelr)
library(tidyverse)
# create the k-folds
df_heights_resampled = heights %>%
crossv_kfold(k = 10, id = "Resample ID")
これは、リストの列のトレーニングデータセットの各々にmap
モデルに可能ですtrain
を使用し、map
によってリストの列test
にpingすることによってパフォーマンスメトリックを計算します。
複数のモデルでこれを行う必要がある場合は、モデルごとにこれを繰り返す必要があります。与え
# create a list of formulas
formulas_heights = formulas(
.response = ~ income,
model1 = ~ height + weight + marital + sex,
model2 = ~ height + weight + marital + sex + education
)
# fit each of the models in the list of formulas
df_heights_resampled = df_heights_resampled %>%
mutate(
model1 = map(train, function(train_data) {
lm(formulas_heights[[1]], data = train_data)
}),
model2 = map(train, function(train_data) {
lm(formulas_heights[[2]], data = train_data)
})
)
# score the models on the test sets
df_heights_resampled = df_heights_resampled %>%
mutate(
rmse1 = map2_dbl(.x = model1, .y = test, .f = rmse),
rmse2 = map2_dbl(.x = model2, .y = test, .f = rmse)
)
:
> df_heights_resampled
# A tibble: 10 × 7
train test `Resample ID` model1 model2 rmse1 rmse2
<list> <list> <chr> <list> <list> <dbl> <dbl>
1 <S3: resample> <S3: resample> 01 <S3: lm> <S3: lm> 58018.35 53903.99
2 <S3: resample> <S3: resample> 02 <S3: lm> <S3: lm> 55117.37 50279.38
3 <S3: resample> <S3: resample> 03 <S3: lm> <S3: lm> 49005.82 44613.93
4 <S3: resample> <S3: resample> 04 <S3: lm> <S3: lm> 55437.07 51068.90
5 <S3: resample> <S3: resample> 05 <S3: lm> <S3: lm> 48845.35 44673.88
6 <S3: resample> <S3: resample> 06 <S3: lm> <S3: lm> 58226.69 54010.50
7 <S3: resample> <S3: resample> 07 <S3: lm> <S3: lm> 56571.93 53322.41
8 <S3: resample> <S3: resample> 08 <S3: lm> <S3: lm> 46084.82 42294.50
9 <S3: resample> <S3: resample> 09 <S3: lm> <S3: lm> 59762.22 54814.55
10 <S3: resample> <S3: resample> 10 <S3: lm> <S3: lm> 45328.48 41882.79
質問:
これは本当に速い探求するモデルの数が多い場合に面倒な取得することができます。 modelr
は、複数のモデル(複数の数式によって特徴付けられる)上で反復することを可能にするが、上記のモデルではtrain
のようなリスト列を考慮しないようにする関数fit_with
を提供する。私は*map*
ファシリティファミリの1つがこれを可能にすると仮定していますが(invoke_map
?)、どうやって調べることができませんでした。
私は、このソリューションが好き、私はそこにあると思います私が[modelr'のissueページに投稿した]もっと簡単な解決策です(https:// github。com/hadley/modelr/issues/31#issuecomment-255596156)。残りの問題は、そのリスト列をその構成要素に分割することです。そのために、私は確信しています(そうすべきです)。 – tchakravarty
あなたはいつも自分の質問に答えることができますが、data.frame内のリストのリストは多少なりともかもしれません。 – Axeman
私はそれをリスト列からどのように分割するかを理解するまで完全な解決策ではありません。それは他のすべてのようなS3オブジェクトの列です。 :-) – tchakravarty