我不知道如何在R中创建这个树

时间:2015-06-22 13:24:13

标签: r tree

我希望通过每小时应用更好的广告系列来实现收入最大化。

我想创建一个可以帮助我选择更好的广告系列的树。

根据以下数据,每小时每个广告系列的收入都有记录。

查看数据,我可能会看到广告系列A在1-12小时之间更好,而广告系列B在13-24小时之间更好。

如何在R中创建告诉我的树?

  hour campaign revenue
    1        A      23
    1        B      20
    2        A      21
    2        B      22
    3        A      23
    3        B      20
    4        A      21
    4        B      22
    5        A      23
    5        B      20
    6        A      21
    6        B      22
    7        A      20
    7        B      17
    8        A      18
    8        B      19
    9        A      20
    9        B      17
   10        A      18
   10        B      19
   11        A      20
   11        B      17
   12        A      19
   12        B      18
   13        A       8
   13        B       9
   14        A       6
   14        B      11
   15        A       9
   15        B       8
   16        A       6
   16        B      11
   17        A       9
   17        B       8
   18        A       6
   18        B      11
   19        A       3
   19        B       2
   20        A       3
   20        B       2
   21        A       0
   21        B       5
   22        A       3
   22        B       2
   23        A       3
   23        B       2
   24        A       0
   24        B       5

2 个答案:

答案 0 :(得分:3)

我不确定您正在寻找什么样的树,但revenue的线性模型树(带有回归量campaign和分区变量hour)可能很有用。使用包lmtree()中的partykit,您可以通过拟合具有两个系数的线性模型(拦截和广告系列B效果)来开始树,然后只要存在重要的不稳定性,就会对数据进行拆分。至少有一个系数:

library("partykit")
(tr <- lmtree(revenue ~ campaign | hour, data = d))
## Linear model tree
## 
## Model formula:
## revenue ~ campaign | hour
## 
## Fitted party:
## [1] root
## |   [2] hour <= 12: n = 24
## |       (Intercept)   campaignB 
## |         20.583333   -1.166667 
## |   [3] hour > 12: n = 24
## |       (Intercept)   campaignB 
## |          4.666667    1.666667 
## 
## Number of inner nodes:    1
## Number of terminal nodes: 2
## Number of parameters per node: 2
## Objective function (residual sum of squares): 341.1667

在这个(可能是人为的)数据中,这选择了12小时的单个分割,然后有两个终端节点:一个具有负面的活动B效果(即A更好)和一个具有正面活动B效果(即,B更好)。结果plot(tr)产生:

lmtree visualization

这也表明,分割也受到收入水平变化的驱动,而不仅仅是不同的竞选效应(相当小)。

底层树算法称为“基于模型的递归分区”(MOB),也适用于线性回归以外的模型。有关详细信息,请参阅手册和插图中的参考资料。

另一种可能有趣的算法是Dusseldorp&amp; amp;的QUINT(定性交互树)。 Van Mechelen,可在quint包中找到。

为便于复制上述示例:可以通过

重新创建d数据框
d <- read.table(textConnection("hour campaign revenue
    1        A      23
    1        B      20
    2        A      21
    2        B      22
    3        A      23
    3        B      20
    4        A      21
    4        B      22
    5        A      23
    5        B      20
    6        A      21
    6        B      22
    7        A      20
    7        B      17
    8        A      18
    8        B      19
    9        A      20
    9        B      17
   10        A      18
   10        B      19
   11        A      20
   11        B      17
   12        A      19
   12        B      18
   13        A       8
   13        B       9
   14        A       6
   14        B      11
   15        A       9
   15        B       8
   16        A       6
   16        B      11
   17        A       9
   17        B       8
   18        A       6
   18        B      11
   19        A       3
   19        B       2
   20        A       3
   20        B       2
   21        A       0
   21        B       5
   22        A       3
   22        B       2
   23        A       3
   23        B       2
   24        A       0
   24        B       5"), header = TRUE)

答案 1 :(得分:0)

这样的事情会起作用吗?

## create a sequence of hours from column 1 of the data
hr <- as.numeric(unique(data[,1]))

## Set up vectors to hold the A and B campaign "best" hours
A.hours=NULL
B.hours=NULL

## start at the lowest hour 
i=1
while(i<=max(hr)) {
    ## create a subset of data from the current hour 
    sub.data <- data[matrix(which(data[,1]==hr[i])),]
    ## find the campaign with the highest revenue  
    best.camp <- sub.data[which(sub.data[,3]==max(sub.data[,3])),2]

    if(best.camp=="A") {
        A.hours <- c(A.hours,hr[i])
    }
    if(best.camp=="B") {
        B.hours <- c(B.hours,hr[i])
    }

    i=i+1
}

代码表明,在A.hours(小时:1 3 5 7 9 11 12 15 17 19 20 22 23)期间,活动A更有利可图。

然而,在B.hours(小时:2 4 6 8 10 13 14 16 18 21 24)期间,B运动更有利可图。