基于 R 中的列值创建多个模型的函数

A function to create multiple models based on column value in R

我正在尝试创建一个函数来根据列值生成多个随机森林模型。假设我们:

df <- data.frame(Name= c('Aaron','Bob','Nik','Peter','George'),
                           Work=c('A','B','B','C','A')
                           ,Age = c(45,28,64,27,54)
                           ,cl = c(1,2,2,3,1))

Name Work Age cl
Aaron  A  45  1
Bob    B  28  2
Nik    B  64  2
Peter  C  27  3
George A  54  1

所以,我必须根据 cl 对数据进行子集化,然后根据 cl 值构建模型,例如:在上面的示例中,我有 3 个 cl values.So,首先我将数据分为三个子集并构建三个不同的子集模型。

Name Work Age cl              Name Work Age cl            Name Work Age cl  
Aaron  A  45  1               Bob    B  28  2             Peter  C  27  3
George A  54  1               Nik    B  64  2

我使用下面的函数来做到这一点:

for(i in unique(uk$v10v11)) {
  nam <- paste("df", i, sep = ".")
  assign(nam, uk[uk$v10v11==i,])
}

我想在我可以提供我的 df 的地方制作完整的功能,它应该基于 cl 构建多个模型。我还想从每个模型的函数本身调整随机森林的参数。请帮忙。

我建议您在有空的时候观看this video from hadley wickham。它与您的挑战密切相关。

这似乎也是一个经典的 split-apply-combine 问题,所以我的第一个想法是考虑 tidyverse。这是一些可能对您有帮助的代码:

library(tidyverse)
library(randomForest)

df2 <- df %>% group_by(cl) %>% mutate(rfcol=list(randomForest(x=.,
                                  formula=.$cl~.$Work+.$Age)))

基本上已经创建了一个新列,其中包含基于其在 cl 中的值的适用于该行的随机森林算法。您可以通过查看 df2$rfcol[[2]]

来探索每个模型的详细信息

总而言之,group_by 函数让您开始基于 cl 值创建数据帧。嵌套在 mutate 中的 randomForest 函数中的 . 是引用每个分组数据帧的一种方式。

希望这对您有所帮助。但如前所述,如果有时间,请尝试观看 hadley wickham 的视频。它将真正详细地解释如何思考这些类型的问题。