2015-10-20 2 views
2

Я использую следующий код для создания файла, который содержит все результаты моделей glm.
Я хотел бы сохранить результаты каждой модели и формулы, которые использовались для каждой модели.
Результат, который я получаю, немного беспорядок, потому что каждая модель печатается как две строки вместо 4 строк в сгенерированном txt-файле.Как сделать выходной файл txt лучше выглядеть

Как я могу решить эту проблему?
игрушка данные:

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=df) 
    df$glm_predict_response <- ifelse(predict(glm,newdata=df , type="response")>.5, 1, 0) 
    ff<-print(myform) 
    dd<-print(xtabs(~ target + glm_predict_response, data = df)) 
    print(prop.table(xtabs(~target + glm_predict_response, data = df), 2)) 
    e<-capture.output(ff,append = TRUE) 
    e1<-capture.output(dd,append = TRUE) 
    capture.output(e,e1, file = "myform2.txt",append = TRUE) 
} 

Выход из текстового файла:

[1] "target ~ birds" 
[1] "  glm_predict_response" "target 0 1"     "  0 1 2"     "  1 0 5"     
[1] "target ~ birds + wolfs" 
[1] "  glm_predict_response" "target 0 1"     "  0 3 0"     "  1 0 5"     
[1] "target ~ birds + Country" 
[1] "  glm_predict_response" "target 0 1"     "  0 3 0"     "  1 0 5" 
+1

Ваш пример не воспроизводимы. Вероятно, вы имеете в виду 'glm <-glm (myform, data = df)'. –

+0

Спасибо, я изменил его. – mql4beginner

ответ

3

Лично я никогда не использовал бы capture.output, если это абсолютно необходимо. Есть, безусловно, лучшие варианты, например, write.table, если вы используете data.frame или даже sink, когда вы просто отправляете печатный результат в файл. Тем не менее, быстрое исправление для вашего кода будет:

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) 
    ff<-print(myform) 
    dd<-print(xtabs(~ target + glm_predict_response, data = dat)) 
    print(prop.table(xtabs(~target + glm_predict_response, data = dat), 2)) 
    e<-capture.output(ff,append = TRUE) 
    #you really don't need the second capture.output since you can 
    #just print dd to the file directly 
    capture.output(e, dd, file = "myform2.txt",append = TRUE) 
} 

Примечание Я не использую country выше, поскольку это не входит в вашем примере data.frame. Это выводит в текстовый файл:

[1] "target ~ birds" 
     glm_predict_response 
target 0 1 
    0 1 2 
    1 0 5 
[1] "target ~ birds + wolfs" 
     glm_predict_response 
target 0 1 
    0 3 0 
    1 0 5 

То же самое, используя sink бы как (кажется проще для меня):

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) 
    dd<-xtabs(~ target + glm_predict_response, data = dat) 

    #start sinking 
    sink(file='myform2.txt', append=TRUE) 
    print(myform) 
    cat('\n\n') 
    print(dd) 
    cat('\n\n') 
    #stop sinking 
    sink() 
} 
+0

Спасибо @LyzandeR за вас ответ и объяснение .. – mql4beginner

+0

Вы очень приветствуете @ mql4beginner. Рад, что я мог бы помочь :) – LyzandeR

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