2017-08-02 9 views
0

目標は、異なるトレーニングデータフレームで複数のロジット回帰を行い、それぞれのテストデータセットのパフォーマンスを評価することです。異なるデータフレームによるループ回帰

まず、dfから複数の(5)ランダムにサンプリングされたデータフレームを作成する:

for(i in 1:5) { 
nr <- paste("random_df", i, sep = "_") 
assign(nr, random_df[sample(nrow(df)),]) 
} 

そして、我々はtraining-とテストセットに分離するための指標を作成する:我々は今

train <- 1:(length(df$y)*0.8) 
test <- !(1:nrow(df) %in% train) 

各訓練データフレームにわたってロジット回帰をループさせたい。ここでは最初の問題があります。行列やリストへの出力しか作成できないからです。ここでlapply

for(i in 1:5) { 
    index <- paste("lr_train", i, sep = "_") 
    assign(index, lapply(lr_list, function(x) {glm(y ~ x1 + x2, data=x, 
    subset=train, family=binomial)})) 
} 

リストを作成します。私たちはループリスト内のすべてのデータフレームの上にロジット回帰は、次に

lr_list <- list(random_df_1,random_df_2,random_df_3,random_df_4,random_df_5) 

: は、我々は、代わりに、ランダムなサンプルのリスト、データフレームや行列を作成します各推定結果のマトリクスを算出する。

目標は、各列車GLMを使用して予測を行い、したがって、異なる試験 - /鉄道データ星座全体でモデルの性能を評価することができるようにするためにglmオブジェクトの形式で出力を得ることです

lr_test_1 <- predict(lr_train_1, random_df_1[test, ], type="response") 

ご協力いただきありがとうございます。

+0

'modelr'パッケージをチェックアウトする必要があります。これは多くのことを楽にしてくれます:https://github.com/tidyverse/modelr –

+0

Thanks @AndrewBrēza「リサンプル」だけでなく、複数の列車とテストでモデルを評価する方法のヒントを教えてください'modelr'パッケージを使って**を設定しますか? – Dima

答えて

2

lapplyの使用と出力を誤解していると思います。入力をループし、使用した関数出力の典型的なクラスであるオブジェクトのリストを作成します。

私が正しくあなたのコードを読めば、この部分

for(i in 1:5) { 
    index <- paste("lr_train", i, sep = "_") 
    assign(index, lapply(lr_list, function(x) {glm(y ~ x1 + x2, data=x, 
    subset=train, family=binomial)})) 
} 

は、本質的にそのため5つの同一のリストを作成し、同じものの上に二回ループしています。

は代わりに、ちょうど使用:

lr_train <- lapply(lr_list, function(x) {glm(y ~ x1 + x2, data=x, 
     subset=train, family=binomial)}) 

とGLMオブジェクトのリストの上に、その後mapplyあなたpredict

lr_test <- mapply(function(x, y) predict(x, y[test, ], type = "response"), lr_train, lr_list) 

実際のデータの例がないため、これはテストされていないことに注意してください。

+1

ありがとう@Leo P.これはうまくいきましたが、テストされていません。そして、私たちは正しく、私は 'lappy'を誤解しました。 'lr_estim < - cut(lr_test、breaks = c(-Inf、.5、Inf)、labels = c(0,1))'を使って要素を作成しました。そして、lr_tab Dima

0

まあ、以前は、dplyrpurrrパッケージのトリックを学んだ。

nested_df <- tibble(subdf = 1:5) %>% # Choose number of 'random_df' 
    rowwise() %>% 
    mutate(data = list(df[sample(nrow(df)),])) %>% # create a list of random data.frames within our data.frame 
    ungroup() %>% 
    mutate(model = map(data, ~ glm(y ~ x1 + x2, data = .x, 
            subset = train, family = binomial))) # iterate with map throug all of data.frame's in column data 


nested_df 

    subdf     data  model 
    <int>     <list> <list> 
1  1 <data.frame [100 x 3]> <S3: glm> 
2  2 <data.frame [100 x 3]> <S3: glm> 
3  3 <data.frame [100 x 3]> <S3: glm> 
4  4 <data.frame [100 x 3]> <S3: glm> 
5  5 <data.frame [100 x 3]> <S3: glm> 

そして、我々が見ることができ、すべてのmodel:それは、ネストされたdata.frameでの作業についてです

nested_df$model[[1]] 

Call: glm(formula = y ~ x1 + x2, family = binomial, data = .x, subset = train) 

Coefficients: 
(Intercept)   x1b   x1c   x2 
    3.467e+00 -5.085e-03 1.300e-02 9.368e-05 

Degrees of Freedom: 79 Total (i.e. Null); 76 Residual 
Null Deviance:  0.3428 
Residual Deviance: 0.3408 AIC: 12.7 

出力は、各GLMのための予測を行うことができ、私の迅速df

df <- data.frame(y = rnorm(100, 100), 
       x1 = sample(letters[1:3], size = 100, replace = T), 
       x2 = runif(100 ,0, 1000)) %>% 
    mutate(y = y/max(y)) 

シミュレートからです類似の構造のmutate()map()

+0

予測のためにmap2/pmapを使う必要があります。%>%mutate(pred = map2(model、data、predict)) –

+0

'map'はどのパッケージに属していますか? – Dima

+0

@Dimaは私の答えに間違いを犯しました。パッケージ「purrr」。 –