我正在尝试应用我在这里找到的解决方案来生成机器学习模型:
这是一个虚拟数据集:
data_pred <- data.frame(x1 = 1:10, x2 = 11:20, x3 = 21:30)
data_resp <- data.frame(y1 = c(1:5, NA, 7:10), y2 = c(NA, 2, NA, 4:10))
这是我在使用包时在测量响应的每一列中对for()
预测变量进行建模的循环方法:data_pred
data_resp
caret
# data_pred contains predictors
# data_resp contains one column per measurement
# 1 matching row per observation in both data_pred and data_resp
for (i in 1:ncol(data_resp)) {
train(x = data_pred[!is.na(data_resp[, i]), ],
y = data_resp[!is.na(data_resp[, i], i],
... )
}
现在我正在尝试对 做同样的事情lapply
,我认为这有很多优点。我在即时翻译!is.na()
标准时遇到问题,因此我只为每个响应使用非 NA 案例建模。lapply
这是我测试该方法的初始函数:
rf_func <- function(y) {
train(x = data_pred,
y = y,
method = "rf",
tuneGrid = data.frame(.mtry = 3:6),
nodesize = 3,
ntrees = 500,
trControl = trControl) }
然后创建一个空列表来存储结果并将函数应用于data_resp
:
models <- list(NULL)
models$rf <- lapply(as.list(data_resp), rf_func)
这很好用,因为randomForest
可以处理NA
s,但其他方法不能,所以我需要从每个data_resp
元素中删除这些行以及从我的预测变量中删除相应的行。
我试过这个没有成功:
train(x = data_pred_scale[!is.na(y), ],
y = y[!is.na(y)],
... }
我也试过y[[!is.na(y)]]
如何将 data.frame 方法 ( df[!is.na(df2), ]
) 转换为lapply
?