2013-08-21 3 views
4

Я изучаю использование пакетов и brnn. Рассмотрим следующий код:Как автоматизировать выбор переменных в glmnet и перекрестной проверке

library(RODBC) 
library(brnn) 
library(glmnet) 
memory.limit(size = 4000) 
z <-odbcConnect("mydb") # database with Access queries and tables 

# import the data 
f5 <- sqlFetch(z,"my_qry") 

# head(f5) 

# check for 'NA' 
sum(is.na(f5)) 

# choose a 'locn', up to 16 of variable 'locn' are present 
f6 <- subset(f5, locn == "mm") 
# dim(f6) 

# use glmnet to identify possible iv's 

training_xnm <- f6[,1:52] # training data 
xnm <- as.matrix(training_xnm) 
y <- f6[,54] # response 

fit.nm <- glmnet(xnm,y, family="binomial", alpha=0.6, nlambda=1000,standardize=TRUE,maxit=100000) 
# print(fit.nm) 

# cross validation for glmnet to determine a good lambda value 
cv.fit.nm <- cv.glmnet(xnm, y) 

# have a look at the 'min' and '1se' lambda values 
cv.fit.nm$lambda.min 
cv.fit.nm$lambda.1se 
# returned $lambda.min of 0.002906279, $lambda.1se of 2.587214 

# for testing purposes I choose a value between 'min' and '1se' 
mid.lambda.nm = (cv.fit.nm$lambda.min + cv.fit.nm$lambda.1se)/2 

print(coef(fit.nm, s = mid.lambda.nm)) # 8 iv's retained 

# I then manually inspect the data frame and enter the column index for each of the iv's 
# these iv's will be the input to my 'brnn' neural nets 

cols <- c(1, 3, 6, 8, 11, 20, 25, 38) # column indices of useful iv's 

# brnn creation: only one shown but this step will be repeated 
# take a 85% sample from data frame 
ridxs <- sample(1:nrow(f6), floor(0.85*nrow(f6))) # row id's 
f6train <- f6[ridxs,] # the resultant data frame of 85% 
f6train <-f6train[,cols] # 'cols' as chosen above 

# For the 'brnn' phase response is a binary value, 'fin' 
# and predictors are the 8 iv's found earlier 
out = brnn(fin ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8, data=f6train, neurons=3,normalize=TRUE, epochs=500, verbose=FALSE) 
#summary(out) 

# see how well the net predicts the training cases 
pred <- predict(out) 

Вышеупомянутый скрипт работает нормально.

Мой вопрос: как я могу автоматизировать приведенный выше сценарий для разных значений locn, то есть, как я могу обобщить получение шага: cols <- c(1, 3, 6, 8, 11, 20, 25, 38) # column indices of useful iv's. В настоящее время я могу сделать это вручную, но не могу видеть, как сделать это в общем виде для различных значений locn, например

locn.list <- c("am", "bm", "cm", "dm", "em") 
for(j in 1:5) { 
this.locn <- locn.list[j] 
# run the above script 
} 
+0

Не похоже, что любое тестирование с вашими данными возможно, но вы должны сразу узнать, что с помощью "(" после того, как токен заставляет R искать функцию под этим именем. Вероятно, хотите 'locn.list [j]' Линия 'j <-1' выглядит совершенно излишней. –

+0

Спасибо за комментарий DWin: мой плохой, опечатка и да, я согласен. J <- 1 избыточно! –

+0

Спасибо за комментарий DWin: мой плохой, опечатка, и да я согласен j <- 1 избыточно! Нет проблем с запуском кода, как я уже упоминал, мой вопрос состоял в том, как обобщить коллекцию полезных переменных из glmnet после перекрестной проверки. В настоящее время я использую код много раз в день с использованием живых финансовых данных для одного значения «locn». Я мог бы создать отдельный скрипт для всех 17 значений «locn» и запустить их последовательно, но я надеялся захватить начало строки: cols <- c (1, ...... программным способом, а не вручную поместите эту строку в каждый «locn». –

ответ

12

Так разместить свой вопрос, я нашел статью Саймона, Фридман, Гест и Tibshirani : Coxnet: Регулярная регрессия Кокса, в которой рассматривается, как извлечь то, что я хотел.

Некоторые соответствующие данные из этого документа и адаптированные для моих данных (за исключением символа для лямбда!): Мы можем проверить, какие ковариаты нашей модели выбрали активными, и посмотреть коэффициенты этих ковариатов.

coef(fit.nm, s = cv.fit.nm$lambda.min) # returns the p length coefficient vector 

Решение, соответствующее лямбда = cv.fit $ lambda.min.

Coefficients <- coef(fit.nm, s = cv.fit.nm$lambda.min) 
Active.Index <- which(Coefficients != 0) 
Active.Coefficients <- Coefficients[Active.Index] 

Active.Index # identifies the covariates that are active in the model and 
Active.Coefficients # shows the coefficients of those covariates 

Надеюсь, это может быть полезно для других!

Смежные вопросы