在R

时间:2017-03-06 16:25:48

标签: r

我已经检查了this关于在R中定义模型的问题。我想做的是在for循环中交换模型中的变量,这样每个变量都是目标变量的一次,所有其他变量都是该迭代的预测变量。

df <- data.frame(customer = c(1:5), product1 = c(1,0,1,1,0), product2 = c(0,1,0,0,1), product3 = c(0,1,1,1,0))

customer product1 product2 product3
1        1        1        0        0
2        2        0        1        1
3        3        1        0        1
4        4        1        0        1
5        5        0        1        0

那么我想在这种情况下创建一个包含3次迭代的for循环:

mdl <- product1 ~ product2 + product3
mdl <- product2 ~ product1 + product3
mdl <- product3 ~ product1 + product2

为了澄清我的问题,我试图创建这个for循环:

  for(j in 1:ncol(df)){
    mdl <- df$[j] ~ df[-j] # include all variables except target variable
    print(mdl)
  }

这里我输出的输出:

df[j] ~ df[-j]
df[j] ~ df[-j]
df[j] ~ df[-j]
df[j] ~ df[-j]

虽然我期望输出所需的内容:

product1 ~ product2 + product3
product2 ~ product1 + product3
product3 ~ product1 + product2

如果你想知道为什么我想知道这一点。我想在运行预测模型的for循环中使用它,如下例所示:

naiveBayes(mdl, df, type = "raw")

我希望我的问题很明确,希望有人能帮助我。

1 个答案:

答案 0 :(得分:0)

使用setdifflapply,您可以实现公式组合。

varNames = colnames(DF)[-1]


lapply(varNames, function(x) paste0( x ,"~", paste0(setdiff(varNames,x),collapse="+" ) ) )
#[[1]]
#[1] "product1~product2+product3"
#
#[[2]]
#[1] "product2~product1+product3"
#
#[[3]]
#[1] "product3~product1+product2"

要将这些功能合并到您的模型中,您可以执行以下操作:

modelList = lapply(varNames,function(x) {

depVar = x
indepVar = setdiff(varNames,x)

formulaVar = as.formula(paste0( depVar ,"~", paste0(indepVar,collapse="+" ) ))

nbModel = naiveBayes(formulaVar, df, type = "raw")

outputList = list( indepVar = paste0(indepVar,collapse=","),depVar = depVar,nbModel = nbModel)

return(outputList)

})

这将返回一个列表对象,其中包含从属变量,独立变量,最后是朴素贝叶斯模型。

要访问其中任何一个,您可以modelList[[1]]length(modelList)提供此列表中的模型数量。

有关生成组合的其他方法,请参阅?combn?expand.grid

combn(varNames,2)
#     [,1]       [,2]       [,3]      
#[1,] "product1" "product1" "product2"
#[2,] "product2" "product3" "product3"

head(expand.grid(varNames,varNames,varNames))
#      Var1     Var2     Var3
#1 product1 product1 product1
#2 product2 product1 product1
#3 product3 product1 product1
#4 product1 product2 product1
#5 product2 product2 product1
#6 product3 product2 product1