2017-08-02 22 views
0

目標是在不同的訓練數據框上執行多個logit迴歸,然後評估各個測試數據集的性能。通過不同的數據幀迴路迴歸

首先,我們從df創建多個(5)隨機取樣的數據幀:

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

然後,我們創建用於分離指標分成訓練 - 和測試集:

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

現在我們想要在每個訓練數據框上循環logit迴歸。這是第一個問題,因爲我們只能將輸出創建爲矩陣或列表。 此外,我們也創造了隨機樣本的列表,數據幀或矩陣:

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

然後,我們遍歷列表中的所有數據幀分對數迴歸:

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)})) 
} 

這裏lapply創建一個列表和每個估計結果的矩陣。

的目標是獲得在一個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'package設置**? – 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)})) 
} 

基本上循環兩次過同樣的事情,因此創建五個相同的列表。

相反,只需使用:

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

,然後mapplypredict在GLM對象的列表。

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 < - lapply(lr_list,function(x){table(x $ y [test],lr_estim,dnn = c(「real」,「prediction」))})創建一個列表。下一個問題在於從_lr_tab_創建一個'prop.table',因爲它是一個列表,而不是一張表。謝謝你的幫助。 – Dima

0

那麼,不久前我學到了一個包裝dplyrpurrr的招數。這是關於使用嵌套data.frame工作:

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

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 

輸出從我的快速模擬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)) 

您可以預測每個GLM具有相似結構的mutate()map()

+0

您需要使用map2/pmap進行預測...%>%mutate(pred = map2(model,data,predict)) –

+0

map屬於哪個軟件包? – Dima

+0

@Dima在我的回答中發現了一個錯誤,包'purrr'。 –