2017-12-12 9 views
0

私は20のプラスの列を持つデータフレームを持っています。これらの各列に対して、私は同じテストセットで評価する。データフレームをループして、同じテストセットで評価される各列のモデルを作成します

# Train-test splitting 
smp_size <- floor(0.70 * nrow(x)) 
index <- sample(seq_len(nrow(x)),size = smp_size) 
train <- x[index, ] 
test <- x[-index, ] 

for (i in 1:22) { 

    names(train)[names(train) == names(train[i])] <- 'variab' 
    names(test)[names(test) == names(test[i])] <- 'variab' 

    mod <- glm(Y ~ variab, family = binomial, data = train) 

    assign(paste0("val", sep = "_", letters[i]), as.numeric(performance(
    prediction(predict(mod, newdata = test, type = "response"),test$Y), 
    measure = "auc")@y.values[[1]])) 
} 

これは機能しませんが、各列に「variab」という名前が割り当てられ、各列に同じモデルが実行されます。このループをデータフレームの各列に反復させるにはどうすればよいですか?

答えて

1

ここにあなたのアイデアがあります。これがあなたのニーズを満たすことを願っています。あなたのperformance()またはprediction()機能がどこから来たのかわからないので、私の例から削除しました。

data(iris) 
predictors <- names(iris)[-1] 
response <- names(iris)[1] 

# due to a ill chosen example data: 
iris[,response] <- iris[,response]/max(iris[,response]) 

# sample 
smp_size <- floor(.7*nrow(iris)) 
set.seed(20171212) 
idx <- sample(seq_len(nrow(iris)), size=smp_size) 
train <- iris[idx,] 
test <- iris[-idx,] 


for (i in predictors) { 
    tmp.test <- data.frame(pred=get(i,test), resp=get(response, test)) 
    tmp.train <- data.frame(pred=get(i,train), resp=get(response, train)) 


    mod <- glm(resp ~ pred, family=binomial, data=tmp.train) 

    assign(paste0("val", sep="_", i), data.frame(predicted=as.numeric(predict(mod, newdata=tmp.test, type="response")), actual=get(response,test))) 
    } 

基本的には、すでに行ったことです。あなたはすでにassign()関数を使用していましたが、私はget()をその補数と考えると同様に便利です。また、可能であれば数値インデックスを使用しないで、ループを使用すると名前を反復することを支持しています。なぜなら、効果的なメッセージを簡単に書くことができるからです。cat()

+0

ありがとうございました! "警告メッセージ: 1:eval(ファミリ$初期化):非整数#二項式glmで成功しました! 2: 'newdata'は45を持っていました。行が見つかった変数には105行があります。 –

+0

これはコマンド 'predict(object = mod、newdata = test、type =" response ")'から来ます。実際には何らかの理由で予測がテストを使用するのではなく、それ以外の明示的な議論にもかかわらずnewdata引数を訓練するように見えます。私はそれ以前に遭遇したことはありませんでしたが、私はそれを解決して投稿を編集します。 – Nate

+0

更新された回答が問題を修正し、正しく動作します。ループのassign文は、元の 'performance()'や 'prediction()'関数を使用していないため、より良い結果が得られるように変更されています。データがおそらく実際にはバイナリデータなので、あなたの例では「成功していない成功」という警告を表示しないでください(貧弱なサンプルデータを選択しました)。 – Nate

関連する問題