将数据集拆分为列表并重叠lm model R
我试图使用将数据集拆分为列表并重叠lm model R,r,split,lapply,lm,R,Split,Lapply,Lm,我试图使用caret包在我的数据集中应用lm模型 可复制示例: df <- data.frame(x = 1:10000, y = sample(1:1000, 10000, replace = TRUE), group = sample(c('A', 'B', 'C'), 10000, replace = TRUE, prob = c(.1, .5, .4))) df_list <- split(df, df$group) df_list <- lapply(df_lis
caret
包在我的数据集中应用lm
模型
可复制示例:
df <- data.frame(x = 1:10000, y = sample(1:1000, 10000, replace = TRUE), group = sample(c('A', 'B', 'C'), 10000, replace = TRUE, prob = c(.1, .5, .4)))
df_list <- split(df, df$group)
df_list <- lapply(df_list, function(x) select(x, -group))
我认为这是一个围绕列表结构工作的简单问题,但出于某种原因,我对它有一些问题。谢谢你的帮助 createDataPartition接受向量,而不是数据帧:
train_test <- lapply(df_list, function(x) createDataPartition(x$y, p = .8, list = FALSE))
train\u testcreateDataPartition接受向量,而不是数据帧:
train_test <- lapply(df_list, function(x) createDataPartition(x$y, p = .8, list = FALSE))
train\u test我认为分区错误是由于createDataPartition
需要向量而不是数据帧。我认为你可以做到:
train_test <- lapply(df_list, function(x) {
x[createDataPartition(x$x, p = 0.8, list = FALSE),]
})
train\u test我认为分区错误是由于createDataPartition
需要向量而不是数据帧。我认为你可以做到:
train_test <- lapply(df_list, function(x) {
x[createDataPartition(x$x, p = 0.8, list = FALSE),]
})
train\u test如果在控制台中键入?createDataPartition
,则可以看到该功能的正确用法
train_test <- lapply(df_list, function(x) createDataPartition(x, p = .8, list = FALSE))
model_list <- lapply(train_test, function(z) train(x ~ ., z, method = 'lm', trControl = trainControl(method = 'cv', number = 10, verboseIter = TRUE), preProcess = c('nzv', 'center', 'scale'))
也就是说,它的通用格式如下:
createDataPartition(y, times = 1, p = 0.5, list = TRUE, groups = min(5,
length(y)))
train_test <- lapply(df_list, function(x) {
return(createDataPartition(x$y, p = .8, list = FALSE))
})
model_list <- purrr::map2(df_list, train_test,
function(df, train_index) {
train(x ~ ., df[train_index,],
method = 'lm',
trControl = trainControl(method = 'cv',
number = 10,
verboseIter = TRUE),
preProcess = c('nzv', 'center', 'scale'))
})
其中,y
是“结果向量”。它特别需要结果的原因是为了使训练和测试的分割对于结果变量是平衡的(我假设在您的案例中是y
)
因此,您没有使用以下代码:
train_test <- lapply(df_list, function(x) createDataPartition(x, p = .8, list = FALSE))
请注意,purrr的map2函数类似于sappy/lappy(其中sappy/lappy为列表中的每个元素调用一个函数)。唯一的区别是map2在2列表(df_列表和train_测试)上迭代
我希望这有帮助
编辑:如果您想了解有关插入符号包的更多信息,我建议您使用以下链接:如果您在控制台中键入?createDataPartition
,您可以看到该函数的正确用法
train_test <- lapply(df_list, function(x) createDataPartition(x, p = .8, list = FALSE))
model_list <- lapply(train_test, function(z) train(x ~ ., z, method = 'lm', trControl = trainControl(method = 'cv', number = 10, verboseIter = TRUE), preProcess = c('nzv', 'center', 'scale'))
也就是说,它的通用格式如下:
createDataPartition(y, times = 1, p = 0.5, list = TRUE, groups = min(5,
length(y)))
train_test <- lapply(df_list, function(x) {
return(createDataPartition(x$y, p = .8, list = FALSE))
})
model_list <- purrr::map2(df_list, train_test,
function(df, train_index) {
train(x ~ ., df[train_index,],
method = 'lm',
trControl = trainControl(method = 'cv',
number = 10,
verboseIter = TRUE),
preProcess = c('nzv', 'center', 'scale'))
})
其中,y
是“结果向量”。它特别需要结果的原因是为了使训练和测试的分割对于结果变量是平衡的(我假设在您的案例中是y
)
因此,您没有使用以下代码:
train_test <- lapply(df_list, function(x) createDataPartition(x, p = .8, list = FALSE))
请注意,purrr的map2函数类似于sappy/lappy(其中sappy/lappy为列表中的每个元素调用一个函数)。唯一的区别是map2在2列表(df_列表和train_测试)上迭代
我希望这有帮助
编辑:如果您想了解有关插入符号软件包的更多信息,我建议您使用以下链接:这里有一个purrr
列表列tidyverse
-符合Jenny Bryan启发的解决方案。请提供您的意见,您将如何使其更干净
library(dplyr)
library(tidyr)
library(purrr)
df <- data.frame(x = 1:10000, y = sample(1:1000, 10000, replace = TRUE),
group = sample(c('A', 'B', 'C'), 10000, replace = TRUE, prob = c(.1, .5, .4)))
df %>% group_by(group) %>% nest() %>%
mutate(dataPart = map(data, ~caret::createDataPartition(.x$x, p = .8, list = FALSE) )) %>%
mutate(model_list = map2(data, dataPart, ~caret::train(x ~ .,
data=.x[.y,],
method = 'lm',
trControl = caret::trainControl(method = 'cv', number = 10, verboseIter = TRUE),
preProcess = c('nzv', 'center', 'scale'))),
oof_prediction=pmap(list(data, dataPart, model_list), ~caret::predict.train(..3, newdata=..1[-..2, ])),
oof_error=pmap(list(data, dataPart, oof_prediction), ~caret::postResample(..3, ..1$x[-..2])),
oof_error=map(oof_error, ~as.data.frame(t(.x)))) %>%
unnest(oof_error)
库(dplyr)
图书馆(tidyr)
图书馆(purrr)
df%group_by(组)%%>%nest()%%>%
mutate(dataPart=map(数据,~caret::createDataPartition(.x$x,p=.8,list=FALSE))%>%
mutate(model_list=map2(data,dataPart,~caret::train(x~。)。,
数据=.x[.y,],
方法='lm',
trControl=caret::trainControl(方法='cv',数字=10,verbositer=TRUE),
预处理=c('nzv','center','scale'),
oof_prediction=pmap(列表(数据、数据部分、模型列表),~caret::predict.train(..3,newdata=..1[-..2,]),
oof_error=pmap(列表(数据、数据部分、oof_预测),~caret::postResample(..3,..1$x[-..2]),
oof_error=map(oof_error,~as.data.frame(t(.x)))%>%
unnest(oof_错误)
在data.frame中发生的事情保留在data.frame中-Hadley Wickham
#一个tible:3 x 7
分组数据部分模型列表oof预测RMSE平方
1 C 2902.691 2.386907e-05
2 B 2832.764 3.075320e-04
3 A 2861.664 3.438135e-03
这里有一个purrr
列表列tidyverse
符合Jenny Bryan灵感的解决方案。请提供您的意见,您将如何使其更干净
library(dplyr)
library(tidyr)
library(purrr)
df <- data.frame(x = 1:10000, y = sample(1:1000, 10000, replace = TRUE),
group = sample(c('A', 'B', 'C'), 10000, replace = TRUE, prob = c(.1, .5, .4)))
df %>% group_by(group) %>% nest() %>%
mutate(dataPart = map(data, ~caret::createDataPartition(.x$x, p = .8, list = FALSE) )) %>%
mutate(model_list = map2(data, dataPart, ~caret::train(x ~ .,
data=.x[.y,],
method = 'lm',
trControl = caret::trainControl(method = 'cv', number = 10, verboseIter = TRUE),
preProcess = c('nzv', 'center', 'scale'))),
oof_prediction=pmap(list(data, dataPart, model_list), ~caret::predict.train(..3, newdata=..1[-..2, ])),
oof_error=pmap(list(data, dataPart, oof_prediction), ~caret::postResample(..3, ..1$x[-..2])),
oof_error=map(oof_error, ~as.data.frame(t(.x)))) %>%
unnest(oof_error)
库(dplyr)
图书馆(tidyr)
图书馆(purrr)
df%group_by(组)%%>%nest()%%>%
mutate(dataPart=map(数据,~caret::createDataPartition(.x$x,p=.8,list=FALSE))%>%
mutate(model_list=map2(data,dataPart,~caret::train(x~。)。,
数据=.x[.y,],
方法='lm',
trControl=caret::trainControl(方法='cv',数字=10,verbositer=TRUE),
预处理=c('nzv','center','scale'),
oof_prediction=pmap(列表(数据、数据部分、模型列表),~caret::predict.train(..3,newdata=..1[-..2,]),
oof_error=pmap(列表(数据、数据部分、oof_预测),~caret::postResample(..3,..1$x[-..2]),
oof_error=map(oof_error,~as.data.frame(t(.x)))%>%
unnest(oof_错误)
在data.frame中发生的事情保留在data.frame中-Hadley Wickham
#一个tible:3 x 7
分组数据部分模型列表oof预测RMSE平方
1 C 2902.691 2.386907e-05
2 B 2832.764 3.075320e-04
3 A 2861.664 3.438135e-03
对不起-你说得对。实际上,我确实这样做了,但后来遇到了一个问题,即通过基于这些索引的训练集和测试集列表进一步细分split_df
列表。这有道理吗?对不起,你说得对。实际上,我确实这样做了,但后来遇到了一个问题,即通过基于这些索引的训练集和测试集列表进一步细分split_df
列表。这有意义吗?非常感谢。这太完美了。出于某种原因,我知道它会返回一个索引向量,但忘记了包含我用该索引向量对训练和测试数据集进行子集的步骤。我希望得到一个列表列表,或者是一个元素为t的列表