R脚本和包含多个csv文件格式数据集的文件夹的简化版本都可以在我的GitHub Repository中找到,该Repository位于Link中。
在名为“LASSO代码”的脚本中,将一个文件夹加载到R中,文件夹中装满了N个csv文件格式的数据集,并将它们分配到一个名为“datasets”的列表中,然后运行以下代码来拟合N个LASSO回归,每个数据集对应一个:
set.seed(11) # to ensure replicability
LASSO_fits <- lapply(dfs, function(i)
enet(x = as.matrix(select(i, starts_with("X"))),
y = i$Y, lambda = 0, normalize = FALSE))
现在,我想为向后消除逐步回归重复相同的过程,我们将保持简单,只需使用stats库中的step()函数)使用另一个apply函数,而不必使用循环。问题是,我知道如何做到这一点,唯一的方法是在运行之前初始化或准备它,首先建立:
set.seed(100) # for reproducibility
full_fits <- vector("list", length = length(dfs))
Backward_Stepwise_fits <- vector("list", length = length(dfs))
然后才拟合所有的Backward_Stepwise_fits,但是我不知道如何把full_fits和Backward_Stepwise_fits放到同一个apply函数中,我能想到的唯一方法是使用一个for循环,把它们一个一个的堆在里面,但是那会是非常低效的计算,而我将运行这两个函数的数据集N的数量是260,000!
我写了一个for循环,它确实可以运行,但是在58,500个数据集上运行需要12个小时,这是无法接受的慢。
set.seed(100) # for reproducibility
for(i in seq_along(dfs)) {
full_fits[[i]] <- lm(formula = Y ~ ., data = dfs[[i]])
Backward_Stepwise_fits[[i]] <- step(object = full_fits[[i]],
scope = formula(full_fits[[i]]),
direction = 'backward', trace = 0) }
我已尝试执行以下操作,但在控制台中得到相应的错误消息:
> full_model_fits <- lapply(datasets, function(i)
+ lm(formula = Y ~ ., data = datasets))
Error in terms.formula(formula, data = data) :
duplicated name 'X1' in data frame using '.'
1条答案
按热度按时间rta7y2nd1#
有没有想过把整个事情并行化?
首先,您可以更简洁地定义代码。
结果相等,但没有时间差异。
现在,使用
parallel::parLapply
。在这台机器上快了4.5倍。
duplicated name 'X1' in data frame using '.'
意味着在您的某些数据集中有两个名为"X1"
的列。以下是查找它们的方法:结果表明,在数据集
dat6
中,第9
列是第一个重复的,其它列都是干净的。