引言
随机森林( random forest) 是一种基于分类树( classification tree) 的算法,它可以用于分类和回归,本文在这里以广西地区1990-2014共25年的GDP数据作为因变量,以INV投资、CON消费、NEX净出口为三个自变量,运用R语言软件做随机森林回归,最终得到三个自变量的相对重要程度。
1 数据
从广西统计年鉴中取得1990-2014年的因变量与自变量数据,放入excel表格中。
2 步骤
2.1 安装randomForest
包
在R语言中,randomForest
包提供了随机森林的实现,使用randomForest
需要先安装这个包,在R的交互命令中使用下面的命令安装:
> install.packages("randomForest")
然后在弹出的镜像列表中选择一个国内的镜像站点就可以自动安装了。
2.2 使用randomForest
包
在R的交互命令中引入randomForest
:
> library(randomForest)
屏幕上会输出randomForest
包的版本信息。
2.3 导入数据
将已经整理好的excel数据放入R语言的workspace中,或将R的工作空间加载为存有excel的文件夹。
将数据导入到R中并查看:
> gxdata <- read.csv("gxdata1990-2014.csv")
> gxdata
X gdp con inv nex
1 1990 449.06 175.4369 68.5666 8.0611
2 1991 518.59 200.2276 89.6479 10.1670
3 1992 646.60 243.6189 141.0395 29.2378
...
24 2013 14449.90 5133.1000 11907.6669 862.2181
25 2014 15672.89 5772.8317 13843.2123 996.4330
2.4 数据的初步处理
在这里我们通过两个步骤将每一行的名字以年份命名。首先去掉第一列(年份),将去掉后的矩阵命名为gxdata_without_x,然后查看新生成的矩阵,命令如下:
> gxdata_without_x <- gxdata[,-1]
> gxdata_without_x
gdp con inv nex
1 449.06 175.4369 68.5666 8.0611
2 518.59 200.2276 89.6479 10.1670
3 646.60 243.6189 141.0395 29.2378
……
24 14449.90 5133.1000 11907.6669 862.2181
25 15672.89 5772.8317 13843.2123 996.4330
第二步,取出gxdata矩阵中的第一列gxdata[,1](年份),给矩阵的每一行命名,可查看新的矩阵,命令如下:
> row.names(gxdata_without_x) <- gxdata[,1]
> gxdata_without_x
gdp con inv nex
1990 449.06 175.4369 68.5666 8.0611
1991 518.59 200.2276 89.6479 10.1670
1992 646.60 243.6189 141.0395 29.2378
……
2013 14449.90 5133.1000 11907.6669 862.2181
2014 15672.89 5772.8317 13843.2123 996.4330
2.5 多元线性回归分析
利用2.4中处理好的矩阵gxdata_without_x,以CON、INV、NEX为自变量,GDP为因变量做多元回归分析,查看多元线性回归分析在本例中的分析结果。命令及显示结果如下:
> gx.lm <- lm(gdp~con+inv+nex,data = gxdata_without_x)
> summary(gx.lm)
Call:
lm(formula = gdp ~ con + inv + nex, data = gxdata_without_x)
Residuals:
Min 1Q Median 3Q Max
-657.08 -97.80 -20.73 53.71 613.23
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 123.88962 101.58446 1.220 0.2361
con 2.31725 0.21224 10.918 4.07e-10 ***
inv -0.05828 0.08507 -0.685 0.5008
nex 3.64880 1.55491 2.347 0.0288 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 224.9 on 21 degrees of freedom
Multiple R-squared: 0.998, Adjusted R-squared: 0.9977
F-statistic: 3410 on 3 and 21 DF, p-value: < 2.2e-16
从结果中,可以看出,尽管模型通过F检验,决定系数R方高达0.998,但在回归方程中,投资一项的p值=0.5008,远大于统计显著性所要求的0.05,无法通过t检验,需要再回归模型中剔除。也即是说,所建立的数据模型不包含投资这一项,这明显不符合广西经济运行情况。
2.6 随机森林回归
用随机森林算法做回归分析,在此设定树的数量为1000,命令如下:
> gx.rf<-randomForest(gdp~.,data=gxdata_without_x,importance=TRUE, ntree=1000)
建好随机森林的回归模型gx.rf后,使用print命令可查看模型结果:
> print(gx.rf)
Call:
randomForest(formula = gdp ~ ., data = gxdata_without_x, importance = TRUE, ntree = 1000)
Type of random forest: regression
Number of trees: 1000
No. of variables tried at each split: 1
Mean of squared residuals: 724182.3
% Var explained: 96.51
这里一个重要的系数是96.51,称为拟合优度,它的作用类似于回归分析中的R方。
当我们需要查看已建好的随机森林的回归模型gx.rf中,各个自变量的重要程度时,使用以下命令,得到结果如下:
> importance(gx.rf)
%IncMSE IncNodePurity
con 20.75824 157065888
inv 21.46871 159356379
nex 21.87843 168809738
画出自变量重要性排序图,可以用varImpPlot命令,在本例中的命令为:
> varImpPlot(gx.rf)
得到图:
也就是说,在三个自变量中,它们的重要性程度排序为NEX>INV>CON。
您好,首先谢谢你的讲解分析,帮助我这个小白明白了很多关于random forest 的入门知识。现在有一个问题想要请教下:如何在随机森林中计算出P值?就像多元回归分析中会有R2和P值,目前R2我是知道了(Var explained),但是对应的P值程序结果里面并没有显示,所以像请教下这个问题。 Ps: 是整个回归的P值,不是用rfpermute算出来的每个变量的P值。
我现在弄清楚啦
请教下怎么计算每个变量的P值?具体的命令是什么,麻烦了
您好,请问这个要怎么求呢?
好多文献需要用Cross-Validated R^2计算R2,具体命令是什么呀
> importance(gx.rf)
%IncMSE IncNodePurity
con 20.75824 157065888
inv 21.46871 159356379
nex 21.87843 168809738
您好, % Var explained结果是负值,但是P值显著,怎么解释
现在R最新版本下不了randomForest怎么办呀
您好,我的% Var explained为负值,这种情况应该怎么办呀?这代表什么意思呀?理论上应该不为负值对吗?