原文链接

本文为了说明回归树的构造(使用CART方法),考虑以下模拟数据集,

> set.seed(1)

> n=200

> X1=runif(n)

> X2=runif(n)

> P=.8*(X1<.3>

+ .2*(X1<.3>.5)+

+ .8*(X1>.3)*(X1<.85>

+ .2*(X1>.3)*(X1<.85>.3)+

+ .8*(X1>.85)*(X2<.7>

+ .2*(X1>.85)*(X2>.7)

> Y=rbinom(n,size=1,P)

> B=data.frame(Y,X1,X2)

具有一个因变量(感兴趣的变量)和两个连续的自变量( 变量

 和

)。

> tail(B)

Y X1 X2

195 0 0.2832325 0.1548510

196 0 0.5905732 0.3483021

197 0 0.1103606 0.6598210

198 0 0.8405070 0.3117724

199 0 0.3179637 0.3515734

200 1 0.7828513 0.1478457

理论分区如下

在这里,可以将样本绘制在下方(请注意,第一个变量在上方的y轴上,在下方的x轴上),蓝色点   等于1,红色点等于0,

> plot(X1,X2,col="white")

> points(X1[Y=="1"],X2[Y=="1"],col="blue",pch=19)

> points(X1[Y=="0"],X2[Y=="0"],col="red",pch=19)

为了构造树,我们需要一个分区critera。最标准的可能是Gini的索引,当将s分为两类时,可以写出该索引,  在此表示

或  将分为三类时,表示为

等等,这里

 只是属于分区的观测值的计数,

 其   取值为

。但是可以考虑其他标准,例如卡方距离,

在传统上,当我们考虑两个等级时,或者在三个等级的情况下。

同样,这里的想法是使距离最大化:想法是区分,所以我们希望样本尽可能不独立。要计算基尼系数

我们只需构造列联表,然后计算上面给出的数量。首先,假设只有一个解释变量。我们将样本一分为二,并使用所有可能的分割值

,即

然后,我们为所有这些值计算基尼系数。结是使基尼系数最大化的值。有了第一个节点后,我们将继续保留(从现在开始将其称为

)。我们通过寻找最佳第二选择来重申:给定一个根节点,考虑将样本一分为三的值,并给出最高的基尼系数,因此,我们考虑以下分区

或这个

也就是说,我们在上一个结的下方或上方分割。然后我们进行迭代。代码可以是这样的,

> for(s in 1:4){

+ for(i in 1:length(u)){

+ vgini[i]=GINI(Y,I)

+ }

+

+

+ cat("knot",k,u[k],"\n")

+

+

+ }

knot 69 0.3025479

knot 133 0.5846202

knot 72 0.3148172

knot 111 0.4811517

第一步,基尼系数的值如下:

最高约为0.3。然后,我们尝试分三部分构造一个分区(拆分为0.3以下或以上)。我们得到以下基尼系数图(作为第二个节点的函数)

当样本在0.6左右分裂(这成为我们的第二个节点)时最大。等,现在,让我们将代码与标准R函数进行比较,

node), split, n, deviance, yval

* denotes terminal node

1) root 200 49.8800 0.4750

2) X2 < 0.302548 69 12.8100 0.7536 *

3) X2 > 0.302548 131 28.8900 0.3282

6) X2 < 0.58462 65 16.1500 0.4615

12) X2 < 0.324591 7 0.8571 0.1429 *

13) X2 > 0.324591 58 14.5000 0.5000 *

7) X2 > 0.58462 66 10.4400 0.1970 *

我们确实获得了类似的结:第一个为0.302,第二个为0.584。因此,构造树并不难...

现在,如果我们考虑两个解释变量,该怎么办?保持不变,除了分区的编写现在变得更加复杂。为了找到第一个节点,我们考虑了两个分量的所有值,然后再次保持最大化基尼指数的值,

> plot(u1,gini[,1],ylim=range(gini),col="green",type="b",xlab="X1",ylab="Gini index")

> abline(h=mg,lty=2,col="red")

> if(i==1){points(u1[which.max(gini[,1])],mg,pch=19,col="red")

+ segments(u1[which.max(gini[,1])],mg,u1[which.max(gini[,1])],-100000)}

> u2[which.max(gini[,2])]

[1] 0.3025479

这些图如下所示并获得了右侧的分区,

或者我们分割第二个分区(然后得到以下分区),

在这里,最好先分割第二个变量。实际上,我们回到了前面讨论的一维情况:正如预期的那样,最好在0.3左右进行分割。以下代码已确认这一点,

var n dev yval splits.cutleft splits.cutright

1 X2 200 49.875000 0.4750000 <0.302548 >0.302548

2 X1 69 12.811594 0.7536232 <0.800113 >0.800113

4 57 8.877193 0.8070175

5 12 3.000000 0.5000000

对于第二个结,应考虑四种情况:在第二个变量上再次分裂(再次),在上一个结之上或之下(请参见左下方)或在第一个变量上分裂。然后在上一个结的下方或上方设置一个分区(请参见右下方),

为了使树可视化,代码如下

