我已经检查了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")
我希望我的问题很明确,希望有人能帮助我。
答案 0 :(得分:0)
使用setdiff
和lapply
,您可以实现公式组合。
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