我已经检查了有关定义R中的模型的问题所有其他变量都是该迭代的预测变量。
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(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
如果您想知道为什么我想知道这一点。我想在此示例中像以下示例一样使用它来运行预测模型的循环:
naiveBayes(mdl, df, type = "raw")
我希望我的问题清楚,希望有人能帮助我。
使用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)
})
这将返回包含因var,独立var和naive贝叶斯模型的列表对象。
要访问其中的任何人,您可以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