2017-02-22 3 views
0

Я получил большую базу данных, я распался в году и создал на поезде и испытание для каждого соответствующего годаПрименение функции к списку и выводу результатов

#split the dataset into a list of datasets 
Y <- split(dat_all, dat_all$year) 
#create a train and test dataset for all years 
#takes Y is inp 
create_sets <- function(x){ 
    train_set <- sample(2, nrow(x), replace = TRUE, prob = c(0.7, 0.3)) 
    train <- x[train_set == 1, ] 
    test <- x[train_set == 2, ] 
    assign('x', list(train = train, test = test)) 
} 
Ylist <- lapply(Y, create_sets) 

Для вызова каждого элемента из вас используйте Ylist $ '2016' $ train

Я сделал функцию коэффициента точности, которую я могу запускать каждый список по отдельности, но я ищу способ сделать все это в одном, чтобы сохранить огромное количество кода (theres 16 лет данных)

Ниже приведено, как я создаю коэффициент точности в течение одного года

val_train<-Ylist$'2016'$train 
val_train$pred<-predict(modf,newdata=Ylist$'2016'$train) 
val_train$probs<-exp(val_train$pred)/(1+exp(val_train$pred)) 
x<-data.frame(rcorr.cens(val_train$probs, val_train$default_flag)) 
train_AR<-x[2,1] 
train_AR 

modfull <-ModFit(test) 
val_test<-test 
val_test$pred<-predict(modf,newdata=test) 
val_test$probs<-exp(val_test$pred)/(1+exp(val_test$pred)) 
x<-data.frame(rcorr.cens(val_test$probs, val_test$default_flag)) 
test_AR<-x[2,1] 
test_AR 

AR_Logistic1<-c(train_AR,test_AR,) 
AR_Logistic2<-c(train_AR,test_AR) #just in to see if table works 
AccuracyRatio<-rbind(AR_Logistic1,AR_Logistic2) 
colnames(AccuracyRatio)<-c("Train","Test","All") 
AccuracyRatio 

Просто для уточнения я пытаюсь запустить через весь мой список через мое отношение точности, а затем выводит AR на каждый год для своего поезда и испытания.

Любая помощь очень ценится

ответ

0

С lapply и обертывание вычисления AR в функции можно суммировать выход, как показано ниже. Без данных образца я не смог проверить его, но сообщит нам, если вы столкнулись с любыми ошибками.

fn_Calc_AR <- function(yearDat = listInput) { 

#yearDat <== Ylist$'2016' 

trainDat <- yearDat$train 
testDat <- yearDat$test 

val_train<- trainDat 
val_train$pred<-predict(modf,newdata= trainDat) 
val_train$probs<-exp(val_train$pred)/(1+exp(val_train$pred)) 
x<-data.frame(rcorr.cens(val_train$probs, val_train$default_flag)) 
train_AR<-x[2,1] 
#train_AR 

modfull <-ModFit(testDat) 
val_test<-testDat 
val_test$pred<-predict(modf,newdata=testDat) 
val_test$probs<-exp(val_test$pred)/(1+exp(val_test$pred)) 
x<-data.frame(rcorr.cens(val_test$probs, val_test$default_flag)) 
test_AR<-x[2,1] 
#test_AR 

AR_Logistic1<-c(train_AR,test_AR) # removed extraneous comma, previous input c(train_AR,test_AR,) 
AR_Logistic2<-c(train_AR,test_AR) #just in to see if table works 
AccuracyRatio<-rbind(AR_Logistic1,AR_Logistic2) 
colnames(AccuracyRatio)<-c("Train","Test","All") 

#confirm yearName is being created 
try(yearName <- head(names(x),1)) #retain only year 

if(length(yearName) > 0L) { 
AR_DF <- data.frame(yearName = yearName , AccuracyRatio,stringsAsFactors=FALSE) 
}else{ 
AR_DF <- AccuracyRatio 
} 

return(AR_DF) 

} 

Обобщить Выход:

AR_Summary = do.call(rbind,lapply(Ylist,fn_Calc_AR)) 

агрегатный Dataset:

aggregateTrain = do.call(rbind,lapply(Ylist,function(x) x$train)) 
aggregateTest = do.call(rbind,lapply(Ylist,function(x) x$test)) 

aggregateList = list(train = aggregateTrain,test = aggregateTest) 

AR_AggregateSummary = do.call(rbind,lapply(aggregateList,function(x) fn_Calc_AR(x))) 
+0

Привет, это все прекрасно работает так я пометил его правильным. Тем не менее, несколько небольших вопросов. В таблице имена каждого года вызывается с помощью x. Это выводит «2008 rcorr.cens.val_train_test.probs..val_train_test.default_flag». есть ли способ просто провести год? – user2902494

+0

Еще одна вещь, которую я сделал. Я также пытаюсь запустить коэффициент точности на весь год, например, тест + поезд. Попробовал добавить это в trainDat <- yearDat $ train testDat <- yearDat $ test trainDat_testDat <-yearDat , а затем добавив в другой раздел для trainDat_testDat, но безуспешно. Любые идеи о том, как я могу это сделать? Ваша помощь действительно оценена! – user2902494

+0

Я знаю, что я отметил, что это правильно, но это было бы очень приятно, но я бы очень признателен за дополнительную помощь. – user2902494

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