在日常教学的过程中,我有时会用动画来形象地解释概念,并且通过 @rafalab账号(https://twitter.com/rafalab)在社交媒体上分享。
John Storey最近问我是否可以公开这些源代码。由于我不甚有条理,而且这些动画都是灵机一动想出来的,所以之前这些代码分散在几个不相关联的文件中。John的请求促使我把这些代码整理在一起发布在这里。
所有的gif动图都是用R语言绘制的数张图片的叠加。在代码中你可以发现,我用几种不同的方法将单独的图片转化成动态gif图。***种方法(不推荐)是将图片文件存储下来,然后调用ImageMagick转化工具(https://www.imagemagick.org/script/index.php)。在R环境下,我现在使用的方法是animation包的saveGIF函数,这是通过读者Yihui Xie在我simplystats博客下面的评论学习到的。当用ggplot画图时,我会使用David Robinson的gganimate包(https://github.com/dgrtwo/gganimate)。***一种方法是我在加特效(例如调相)时会用到的:在线Animated GIF maker(https://ezgif.com/maker)。
以下就是这些gif动图的源代码,我大致按流行程度排序。因为代码是很着急写出来的,请不要过于苛责我。事实上,你可以随意批判,这就是我们学习的方式。
辛普森悖论
这张gif阐述的是辛普森悖论:我们看到X变量和Y变量有很强的负相关关系。不过,一旦我们用一个混杂因素Z变量进行分层,用不同颜色来表示Z,每一层中的相关性就会转化为正相关。这里的数据是虚构的,不过假设说X代表学生参加辅导的次数,Y代表九年级的测验分数,然后再用八年级的测验分数Z来对学生进行分层,我们也会发现这样的现象。
这张动图仅用三张图片组成。我用RStudio的Export功能将它们把存下来,然后用Animated GIF maker(https://ezgif.com/maker)来制作gif。以下是这三张图片的代码:
局部加权回归散点平滑法(Loess)
我分享的***个教学动图是为了解释局部加权回归散点平滑法(Loess)的原理。具体来说,我们对于每一个自变量,比如x0,都让其对任何一个临近点有正的加权值,用加权回归拟合一条线,保留经过拟合所得的结果,然后移动向下一个点。
这里的数据来源是某个基因芯片实验。图中所示的是MA图,即比例对数与对数平均值之间的关系。我用animation包来保存gif动图。
预期寿命 vs 生育率
这个gif动图是复制Hans Rosling (https://en.wikipedia.org/wiki/ Hans_Rosling)在他的演讲“关于贫穷的新发现”(New Insights on Poverty,(https://www.ted.com/talks/ hans_rosling_reveals_new_insights_on_poverty?language=en))中展示的动画。该图很好地展现出数据可视化在消除误解方面的作用,Hans Rosling通过这张动图展示了如今并不如40年前一样能够简单将世界划分成两半。之前,人们一般把世界分为拥有更长寿命、较少家庭人口的西方富有国家和较短寿命、较多家庭人口的发展中国家,而这个图向我们展示了这种划分的不合理性。
感谢gganimate包,画这个图使用的代码非常简单。
联合国选举模式
这里,我们使用Erik Voeten和Anton Strezhnev提供的联合国选举数据来阐释距离的概念。
以下是代码。整理数据的代码是由David Robinson(https://twitter.com/drob)提供的。你会看到我们将随时间变化的距离进行了平滑处理,从而避免一些点跳动范围过大。
随机森林
在过去的很长一段时间里,我都觉得很难理解为何随机森林作为一种基于树的算法,却能够产生平滑的预测。这里的gif图帮助我理解了原因。我用的是2008年总统选举的数据库,因为我认为该数据的趋势总体是平滑的,但是有几个尖锐的边,就连局部加权回归散点平滑法都很难预测。需要注意的是,我们只有一个影响因素,这个gif并不能展示出随机森林的另一个重要特点:随机的特征选取可以减少树与树之间的相关程度。
你可以看到我在代码中使用的方式是传统的、我并不推荐的方式:保存所有的图片文件然后调用系统指令转化。
生态谬误
在分享辛普森悖论的动图以后,有些人问我生态谬误是不是相同的情况。其实这二者是不同的。生态谬误是我们试图通过平均值的强相关性来推断个体之间的相关性。为了更好的解释,我用dslabs包中自带的gapminder的数据(http://gapminder.org/)画出了一个动图,展示新生儿存活率的对数与日均收入的对数之间的关系。可以看到在地区层面上二者相关度很高,但在各个国家层面上相关度很低。这是因为同一地区国家与国家之间的差异导致的。
这张gif只由三张图构成。我用RStudio的Export功能保存图片,然后用Animated GIF maker(https://ezgif.com/maker)来制作gif。
***张图是地区平均值;撒哈拉以南非洲国家的数值,你可以看到一个平均值被分成数个不同的数值;第三张是所有国家的情况。我标出了一些(与本地区相比)变化较大的国家,并且用了色盲也能识别的颜色。这里的代码有些复杂,原因是我不得不对Gapminder数据进行预处理。
贝叶斯定律
这个简单的动图展示的是将一种非常准确的诊断方法应用于一个发病率很低的群体的诊断结果。它展示出来的是,在已知诊断结果是阳性的情况下发病的先验概率,比该诊断方法的初试准确率要低。你可以用贝叶斯定律来确定真实的条件概率。更多细节请参考这里(https://simplystatistics.org/2014/10/17/bayes-rule-in-a-gif/)。
因为我们要做动态图,代码有一些复杂难懂。
吃豆子
***,我做了这个动画,向你们展示饼图唯一的用处。