通过不同的数据帧进行循环回归
Loop regression through different data frames
目标是对不同的训练数据帧进行多重逻辑回归,然后评估各自测试数据集的性能。
首先,我们从 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)
现在我们想在每个训练数据帧上循环一个逻辑回归。这是第一个问题,因为我们只能将输出创建到矩阵或列表中。
我们交替创建随机样本的列表、数据框或矩阵:
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
创建了一个列表和sapply
每个估计结果的矩阵。
目标是获得 glm
对象形式的输出,以便使用每个 train glm 进行预测,从而能够评估模型不同 test-/train 数据星座的性能:
lr_test_1 <- predict(lr_train_1, random_df_1[test, ], type="response")
非常感谢任何帮助。
我很确定你误解了 lapply
的使用和输出。它循环输入并创建一个对象列表,这些对象是您使用的函数输出的典型 class。
如果我没看错你的代码,这部分
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)})
然后 mapply
你的 predict
在 glm 对象列表上。
lr_test <- mapply(function(x, y) predict(x, y[test, ], type = "response"), lr_train, lr_list)
请注意,由于缺少工作数据示例,此内容未经测试。
好吧,不久前我学到了 dplyr
和 purrr
包的技巧。这是关于使用嵌套 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))
您可以对每个具有 mutate()
和 map()
相似结构的 glm 进行预测
目标是对不同的训练数据帧进行多重逻辑回归,然后评估各自测试数据集的性能。
首先,我们从 df
:
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)
现在我们想在每个训练数据帧上循环一个逻辑回归。这是第一个问题,因为我们只能将输出创建到矩阵或列表中。 我们交替创建随机样本的列表、数据框或矩阵:
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
创建了一个列表和sapply
每个估计结果的矩阵。
目标是获得 glm
对象形式的输出,以便使用每个 train glm 进行预测,从而能够评估模型不同 test-/train 数据星座的性能:
lr_test_1 <- predict(lr_train_1, random_df_1[test, ], type="response")
非常感谢任何帮助。
我很确定你误解了 lapply
的使用和输出。它循环输入并创建一个对象列表,这些对象是您使用的函数输出的典型 class。
如果我没看错你的代码,这部分
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)})
然后 mapply
你的 predict
在 glm 对象列表上。
lr_test <- mapply(function(x, y) predict(x, y[test, ], type = "response"), lr_train, lr_list)
请注意,由于缺少工作数据示例,此内容未经测试。
好吧,不久前我学到了 dplyr
和 purrr
包的技巧。这是关于使用嵌套 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))
您可以对每个具有 mutate()
和 map()