2016-01-17 4 views
2

У меня есть следующий код приводит к таблице, как выходвыход confusionMatrix в виде таблицы .csv

lvs <- c("normal", "abnormal") 
truth <- factor(rep(lvs, times = c(86, 258)), 
       levels = rev(lvs)) 
pred <- factor(
       c(
        rep(lvs, times = c(54, 32)), 
        rep(lvs, times = c(27, 231))),    
       levels = rev(lvs)) 

xtab <- table(pred, truth) 

library(caret) 
confusionMatrix(xtab) 

confusionMatrix(pred, truth) 
confusionMatrix(xtab, prevalence = 0.25) 

Я хотел бы экспортировать ниже часть вывода в виде таблицы .csv

   Accuracy : 0.8285   
       95% CI : (0.7844, 0.8668) 
    No Information Rate : 0.75    
    P-Value [Acc > NIR] : 0.0003097  

        Kappa : 0.5336   
Mcnemar's Test P-Value : 0.6025370  

      Sensitivity : 0.8953   
      Specificity : 0.6279   
     Pos Pred Value : 0.8783   
     Neg Pred Value : 0.6667   
      Prevalence : 0.7500   
     Detection Rate : 0.6715   
    Detection Prevalence : 0.7645   
     Balanced Accuracy : 0.7616 

Попытка записать его как .csv таблице результатов в сообщении об ошибке:

write.csv(confusionMatrix(xtab),file="file.csv") 
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
cannot coerce class ""confusionMatrix"" to a data.frame 

Выполнение всей работы вручную, по очевидным причинам, нецелесообразно и подвержено человеческим ошибкам.

Любые предложения по его экспорту как .csv?

+0

Это то, что вы хотите написать в форме «ключ: значение»? 'write.csv' ожидает data.frame в соответствии с ошибкой, поэтому вам придется массировать свой результат на что-то, что он может принять. – steveb

+0

Чтобы уточнить, вам нужно будет взять результат 'confusionMatrix' и поместить требуемые данные из него в data.frame. – steveb

+0

@steveb да, я вижу сейчас. mroto в ответе ниже четко изложил его. – Oposum

ответ

2

Итак, если вы проверяете выход confusionMatrix(xtab, prevalence = 0.25), это список:

cm <- confusionMatrix(pred, truth) 
str(cm) 

    List of 5 
$ positive: chr "abnormal" 
$ table : 'table' int [1:2, 1:2] 231 27 32 54 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ Prediction: chr [1:2] "abnormal" "normal" 
    .. ..$ Reference : chr [1:2] "abnormal" "normal" 
$ overall : Named num [1:7] 0.828 0.534 0.784 0.867 0.75 ... 
    ..- attr(*, "names")= chr [1:7] "Accuracy" "Kappa" "AccuracyLower" "AccuracyUpper" ... 
$ byClass : Named num [1:8] 0.895 0.628 0.878 0.667 0.75 ... 
    ..- attr(*, "names")= chr [1:8] "Sensitivity" "Specificity" "Pos Pred Value" "Neg Pred Value" ... 
$ dots : list() 
- attr(*, "class")= chr "confusionMatrix" 

С этого момента вы выбираете соответствующие объекты, которые вы хотите создать файл CSV из и сделать data.frame, который будет есть столбец для каждой переменной. В вашем случае это будет:

tocsv <- data.frame(cbind(t(cm$overall),t(cm$byClass))) 

# You can then use 
write.csv(tocsv,file="file.csv") 
+0

спасибо, это очень близко. Фактически, я немного изменил код, чтобы получить то, что я хочу: 'tocsv <-as.data.frame (t (data.frame (cbind (t (cm $ byClass), t (см $ в целом)))))' Но, если я могу спросить вас, почему вы перенесили в первую очередь для начала? Кроме того, есть ли возможность округлить числовые значения до того, как мы перейдем на стадию «tocsv»? Я знаю, что впоследствии я могу назвать столбец вокруг него, а затем заменить его, но мне было интересно, есть ли более эффективный способ на начальном этапе. – Oposum

+0

Также я заметил, что код изменяет исходную строку '95% CI: (0.7844, 0.8668)' и вместо этого отображает эти две строки: 'AccuracyLower 0.7844134380' и' AccuracyUpper 0.8667985207'. Есть ли способ сохранить исходный способ '95% CI: (0.7844, 0.8668)'? – Oposum

+1

По умолчанию 'byClass' и' general' называются числовыми векторами, которые не могут быть объединены в их текущей форме. Если вы их транспонируете, вы создаете вектор символов имен рядом со значениями. Что касается округления их, возможно, да, но, как правило, хорошей практикой является задание нового вопроса, если у вас есть один, вместо того, чтобы забивать их комментариями. – mtoto