3

当我创建一个在节点处使用日期截止的 rpart 树时,我使用的打印方法 -rpart.plotfancyRpartPlot- 以科学计数法打印日期,这使得结果难以解释。这是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)
)
4

3 回答 3

4

从实际的角度来看,也许您只想使用数据开始后的天数:

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。)

于 2016-01-08T20:01:15.557 回答
1

一种可能的方法是使用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.plotfancyRpartPlot

rpart.plot(my_tree,digits=10)
fancyRpartPlot(my_tree, digits=10)
于 2016-01-08T19:45:22.787 回答
0

我不知道具体的时间日期在您的分类中有多重要,但另一种方法是按特征细分您的日期。换句话说,创建基于“年”(2012,2013,2014...)作为 [1,0] 的 bin。“星期几”(周一、周二、周三、周四、周五...)为 [1,0]。甚至可能与 [1,0] 一样的“日期”(1,2,3,4,5...31)。这增加了更多要分类的类别,但它消除了使用完全格式化的日期的问题。

于 2016-11-28T16:19:16.330 回答