2017-03-06 11 views
0

Rでモデルを定義することについてthisの質問をしました。私がしたいのは、forループ内のモデルの変数を入れ替えて、すべての変数が対象変数他のすべての変数はその反復の予測変数です。ここでループのためにこれを作成するための私の試みを私の質問を明確にするためforループのモデルを定義するR

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

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ループを作成したいと考え

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") 

:私は、この例のように予測モデルを実行するためのループでそれを使用したいです。

+0

を参照してください私はあなたが入力data.frameからその所望の出力を取得する方法を理解していません。 – MrFlick

+0

これはあなたが欲しいものに似ていますか? http://stackoverflow.com/questions/5300595/automatically-create-formulas-for-all-possible-linear-models – MrFlick

+0

@MrFlickリンクをありがとう、それは私が探していたものに近いです。違いは、すべての変数を含むすべての可能な組み合わせが欲しいということです。したがって、product1、product2、product3の列には、9ではなく3つのユニークな組み合わせしかありません。 – 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) 

}) 

これは依存VARS、独立した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

関連する問題