2015-10-20 2 views
1

У меня есть код (источник для кода находится в ссылке ниже), что создает следующий вывод:Как получить определенные значения с выхода

df <- read.table(text = "target birds wolfs  
         0  21   7 
         0  8   4 
         1  2   5 
         1  2   4 
         0  8   3 
         1  1   12 
         1  7   10 
         1  1   9 ",header = TRUE) 
myform <-NULL 
myform <- target~1 
dd<-NULL 
for (i in c('birds', 'wolfs')) { 

    myform <- update(myform, as.formula(paste('~ birds +', i))) 
    glm<-glm(myform,data=dat) 
    dat$glm_predict_response <- ifelse(predict(glm,newdata=dat, type="response")>.5, 1, 0) 
    sum1<- sum(dat$glm_predict_response>0 & dat$target>0) 
    sum2<- sum(dat$glm_predict_response<1 & dat$target<1) 
    accuracy<- (sum1+sum2)/length(dat$glm_predict_response) 
    print(myform) 
    print(accuracy) 

} 

Выход:

target ~ birds 
[1] 0.75 
target ~ birds + wolfs 
[1] 1 

ли это возможно получить только результаты, которые превышают определенное значение? например, в этом выводе только модель формулы, которая preduce наилучшего значения точности, в данном случае:

target ~ birds + wolfs 
[1] 1 

Источник кода является от ссылки: How to make an output txt file look better

+0

Первое решение, которое должно прийти на ум, является 'if' состояние ... – Roland

+0

Вы могли бы начать экономить весь выход к вектору или someth что делает выбор после этого намного проще. В настоящее время вы только печатаете его, поэтому сохраняете только последнее. – Heroka

+0

Здравствуйте @Roland, как вы можете использовать функцию if с выходом в качестве источника. – mql4beginner

ответ

1

Вы можете сохранить результаты в списке, как это:

df <- read.table(text = "target birds wolfs  
         0  21   7 
         0  8   4 
         1  2   5 
         1  2   4 
         0  8   3 
         1  1   12 
         1  7   10 
         1  1   9 ",header = TRUE) 
myform <-NULL 
myform <- target~1 
dd<-NULL 
#I am initiating a list here 
mylist <- list() 
for (i in c('birds', 'wolfs')) { 

    myform <- update(myform, as.formula(paste('~ birds +', i))) 
    glm<-glm(myform,data=dat) 
    dat$glm_predict_response <- ifelse(predict(glm,newdata=dat, type="response")>.5, 1, 0) 
    sum1<- sum(dat$glm_predict_response>0 & dat$target>0) 
    sum2<- sum(dat$glm_predict_response<1 & dat$target<1) 
    accuracy<- (sum1+sum2)/length(dat$glm_predict_response) 
    #I am adding each accuracy to the list 
    #the name of each element of the list will be the formula(this is what deparse does here) 
    #just as a side note: deparse does not work with very big formulas 
    #you should use: Reduce(paste, deparse(myform)) 
    mylist[[deparse(myform)]] <- accuracy 

} 

результат будет:

mylist 
$`target ~ birds` 
[1] 0.75 

$`target ~ birds + wolfs` 
[1] 1 

Теперь, поскольку у вас есть все результаты здесь, вы могли бы sink все в текстовый файл (если вы хотите) с помощью:

sink('myfile.txt') 
print(mylist) 
sink() 

И тогда вы могли бы выводить только лучшая модель на экране с помощью:

#which.max chooses the max accuracy here 
mylist[which.max(unlist(mylist))] 
$`target ~ birds + wolfs` 
[1] 1 

или просто тонут лучшие модели в текстовый файл:

sink('myfile.txt') 
print(mylist[which.max(unlist(mylist))]) 
sink() 
+0

Спасибо @LyzandeR за ваше время и усилия. Он отлично работает. – mql4beginner

+0

Np Я рад помочь :) – LyzandeR

+0

Здравствуйте, @LyzandeR, Немного поздно, но у меня есть два вопроса в отношении вашего решения. Будет здорово, если вы ответите: во-первых, если у меня есть более одного KPI для выбора лучших (т. е. точность должна быть максимальной, а sum1 должна быть минимальной). Как я могу добавить ее вывод к точности KPI? second. Если у меня есть несколько моделей с одинаковыми значениями KPI, как я могу представить их все, а не только первая модель, которая соответствует KPI? – mql4beginner

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