Печать дат без научной записи в дереве классификации rpart

Когда я создаю дерево rpart, которое использует отсечение даты на узле, я использую методы печати - оба rpart.plot а также fancyRpartPlot - печатать даты в научной записи, что затрудняет интерпретацию результата. Вот fancyRpartPlot:

введите описание изображения здесь

Есть ли способ напечатать это дерево с более понятными значениями даты? Этот древовидный график не имеет смысла, так как все эти даты выглядят одинаково.

Вот мой код для создания дерева и построения двух способов:

library(rpart) ; library(rpart.plot) ; library(rattle)
my_tree <- rpart(a ~ ., data = dat)
rpart.plot(my_tree)
fancyRpartPlot(my_tree)

Используя эти данные:

# define a random date/time selection function
generate_days <- function(N, st="2012/01/01", et="2012/12/31") {
  st = as.POSIXct(as.Date(st))
  et = as.POSIXct(as.Date(et))
  dt = as.numeric(difftime(et,st,unit="sec"))
  ev = runif(N, 0, dt)
  rt = st + ev
  rt
}

set.seed(1)
dat <- data.frame(
  a = runif(1:100),
  b = rpois(100, 5),
  c = sample(c("hi","med","lo"), 100, TRUE),
  d = generate_days(100)
)

3 ответа

С практической точки зрения, возможно, вы хотели бы просто использовать дни с начала данных:

dat$d <- dat$d-as.POSIXct(as.Date("2012/01/01"))
my_tree <- rpart(a ~ ., data = dat)
rpart.plot(my_tree,branch=1,extra=101,type=1,nn=TRUE)

Это уменьшает число до чего-то управляемого и значимого (хотя, возможно, не такого значимого, как конкретная дата). Вы можете даже хотеть округлить это до ближайшего дня или недели. (Я не могу установить GTK+ на свой компьютер, поэтому я не могу fancyRpartPlot.)

Одним из возможных способов может быть использование digits варианты в print осмотреть дерево и as.POSIXlt преобразовать в дату:

> print(my_tree,digits=100)
n= 100

node), split, n, deviance, yval
      * denotes terminal node

 1) root 100 7.0885590 0.5178471
   2) d>=1346478795.049611568450927734375 33 1.7406368 0.4136051
     4) b>=4.5 23 1.0294497 0.3654257 *
     5) b< 4.5 10 0.5350040 0.5244177 *
   3) d< 1346478795.049611568450927734375 67 4.8127122 0.5691901
     6) d< 1340921905.3460228443145751953125 55 4.1140164 0.5368048
      12) c=hi 28 1.8580913 0.4779574
        24) d< 1335890083.3241622447967529296875 18 0.7796261 0.3806526 *
        25) d>=1335890083.3241622447967529296875 10 0.6012662 0.6531062 *
      13) c=lo,med 27 2.0584052 0.5978317
        26) d>=1337494347.697483539581298828125 8 0.4785274 0.3843749 *
        27) d< 1337494347.697483539581298828125 19 1.0618892 0.6877082 *
     7) d>=1340921905.3460228443145751953125 12 0.3766236 0.7176229 *

## Get date on first node
> as.POSIXlt(1346478795.049611568450927734375,origin="1970-01-01")
[1] "2012-08-31 22:53:15 PDT"

Я также проверяю digits опция доступна в rpart.plot а также fancyRpartPlot:

rpart.plot(my_tree,digits=10)
fancyRpartPlot(my_tree, digits=10)

Я не знаю, насколько важна конкретная хронологическая дата в вашей классификации, но альтернативным методом будет разбивка ваших дат по характеристикам. Другими словами, создайте ячейки на основе "года" (2012,2013,2014...) как [1,0]. "День недели" (пн, вт, ср, четверг, пт...) как [1,0]. Может быть, даже как "День месяца" (1,2,3,4,5...31), как [1,0]. Это добавляет намного больше категорий для классификации, но устраняет проблему с работой с полностью отформатированной датой.

Другие вопросы по тегам