2017-03-06 32 views
0

我檢查this問題有關定義在R車型,我想什麼做的是在一個型號爲循環交換變量,這樣每一個變量是一個時間目標變量而所有其他變量都是該迭代的預測變量。的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 

於是我想創建一個for循環使用3次迭代在這種情況下:

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

我不明白你是如何獲取所需的從輸入data.frame輸出。 – MrFlick

+0

這是你的想法嗎? http://stackoverflow.com/questions/5300595/automatically-create-formulas-for-all-possible-linear-models – MrFlick

+0

@MrFlick的鏈接謝謝,這是接近我一直在尋找。雖然,區別在於我想要包含所有變量的所有可能組合。因此,與列產品1,產品2和產品3有如上所示,而不是9. – Floris

回答

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) 

}) 

這將返回一個包含相關的增值經銷商,獨立var和最後樸素貝葉斯模型的列表對象。

要訪問其中的任何一個,您可以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 
+0

你跟正是我一直在尋找這樣非常感謝偉大的答案提供給我!儘管如此,對我來說,最後一步是要有一個數據框,以便客戶可能會購買每種產品。因此,對於每個客戶ID爲1至5如實施例數據設定似然性/概率所示的值是1(這意味着在這個示例中的數據集購買)。偉大的回答,雖然我仍然很難將其納入我想要使用它的上下文中。在模型中,我使用數據集作爲訓練集以及測試集。 – Floris

+0

我編輯了我的問題,通知其他人您已經給出正確答案,並且我在評論中添加了下一個相關問題。所以在編輯中我添加了這個額外問題的所需輸出。 – Floris

+0

您是否還可以包含nbModel之一的樣本輸出以及此結果如何與您所需的輸出相關 – OdeToMyFiddle