注意,我们也可以可视化该分区。

参考文献

R语言ineq算基尼系数_R语言中自编基尼系数的CART回归决策树的实现相关推荐

  1. R语言ineq算基尼系数_科学网—一招搞定泰尔指数及其分解 - 王庆喜的博文

    一招搞定泰尔指数及其分解 上期讲了区位基尼系数,这期讲讲泰尔指数. 泰尔指数的原理同基尼系数,都是在测度一组数据分布的差异性.但是其有着良好的可分解性质,因此当需要考察产业空间集中度在不同区域层面的差 ...

  2. R语言ineq算基尼系数_还在用Excel算区位基尼系数?用geo.gini吧!

    区域经济研究中,经常需要测度产业空间集中的程度,常用的指标有区位基尼系数(Locational GiniCoefficient).泰尔指数(Theil Index)和EG指数等.这一期先讲区位基尼系数 ...

  3. R语言ineq算基尼系数_5 月编程语言排行榜:Java第一,R跌出Top20

    我们都知道,最近,TIOBE 发布了 5 月份编程语言排行榜.其中,前三名依然健稳不变,他们分别是 Java.C.C++,第四则为: Python ,第五则为 VB .NET. 下面两张图,我们可以看 ...

  4. r语言remarkdown展示图_R语言中的十个小技巧

    一.switch函数 我喜欢swith().它基本上是根据另一个变量的值来选择其值的if语句的一个方便的缩写.我发现当我编写代码时,根据您先前的选择需要加载不同的数据集时,它特别有用.例如,如果您有一 ...

  5. r语言各形状编号_R语言的基本图形操作

    R 语言的基本图形操作 图形功能是 R 语言的最重要的功能之一,也是用户最感兴趣的特性.在 R 的基本程序 包( package )和扩展程序包(比如 ggplot2 )中包含了大量的作图函数,几乎可 ...

  6. 查找算法的实现c语言,查找算法的实现(C语言版)

    <查找算法的实现(C语言版)>由会员分享,可在线阅读,更多相关<查找算法的实现(C语言版)(6页珍藏版)>请在人人文库网上搜索. 1.芬梨受交峙东喊济雏狈违晕裂赵檀芬逛温乌摄阿 ...

  7. R语言ineq算基尼系数_R语言常用计量分析包

    R 语言常用计量分析包 CRAN 任务视图:计量经济学 线形回归模型( Linear regression models ) 线形模型可用 stats 包中 lm() 函数通过 OLS 来拟合, 该包 ...

  8. r指引到文件夹_R语言中进行文件夹及文件夹内文件操作范例

    rm(list=ls()) path = 'J:/lab/EX29 –在R语言中进行文件(夹)操作' setwd(path) cat("file A\n", file=" ...

  9. R语言中dim函数_R语言中的方差分析方法汇总

    方差分析,是统计中的基础分析方法,也是我们在分析数据时经常使用的方法.下面我总结一下R语言如何对常用的方差分析进行操作. 1. 方差分析的假定 上面这个思维导图,也可以看出,方差分析有三大假定:正态, ...

最新文章

  1. Windos 10 下,应用版ubuntu系统, 访问windos文件系统
  2. Metasploit 之 webshell 提权
  3. java servicefactory_Java DirectoryServiceFactory.getDirectoryService方法代碼示例
  4. log4net 日志框架的配置
  5. 【Java从入门到天黑|05】JavaSE入门之面向对象(下)
  6. 慕学在线网0.4_xadmin后台管理
  7. Promise源码解析
  8. ICCV 2019 | Adobe 无需大量数据训练,内部学习机制实现更好的视频修补
  9. DbEntry on Mono 测试
  10. C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)
  11. css如何设置动画,css3如何设置动画?css设置简单动画的方法
  12. 金融科技大数据产品推荐:金蜂巢大数据集成与脱敏系统
  13. inter,amd,arm公司以及x86,arm,mips等架构关系
  14. 修改Listen 1源码的一点心得
  15. js控制html控件显示隐藏和是否可用
  16. 《Bootloader 启动流程和概念介绍》
  17. 3D成像方法 汇总(原理解析)--- 双目视觉、激光三角、结构光、ToF、光场、全息
  18. 生命科学名言08:细胞周期时钟
  19. VR垃圾分类体验系统,VR垃圾分类知识抢答软件开发
  20. linux c++ 等待函数,JavaScript在nodejs中实现sleep休眠函数wait等待的方法

热门文章

  1. ubuntu 安装jdk+tomcat
  2. 使用 face++ API 实现人脸识别,刷脸登陆和活体检测(张张嘴,眨眨眼)
  3. linux minecraft 指令,linux中uptime命令
  4. 如何确定关系模式属于第几范式
  5. MQTT10-MQTT在星辰大海中的应用
  6. [ERDAS] 裁剪 拼接 融合 修改指定像素的值
  7. 决策树之 ID3 算法
  8. 关于MAC如通过虚拟机安装ubuntu
  9. python海龟绘图画海螺_python海龟画图
  10. 搭建TinyTiny rss服务