Как да автоматизирам избора на променлива в glmnet и кръстосаното валидиране

Уча се да използвам пакети glmnet и brnn. Разгледайте следния код:

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
}

person cousin_pete    schedule 21.08.2013    source източник
comment
Не изглежда, че е възможно каквото и да е тестване с вашите данни, но трябва незабавно да научите, че използването на ( след токен кара R да търси функция с това име. Вероятно искате locn.list[j]. Редът j<-1 изглежда напълно излишен.   -  person IRTFM    schedule 21.08.2013
comment
Благодаря за коментара DWin: моя грешка, правописна грешка и да, съгласен съм, j ‹- 1 е излишно!   -  person cousin_pete    schedule 22.08.2013
comment
Благодаря за коментара DWin: моя грешка, правописна грешка и да, съгласен съм, j ‹- 1 е излишно! Няма проблем с изпълнението на кода, както споменах, въпросът ми беше как да обобщя колекцията от полезни променливи от glmnet след кръстосано валидиране. В момента използвам кода много пъти на ден, използвайки активни финансови данни за една стойност на „locn“. Бих могъл да направя отделен скрипт за всичките 17 стойности на 'locn' и да ги стартирам последователно, но се надявах да уловя началото на реда: cols ‹- c(1,...... програмно, вместо да трябва ръчно да въвеждам това ред за всеки 'locn'.   -  person cousin_pete    schedule 22.08.2013
comment
Трябва да редактирате въпроса си, когато се съгласите, че във вашия код има грешки. Интересувам се от проблема, ако можете да видите пътя си ясен, за да направите набора от данни достъпен.   -  person IRTFM    schedule 22.08.2013
comment
Благодаря DWin, редактирах публикацията си, както предложихте.   -  person cousin_pete    schedule 23.08.2013


Отговори (1)


Откакто публикувах въпроса си, намерих документ от Саймън, Фридман, Хасти и Тибширани: 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

Надяваме се, че това може да бъде полезно за други!

person cousin_pete    schedule 23.08.2013