2017-08-02 40 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'。 –