作者:厚缊,中观经济咨询助理研究员,业余数据科学爱好者。博客:houyun.xyz

简单介绍

统计建模一直是数据分析的核心模块,一般情况下,学术期刊上都是用数据表进行汇报,具有专门的统计训练的人,能很快理解各个变量之间的关系。但是,并不是所有的报告都面向专业人士,所以能用最通俗易懂的统计图形呈现估计结果,会让更多的人理解模型分析结果。

接下来,要介绍的就是visreg包,这个包简单易用,几乎支持了所有的回归分析模型,同时支持各种各样的ggplot2包提供的geom_*图层和其他扩展主题,是进行模型可视化的利器。

使用之前,请先安装必要的包。

if(!require(visreg)){ install.packages("visreg")}

为了使用ggplot2引擎,需要安装相应的扩展包。

if(!require(ggplot2)){ install.packages("ggplot2")}

生成本文所需的数据

利用R语言随机数,模拟生成了100个样本的玩具数据,这里只是方便理解visreg包提供的可视化函数,变量之间的逻辑关系和分布并没有严格考虑(主要还是对统计模型一知半解)。

set.seed(20180730)x1 <- rnorm(100)x2 <- rnorm(100, sd = 2)x3 <- rnorm(100, sd = 1.7) + 0.3cat <- sample(c(0, 1), 100, replace = TRUE)e <- rnorm(100, mean = 2, sd = 1)y0 <- 2 + 0.5 * x1 + 2.4 * x2 + 1.2 * x1 * x2 + ey1 <- 0.8 + 1.7 * x1 + 1.4 * x2 + 0.5 * x1 * x2 + ey <- ifelse(cat == 0, y0, y1)data <- data.frame(y, x1, x2, x3, cat = as.factor(cat))

各个变量之间关系如下图所示:

GGally::ggpairs(data)

## 需要安装GGally包,没安装请运行install.packages('GGally')

回归模型可视化

模型估计

visreg进行模型可视化需要先对模型进行估计,然后把模型估计结果作为参数传入visreg()函数。下面我们简单估计了四个模型,后文会断断续续用到。

reg01 <- lm(y ~ x1 + x2 + x3 + cat, data = data)reg02 <- lm(y ~ x1 + x2 + x1 * x2 + x3 + cat, data = data)reg_cat0 <- lm(y ~ x1 + x2 + x1 * x2 + x3, data = data[data$cat == 0, ])reg_cat1 <- lm(y ~ x1 + x2 + x1 * x2 + x3, data = data[data$cat == 1, ])texreg::htmlreg(list(reg01, reg02, reg_cat0, reg_cat1), single.row = TRUE)

Statistical models

## 需要texreg包,没安装请运行install.packages('texreg')

可视化

visreg包对单变量可视化时非常简洁,visreg()一条命令解决所有烦恼。默认在图中会显示出因变量、自变量之间的拟合直线、的置信区间以及原数据散点图。

visreg()前两个参数分别为fitxvar,前者为模型估计结果,后者为需要绘图的自变量。当不指定xvar参数时,会依次绘制因变量和所有自变量之间的关系图。

library(visreg)par(mfrow = c(2, 2)) ##reg01模型中有四个变量,设置为2 x 2的图visreg(reg01)

通过设置xvar参数来绘制指定自变量关系图。

visreg(reg01, "x1") ##注意,变量名一定要用引号括起来,不然会报错

除了可以对数值变量进行可视化外,也可以对虚拟变量进行可视化,参数设置规则跟数值变量一样。这里的虚拟变量是R中的因子(factor)类,当原数据中是字符串向量时,lm()函数默认转换为因子进行估计。

visreg(reg01, "cat")

当然,可以根据某个条件将数据分组,然后每组的因变量和自变量之间的关系图。比如,我们的数据中有一个cat变量,是一个二值虚拟变量,我们根据cat把数据拆分成两组,在visreg()函数中设置条件变量by = "cat"来完成全部设置。

visreg(reg01, "x1", by = "cat")

当分组变量是连续性变量时,可以breaks参数控制该变量被分成的组数。layout=c(2,2)和par(mfrow = c(2,2))作用类似,控制作图排列方式。

visreg(reg01, "x1", by = "x2", breaks = 4, layout = c(2, 2))

默认的分组图是根据给定条件进行分面(facet),类似于ggplot2包中的facet_grid()facet_wrap()函数,可以设置overlay = TRUE在同一幅图中通过图层叠加进行展示。

visreg(reg01, "x1", by = "cat", overlay = TRUE)

双变量可视化

此处的双变量是指两个自变量的情况,visreg包默认采用2.5D热图呈现的,颜色差别代表了因变量值得差异,横纵坐标分别表示两个自变量。

