2016-11-04 1 views
0

この関数を実行してn倍交差検証を実行しています。誤分類率は、折り畳みに応じて変化しない。私は10または50を実行する場合、私はまた、警告を取得しています:私のGLMのn倍交差検証中に `predict`エラーが発生しました

:私は実行する場合

「警告メッセージ

『NEWDATA』が見つかり19行が、変数が189行を持っていました」関数の一部ではないコードは、私が欲しいと思っている - >折りたたみ== 1の場合、10%を引き出し、モデルの90%をモデルで実行し、残りの10%を予測します。 変数と折り目の数によって変動が表示されない理由は誰にもありますか?

library("MASS") 
data(birthwt) 
data=birthwt 

n.folds=10 

jim = function(x,y,n.folds,data){ 

    for(i in 1:n.folds){ 
    folds <- cut(seq(1,nrow(data)),breaks=n.folds,labels=FALSE)  
    testIndexes <- which(folds==i,arr.ind=TRUE) 
    testData <- data[testIndexes, ] 
    trainData <- data[-testIndexes, ] 
    glm.train <- glm(y ~ x, family = binomial, data=trainData) 
    predictions=predict(glm.train, newdata =testData, type='response') 
    pred.class=ifelse(predictions< 0, 0, 1) 
    } 

    rate=sum(pred.class!= y)/length(y) 
    print(head(rate)) 
    } 

jim(birthwt$smoke, birthwt$low, 10, birthwt) 
+0

ありがとうございます - 予測は(<0.5、0,1)である必要があります。機能はまだ正しくはありませんが、あなたの観察に感謝します。 – user7090012

+0

pred.classは、各折りたたみからのすべての予測を持つベクトルとして欲しいです。この関数では、私はちょうど戻って189になるはずです。次に、このベクトルの長さ189を使ってレートを生成します。 – user7090012

答えて

0

私は今、私のコメントを答えにしています。

jim <- function(x, y, n.folds, data) { 

    pred.class <- numeric(0) ## initially empty; accumulated later 
    for(i in 1:n.folds){ 
    folds <- cut(seq(1,nrow(data)), breaks = n.folds, labels = FALSE) 
    testIndexes <- which(folds == i) ## no need for `arr.ind = TRUE` 
    testData <- data[testIndexes, ] 
    trainData <- data[-testIndexes, ] 
    ## `reformulate` constructs formula from strings. Read `?reformulate` 
    glm.train <- glm(reformulate(x, y), family = binomial, data = trainData) 
    predictions <- predict(glm.train, newdata = testData, type = 'response') 
    ## accumulate the result using `c()` 
    ## change `predictions < 0` to `predictions < 0.5` as `type = response` 
    pred.class <- c(pred.class, ifelse(predictions < 0.5, 0, 1)) 
    } 

    ## to access a column with string, use `[[]]` not `$` 
    rate <- sum(pred.class!= data[[y]])/length(data[[y]]) 
    rate ## or `return(rate)` 
    } 

jim("smoke", "low", 10, birthwt) 
# [1] 0.3121693 

備考:

  1. それは副作用がありませんが、ここではarr.ind = TRUEを置く必要はありません。
  2. 分類に問題があります。 type = "response"を設定し、次にifelse(predictions < 0, 0, 1)を使用します。それについて考えると、あなたはいつもpred.classのために1を得ます。
  3. forループの各繰り返しでpred.classが上書きされます。私はあなたが結果を蓄積したいと思う。だからpred.class <- c(pred.class, ifelse(predictions < 0.5, 0, 1));
  4. glmおよびpredictの間違った使用。モデル式に$を入れるのは間違いです。 Predict() - Maybe I'm not understanding itをお読みください。ここでは、変数名(文字列)を受け入れるように関数を変更し、適切なモデル式をglmの中で使用しました。この変更には、data[[y]]yrate = sum(pred.class!= y)/length(y)に設定する必要があります。
  5. rateをスクリーンに印刷するのではなく、返すことをお勧めします。したがって、print行を明示的にreturn(rate)、または暗黙的にrateに置き換えてください。
  6. ifelse(predictions < 0.5, 0, 1)as.integer(predictions < 0.5)に置き換えることはできますが、上記で変更していません。
+0

ありがとう。レートは、yと同じでない予測の割合である必要があります。予測は、ループ内の各予測からの予測の積み重ねでなければなりません。今度は各反復がpred.classを上書きすることがわかります。予測を返して料金を計算するにはどうすればよいですか? – user7090012

+0

ありがとう。しかし、他の変数をjim( "smoke"、 "low"、10、birthwt)に入力すると、 「年齢」、「低」、「人種」が「低」の場合でも、31%が得られます。また、n.foldsを50と変更した場合でも、31%が得られます。それが問題の場所です。何かが間違っている。 – user7090012

+0

私は今参照してください。 10倍以上の折りたたみではレートが変わらないというのは面白いです。大変ありがとうございます。私はこれを手伝ってあなたの時間を非常に感謝します!多分いつか私は貢献することができるでしょう! – user7090012

関連する問題