Index <- 1
stepSize <- 1
Indices <- (1 + stepSize*(Index-1)):(stepSize*Index)

# Libraries
library(gbm)
library(caret)
library(mc2d)

# Construct structure of formula based on ecological prior knowledge
formulaInput <- BENT_MMI_COND ~ AGGR_ECO9_2015 + LRBS_USE + L_XFC_NAT+L_XCMGW + W1_HALL +
  NHDWAT_NADP2009_MEAN_NO3 + NHDWAT_NADP2009_MEAN_SO4 +
  NHDWAT_ELEV + NHDWAT_SLOPE + NHDWAT_PCT_CANOPY+ NHDWAT_PCT_IMPERV +
  NHDWAT_PCT_SAND + TMAX_ANN + WSAREA_NARS+PCT_AG + PCT_WET + PCT_SHRUB_GRASS

# Data
# Output from file 1_DataPreparation.R
load("CombinedNRSA0809_datFrame")
datFrame <- datFrame[, which(names(datFrame) %in% all.vars(formulaInput))]

# Create tuning grid
maxInterActDepth <- ncol(datFrame) - 1
tuneGrid <- expand.grid(nTrees=seq(10, 10000, by=10), 
                        intActDepth=1:maxInterActDepth,
                        AvgNegLogLik=NA)

# Prepare list of training and test data sets
set.seed(0)
cvFolds <- createFolds(y=datFrame[, "BENT_MMI_COND"], 
                       k=10, returnTrain = TRUE)
tempTrain <- vector("list", 10)
tempVal <- vector("list", 10)
respMultinomVal <- vector("list", 10)
for(i in 1:10) {
  tempTrain[[i]] <- datFrame[cvFolds[[i]], ]
  tempVal[[i]] <- datFrame[-cvFolds[[i]], ]
  respMultinomVal[[i]] <- model.matrix(~BENT_MMI_COND-1, 
                                       data=data.frame(BENT_MMI_COND=
                                                         tempVal[[i]]$BENT_MMI_COND))
}

# Evaluate model on the outer cross validation folds
for(k in Indices) {
  tempNegLogLik <- rep(NA, 10)
  for(i in 1:10) {
    gbmFit <- gbm(formula=formulaInput, distribution="multinomial",
                  data=tempTrain[[i]], n.minobsinnode=1, 
                  n.trees=tuneGrid[k, "nTrees"],
                  interaction.depth=tuneGrid[k, "intActDepth"],
                  n.cores=1)
    preds <- predict(gbmFit, newdata=tempVal[[i]], type="response",
                     n.trees=gbmFit$n.trees)[, , 1]
    tempNegLogLik[i] <- -sum(dmultinomial(x=respMultinomVal[[i]], 
                                          size=1, prob=preds, log=TRUE))

  }
  tuneGrid[k, "AvgNegLogLik"] <- mean(tempNegLogLik)
  cat("Progress", round((k-stepSize*(Index-1)) / stepSize, 4)*100, "%", "\n")
}

# Save results
tuneGrid <- tuneGrid[Indices, , drop=FALSE]
save(tuneGrid, file=paste("GBT_TuningResults/PDP_tuneGrid_Index_", Index, sep=""), compress="xz")