下面我们在一幅图上展现yx1x2变量之间的关系。此时需要用到visreg2d()函数,与visreg()类似,第一个参数任然是估计模型,第二、三个参数分别为xvaryvar,分别表示横纵坐标。

visreg2d(reg02, "x1", "x2")

visreg2d()函数有个plot.type参数来控制绘图类型。设置参数plot.type="persp"时是绘制3D表面图。

visreg2d(reg02, "x1", "x2", plot.type = "persp")

也可以通过设置参数plot.type="rgl"使用rgl包绘制3D图。

visreg2d(reg02, "x1", "x2", plot.type = "rgl") ##偷个懒,没有截图展示结果

使用ggplot2绘图引擎

visreg包默认底层使用的是R语言基本绘图函数plot()作为引擎,但可以设置参数gg = TRUE来使用ggplot2绘图引擎。

visreg(reg01, "x1", gg = TRUE)

和基本绘图函数plot()一样,我们也可以向visreg()中传递参数,调整各种绘图细节。这里我们把线条颜色设置为红色("red"),置信区间阴影设置为绿色("green"),散点大小为3(size=3,样式为21(pch=21)。

visreg(reg01, "x1", gg = TRUE, line = list(col = "red"), fill = list(fill = "green"), points = list(size = 3, pch = 21))

使用ggplot()绘图引擎时,可以方便的添加ggplot2包中的geom_*()图层。比如,我们可以在上图中添加局部平滑(smooth)拟合曲线。

library(ggplot2)  ##加载`ggplot2`包visreg(reg01, "x1", gg = TRUE) + geom_smooth(method = "loess", col = "blue",     fill = "#FF4E37")

既然能使用ggplot2的图层,自然也可以使用ggthemes提供的各种样式。

PS:我自己使用的感觉,visreg()和直接用ggplot()函数绘制的图形有较大区别,即使使用相同样式。

library(ggthemes)visreg(reg01, "x1", gg = TRUE) + geom_smooth(method = "loess", col = "blue", fill = "#FF4E37") + theme_economist()

其它模型可视化

visreg包不仅可以做普通最小二乘回归结果的可视化,同时还支持广义最小二乘回归、随机森林模、支持向量机等其它模型。

广义最小二乘回归可视化

广义最小二乘和普通最小二乘回归可视化几乎一样,下面通过一个简单的例子进行说明。

data("birthwt", package = "MASS")fit <- glm(low ~ age + race + smoke + lwt, data = birthwt, family = "binomial")visreg(fit, "lwt", gg = TRUE, xlab = "Mother's weight", ylab = "Log odds (low birthweight)")

visreg()函数默认纵轴为对数几率比,横轴为给定自变量。有时候直接呈现因变量的估计概率会更直观。可以通过scale="response"来改变默认行为。

data("birthwt", package = "MASS")fit <- glm(low ~ age + race + smoke + lwt, data = birthwt, family = "binomial")visreg(fit, "lwt", scale = "response", gg = TRUE, xlab = "Mother's weight", ylab = "P(low birthweight)")

随机森林等算法可视化

visreg包主要目的是解决回归模型可视化问题,但也适用于其它任何基于formula类,并且提供了predict()方法的模型可视化。接下来通过几个实例来进行说明。

随机森林模型

library(randomForest)aq <- na.omit(airquality)fit <- randomForest(Ozone ~ Solar.R + Wind + Temp, data = aq)visreg(fit, "Temp", gg = TRUE, ylab = "Ozone")

支持向量机模型

library(e1071)fit <- svm(Ozone ~ Solar.R + Wind + Temp, data = aq)visreg(fit, "Temp", ylab = "Ozone")

梯度下降模型

由于gbm包没有提供residuals方法,所以该包的梯度下降模型可视化不能显示残差散点。我们可以进行自定义该方法。

residuals.gbm <- function(fit) { fit$data$y - fit$fit}

定义完后再调用visreg()函数就能绘制残差散点了。

library(gbm)fit <- gbm(Ozone ~ Solar.R + Wind + Temp, data = aq, distribution = "gaussian")visreg(fit, "Temp", ylab = "Ozone")

——————————————

往期精彩:

  • 真实经历,互联网大厂升职加薪那些事

  • 报错:一个由Error引发的思考

  • 如何通过R建立流程图:DiagrammeR

  • R语言中文社区2018年终文章整理(作者篇)

  • R语言中文社区2018年终文章整理(类型篇)

visreg:带你玩遍模型可视化相关推荐

  1. 【游戏开发进阶】带你玩转模型法线,实验一下大胆的想法(法线贴图 | shader | Unity | python | 爬虫)

    文章目录 一.前言 二.直观感受法线贴图 三.表面法线 1.表面法线的概念 2.空间与坐标系 2.1.世界空间--世界坐标系 2.2.局部空间--局部坐标系 2.3.切线空间--切线坐标系 2.4.小 ...

  2. 手把手带你玩转Spark机器学习-使用Spark构建回归模型

    系列文章目录 手把手带你玩转Spark机器学习-专栏介绍 手把手带你玩转Spark机器学习-问题汇总 手把手带你玩转Spark机器学习-Spark的安装及使用 手把手带你玩转Spark机器学习-使用S ...

  3. 『中秋赏月』程序员用文心大模型带你玩转不一样的中秋

    『中秋赏月』文心大模型带你玩转不一样的中秋 中秋 文心大模型使用 安装wenxin_api 利用ERNIE-ViLG文生图模型生成图片 下载生成的图片 使用ERNIE 3.0模型,生成有关中秋的佳句 ...

  4. 带你们轻松玩遍吃遍张家界

    来张家界的朋友一般都会去的景点是国家森林公园.天门山.玻璃桥.凤凰等等,玩遍这些景点至少需要4天-5天的时间.很多朋友虽然想一次性玩遍张家界的各大景点,但是由于时间.距离关系,只能选取几个最想去的地方 ...

  5. 21.08.01 cnvoron带你玩转Voron2.4

    树哥带你玩Voron之用蜘蛛8轴主板玩转Voron2.4 ​ 2021.08.01 第一版 ​ 本教程版权所有,未经许可,切勿用作商业用途,违者必究! ​ ​ VORON2.4使用者(大树-执笔) 文 ...

  6. tensorboard的可视化及模型可视化

    待整理 How to Check-Point Deep Learning Models in Keras LossWise Tensorboard 中文社区 谷歌发布TensorBoard API,让 ...

  7. 【转】带你玩转Visual Studio——03.带你了解VC++各种类型的工程

    上一篇文章带你玩转Visual Studio--带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途.由于这里包含的工程类型太多,有很多本人也 ...

  8. 一个垃圾分类项目带你玩转飞桨(2)

    一个垃圾分类项目带你玩转飞桨(2) 接上文<一个垃圾分类项目带你玩转飞桨(1)>:基于PaddleClas实现垃圾分类,导出inference模型利用PaddleHub Serving 进 ...

  9. 手把手带你玩转Spark机器学习-使用Spark进行数据降维

    系列文章目录 手把手带你玩转Spark机器学习-专栏介绍 手把手带你玩转Spark机器学习-问题汇总 手把手带你玩转Spark机器学习-Spark的安装及使用 手把手带你玩转Spark机器学习-使用S ...

  10. cad的文字嵌入线条_带你玩转CAD!

    CAD画图已经成为化工人的必备技能.什么,这么多CAD必备技巧你居然还不知道?我该拿什么拯救你,我最最最最最最亲爱的旁友!!!下面给大家整理了50个相见恨晚的CAD技巧,带你玩转CAD!!相见恨晚的5 ...

最新文章

  1. 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别
  2. 易语言怎么判断文件是否一样_怎么判断网站建设公司是否正规
  3. Python 科学计算库 Numpy(一)—— 概述
  4. 音频处理基本概念及音频重采样
  5. 检查您的REST参数!
  6. 空格 过滤多个_CAD选择过滤器的运算符如何使用?
  7. git status怎么操作_Git 基本操作
  8. SQL中Case语句用法讨论
  9. 使用python+机器学习方法进行情感分析(详细步骤)
  10. 18. PHP 表单验证
  11. D - Daydreaming Stockbroker Gym - 101550D
  12. 多校9 HDU-6164 Dying Light 几何数学
  13. python中怎么统计英文字符的个数_【Python练习1】统计一串字符中英文字母、空格、数字和其他字符的个数...
  14. ICO文件缩略图显示错误
  15. 安卓应用 .9.png类型启动图/背景图
  16. 深入理解Linux虚拟内存管理(二)
  17. 什么是你的核心竞争力?
  18. 下载deb及其依赖软件包,离线安装deb软件包
  19. 交叉编译工具的使用说明
  20. SDK设计心得之接口设计

热门文章

  1. solrcloud和zookeeper的搭建、使用、心得、教训
  2. 可怕!离职都开始内卷了?!
  3. 30 个 ElasticSearch 调优知识点,都给你整理好了!
  4. 看看华为 Java 编程的军规...
  5. 可怕!你没看错,这次确实是纯手工实现一个MyBatis框架!
  6. 运维是否有前(钱)途?
  7. Java 爬虫简单起步
  8. 十年软件开发经验小结
  9. OpenWebFlow0.9用户手册与设计说明
  10. OpenCV Show Image cvShowImage() 使用方法