

Bootstrap法によって機械学習アルゴリズムの精度を検証するプログラムを作っています。  
以下のコードをテキストで作成し、CSVdataをread.csvで読み込んで、以下のように実行すると

[code]

    > source("text.txt")
    > exdata=read.csv("final_output.csv",header=TRUE)
    > pred.ML(Y ~ X1 + X2 + X4, data=exdata, B=1000) 
    
[/code]

エラー: 'closure' 型のオブジェクトは部分代入可能ではありません  
というエラーが生じます。どこが問題でしょうか？

[code]

    pred.ML <- function(formula, data, B=1000, alpha=0.05, Cores=detectCores()){
      library(snow)
      library(foreach)
      library(doParallel)
      library(doSNOW)
      library(pROC)
      library(MASS)
    
      N <- dim(data)[1]
    
      boot <- function(formula, data){
      
        N <- dim(data)[1]
        
        bs.i <- sample(1:N, N, replace=TRUE)
        train.i <- data[ bs.i,]
        test.i  <- data[-bs.i,]
    
        gm1.i <- lda(formula, data=train.i, family=binomial)
      
        prob.b <- predict(gm1.i, type=c("response"))
        prob.o <- predict(gm1.i, newdata=data,type = c("response"))
        prob.t <- predict(gm1.i, newdata=test.i,type = c("response"))
      
        AUC.b <- roc(train.i$Y ~ prob.b, levels=c(0,1), direction="<")$auc
        AUC.o <- roc(data$Y ~ prob.o, levels=c(0,1), direction="<")$auc
        AUC.t <- roc(test.i$Y ~ prob.t , levels=c(0,1), direction="<")$auc
    
        return(c(AUC.b, AUC.o, AUC.t))
    
      }
    
      gm1 <- lda(formula, data=data, family=binomial)
    
      #calculation apparent AUC & test AUC
      prob <- predict(gm1,type=c("response"))
      ROC.app <- roc(data$Y ~ prob, levels=c(0,1), direction="<")
      AUC.app <- ROC.app$auc
      delong1 <- ci.auc(ROC.app,conf.level=1-alpha)[1]
      delong2 <- ci.auc(ROC.app,conf.level=1-alpha)[3]
      
      cl <- makeSOCKcluster(Cores)
      registerDoSNOW(cl)
    
      block <- ceiling(B/Cores)
      block0 <- c(1, block*(1:(Cores-1)) + 1)
      block1 <- c(block*(1:(Cores-1)), B)
    
      boot.res <- foreach(b = 1:Cores, .combine = rbind, .packages=c("MASS","pROC")) %dopar% {
    
       R1 <- NULL
       for(iter in block0[b]:block1[b]) R1 <- rbind(R1, boot(model, data))
       R1
    
      }
    
      #bootstrap SD and 95%CI of apparent C
      boot.app.C <- boot.res[,1]
        
      # bias corrected AUC estimate (ordinary bootstrap)
      AUC.boot <- AUC.app - mean(boot.res[,1] - boot.res[,2])   
    
      AUC.boot.CL1 <- quantile(boot.app.C, 0.5*alpha)
      AUC.boot.CL2 <- quantile(boot.app.C, 1-0.5*alpha)
        
      # bias corrected AUC estimate (bootstrap .632)
      AUC.loocv <- mean(boot.res[,3])   
      AUC.632 <- 0.368*AUC.app + 0.632*AUC.loocv
      AUC.loocv.SD <- sd(boot.res[,3])
        
      # bias corrected AUC estimate (bootstrap .632+)
      if (AUC.loocv<=0.5){
        R <- 1
      } else if (AUC.app > AUC.loocv){
        R <- (AUC.app - AUC.loocv)/(AUC.app - 0.5)
      } else {
        R <- 0
      }
        
      w <- 0.632/(1-0.368*R)
      AUC.632p <- (1-w)*AUC.app + w*max(AUC.loocv,0.5) 
      
      delta1 <- AUC.boot - AUC.app
      delta2 <- AUC.632 - AUC.app
      delta3 <- AUC.632p - AUC.app
      
      R <- list(
       lda.output=gm1,
       N.obs=N,
       N.boot=B,
       C.Apparent=as.numeric(AUC.app),
       C.DeLongCI=c(delong1,delong2),
       C.Apparent_BootstrapCI=c(AUC.boot.CL1,AUC.boot.CL2),
       C.Harrell=AUC.boot,
       C.Harrell_LSCI=(c(AUC.boot.CL1,AUC.boot.CL2) + delta1),
       C.0.632=AUC.632,
       C.0.632_LSCI=(c(AUC.boot.CL1,AUC.boot.CL2) + delta2),
       C.0.632p=AUC.632p,
       C.0.632p_LSCI=(c(AUC.boot.CL1,AUC.boot.CL2) + delta3)
       )
       
      stopCluster(cl)
      
      return(R)
    
    }
    
[/code]


CC BY-SA 4.0
2021-02-23T02:19:14.807
74218
2021-02-25T08:12:35.597
44081
question
アルゴリズム r
エラー: 'closure' 型のオブジェクトは部分代入可能ではありません


「'closure' 型のオブジェクトは部分代入可能ではありません」というエラーがどのタイミングで発生しているのかをまず特定してはどうでしょうか.
デバッグの方法としては, <https://stats.biopapyrus.jp/r/devel/debug.html> というページ, あるいは
RStudio をお使いなら <https://support.rstudio.com/hc/en-
us/articles/205612627-Debugging-with-RStudio> が参考になります. あるいはもっと単純に,
関数内の文を1行ごとに実行してみてはどうでしょう.

私の環境では,

[code]

    prob <- predict(gm1,type=c("response"))
    
[/code]

を実行した時点で同じエラーメッセージが発生しています. おそらく直前の記述

[code]

    gm1 <- lda(formula, data=data, family=binomial)
    
[/code]

に問題があると思います. `lda` 関数のヘルプには `family` 引数の説明がありませんが, これはどういう意図でしょうか?
この引数を消去すればエラーは消えます.

しかし, 提示なされたコードではそれ以外でも多数のエラーが発生します. ここまでの情報では意図をはかりかねるものが多いので,
申しわけないですがそれらの修正案は提案できません.


CC BY-SA 4.0
2021-02-25T08:12:35.597
74270
2021-02-25T08:12:35.597
40575
74218
answer