如何高效地使用RStudio

Python019

如何高效地使用RStudio,第1张

RStudio Server 是 RStudio 公司打造的一款基于 Web 的开源编辑器,如果你熟悉 RStudio的桌面版本,那么使用RStudio Server对你来说基本上没什么难度。

实际的工程中,我们的服务器大多是基于Linux的,比如常见的 ubuntu、centos

等。这些操作系统有时并不提供图形化界面,这时候RStudio的服务器版本就派上用场了。启动RStudio

Server后,进入在浏览器中进入某一个页面后就可以像桌面版一样使用RStudio编辑器。当R的代码在服务器上出现bug了,线上的hotfix是

在所难免的,这时候必然会用到 RStudio Server 应个急。

这一次,我们将继续利用Docker神器,快速初始化RStudio Server环境的配置,并结合Git实现代码的版本控制。

准备

一个 Ubuntu 服务器

第一步:安装 RStudio Server

首先,我们通过docker 安装一个标准的RStudio Server

docker pull quantumobject/docker-rstudio

docker run -d -p 8787:8787 quantumobject/docker-rstudio

这样在你的电脑的8787端口就可以访问到rstudio的登陆界面了。

第二步:初始化 RStudio 账号

接着,我们需要初始化一个rstudio的账号

docker exec -it container-id /bin/bash

adduser harryzhu # 设置新用户名

passwd harryzhu # 设置该用户的密码

mkdir /home/harryzhu # 初始化工作空间

chmod -R harryzhu /home/harryzhu # 给工作空间赋权

第三步:安装 git

然后,我们进入rstudio的服务器,我们打算引入git版本控制

sudo apt-get install git-core

第四步:解决 ssh 的认证问题

使用 git 的过程可能遇到SSL certificate problem。对于ssh的问题,我们可以选择建立一个ssh认证的key,也可以在git中设置为忽略。

生成一个key:

$ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Created directory '/root/.ssh'.

连续按下回车,跳过密码设置

显示秘钥信息:

sudo cat /root/.ssh/id_rsa.pub

如果没有ssh认证的需求,也可以选择忽略:

git config --global http.sslVerify false

第五步:在 RStudio Server 中配置Git

在最上方的菜单栏中可以选择Project Options。

接着填写配置。

第六步:克隆 Git 项目到本地

Git 功能已经集成在 RStudio-Server 中了,在新建项目时可以选择新建一个Version Control 的 Git 项目。

大功告成!

参考资料

docker-rstudio 手册

张丹老师的 RStudio-Server 配置实战

Rstudio 官方 git 解决方案

刘坤老师的 Git 中文教程

---------------------------------------------------------------------------------------------------------------

概述

本文根据 Rstudio Webinars 的教程资源对Rstudio流的R语言教程做一个汇总,可以看到Rstudio对统计报告的Web化和工程化做了大量贡献。感谢Rstudio的众多工程师在开源的道路上的贡献!

谢溢辉:LaTex/Word的统计报告大逃亡之Rmarkdown生态

教学视频地址

在可交互、可复用的统计报告中,谢溢辉将介绍一众R包,包括 knitr、rmarkdown、htmlwidgets、DT、leaflet以及shiny。

快速标准的论文书写# $something$ 或者 $$something$$ 可以解决数学公式的问题

# 利用 bib 文件和[@something] 可以解决引用的问题

# 同样的,你也可以根据一些机构要求引入标准的模板。

参考谢溢辉的Rmarkdown论文

参考谢溢辉的bib文件

屏蔽源码# ```{r echo=F}屏蔽源代码

# ```{r, fig.width=5, fig.height=4} 设置配图大小

# 脚注

代码段内存共享

利用cache选项复用代码和数据

Sys.sleep(5)

rnorm(1)

输出其他语言代码

利用engine选项选择代码引擎,驱动python、R、scala、Rcpp、bash、perl、node等

x = 'hello, python

world!'

print(x)

print(x.split(' '))

交互式文档

利用yaml配置中的runtime选项

---

author: Harry Zhu

output: html_document

runtime: shiny

---

同理,你也可以选择输出slide、pdf或者word,你甚至可以给html定制一个css皮肤。

在我看来,rmarkdown是一款超越Zeppelin和iPython notebook的产品。

最总要的意义在于,学术工作者和工程师们不仅仅可以摆脱格式对创作的束缚专注于代码和文档,更是随意输出pdf、slide、html、word、latex等多种格式,形成强有力的跨界冲击。

谢溢辉本人有超过10年以上的LaTex使用经验,他的rmarkdown和knitr造福了一代学术工作者,显然LaTex和Word的体系在这种降维攻击下已经摇摇欲坠。

Hadley Wickham:R与大数据共舞

教学视频地址

R是一门为小数据探索和开发设计的语言,但在生产中R和大数据在一起还能发挥作用吗? 我们定义数据量大于单机内存的数据为大数据。让我们对比一下大数据与小数据的生命周期。

一个小数据分析项目的生命周期:

阐明:熟悉数据、模板解决方案

开发:创建有效模型

产品化:自动化与集成

发布:社会化

一个大数据分析项目的生命周期:

切片:抽取部分数据

阐明:熟悉数据、模板解决方案

开发:创建有效模型

扩展:使用到整个数据集

产品化:自动化与集成

发布:社会化

dplyr与数据读取

教学视频地址

PackageDBMSsrc_sqlite()SQLitesrc_mysqlMySQLsrc_postgresPostgreSQLlibrary(bigquery) src_bigquery()Google BigQuery

显示SQLshow_query(clean)

中间缓存

collapse()返回正在处理的结果

# 抽取 1% 的训练数据

random <- clean %>%

mutate(x = random()) %>%

collapse() %>%

filter(x <= 0.01) %>%

select(-x) %>%

collect()

数据存储

copy_to() 根据本地的data frame 在数据库创建一个表

# air为connection名称,query5为data frame,"gains"为表名

copy_to(air, query5, name = "gains")

# 关闭连接

rm(air)

# 垃圾收集器

gc()

Hadley Wickham:ETL

教学视频地址

本节将讨论一个有效的数据分析/数据科学问题框架,包括:

数据读取 readr/httr/DBI

数据清洗 tidyr/jsonlite

数据处理 dplyr/rlist

数据可视化 ggplot2/ggvis

数据建模 broom

broom:快速分析install.packages("broom")

# 查看相关例子

browseVignettes(package="broom")

Hadley Wickham是RStudio的首席科学家,并兼任统计莱斯大学的兼职教授。他将一一介绍他认为你应该知道的各种R包,并概述大数据和R,但主要是解释为什么他相信你不应该担心大数据的问题。

garrettgman:packrat与虚拟化技术

教学视频地址

是否有过这样与人合作开发的经历:在自己机器上运行完美的R代码,复制到另外一台同事的机器上运行就有很多R包需要重新安装,有的R包甚至依赖于不同的版

本?现在,在不使用Docker或Vagrant等全局虚拟化技术的条件下,只需要运用packrat包,就可以保证你的R项目的依赖问题被很好的解决,

一次运行,到处运行。

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

getOption("repos") # 显示代码镜像源

packrat:: bundle() # 打包当前环境并虚拟化

packrat:: unbundle(bundle="xxx.tar.gz",where=".") # 加载已经打包过的环境

packrat::opts$local.repos("~/R") # 设置本地repos为路径

packrat::install_local("pryr") # 从本地安装

Hadley Wickham:Git与团队协作

教学视频地址

团队协作:利用Git 和 GitHub,你可以很轻松的与人协作,你不再需要用邮件附件来备份文档,或者在Dropbox上为争夺编辑权限而争吵。相反,你可以独立工作,最后只需要合并你们的成果就可以。

版本控制: Git 在我们制造重大错误时都允许我们回滚到之前的任意时间点。我们也可以回顾我们之前所做的一起历史记录,跟踪bug的形成过程。

如何对混合型数据做聚类分析

利用聚类分析,我们可以很容易地看清数据集中样本的分布情况。以往介绍聚类分析的文章中通常只介绍如何处理连续型变量,这些文字并没有过多地介绍如何处理混合型数据(如同时包含连续型变量、名义型变量和顺序型变量的数据)。本文将利用 Gower 距离、PAM(partitioning around medoids)算法和轮廓系数来介绍如何对混合型数据做聚类分析。

R语言

本文主要分为三个部分:

距离计算

聚类算法的选择

聚类个数的选择

为了介绍方便,本文直接使用 ISLR 包中的 College 数据集。该数据集包含了自 1995 年以来美国大学的 777 条数据,其中主要有以下几个变量:

连续型变量

录取率

学费

新生数量

分类型变量

公立或私立院校

是否为高水平院校,即所有新生中毕业于排名前 10% 高中的新生数量占比是否大于 50%

本文中涉及到的R包有:

In [3]:

set.seed(1680) # 设置随机种子,使得本文结果具有可重现性

library(dplyr)

library(ISLR)

library(cluster)

library(Rtsne)

library(ggplot2)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

filter, lag

The following objects are masked from ‘package:base’:

intersect, setdiff, setequal, union

构建聚类模型之前,我们需要做一些数据清洗工作:

录取率等于录取人数除以总申请人数

判断某个学校是否为高水平院校,需要根据该学校的所有新生中毕业于排名前 10% 高中的新生数量占比是否大于 50% 来决定

In [5]:

college_clean <- College %>%

mutate(name = row.names(.),

accept_rate = Accept/Apps,

isElite = cut(Top10perc,

breaks = c(0, 50, 100),

labels = c("Not Elite", "Elite"),

include.lowest = TRUE)) %>%

mutate(isElite = factor(isElite)) %>%

select(name, accept_rate, Outstate, Enroll,

Grad.Rate, Private, isElite)

glimpse(college_clean)

Observations: 777

Variables: 7

$ name(chr) "Abilene Christian University", "Adelphi University", "...

$ accept_rate (dbl) 0.7421687, 0.8801464, 0.7682073, 0.8369305, 0.7564767, ...

$ Outstate(dbl) 7440, 12280, 11250, 12960, 7560, 13500, 13290, 13868, 1...

$ Enroll (dbl) 721, 512, 336, 137, 55, 158, 103, 489, 227, 172, 472, 4...

$ Grad.Rate (dbl) 60, 56, 54, 59, 15, 55, 63, 73, 80, 52, 73, 76, 74, 68,...

$ Private (fctr) Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes,...

$ isElite (fctr) Not Elite, Not Elite, Not Elite, Elite, Not Elite, Not...

距离计算

聚类分析的第一步是定义样本之间距离的度量方法,最常用的距离度量方法是欧式距离。然而欧氏距离只适用于连续型变量,所以本文将采用另外一种距离度量方法—— Gower 距离。

Gower 距离

Gower 距离的定义非常简单。首先每个类型的变量都有特殊的距离度量方法,而且该方法会将变量标准化到[0,1]之间。接下来,利用加权线性组合的方法来计算最终的距离矩阵。不同类型变量的计算方法如下所示:

连续型变量:利用归一化的曼哈顿距离

顺序型变量:首先将变量按顺序排列,然后利用经过特殊调整的曼哈顿距离

名义型变量:首先将包含 k 个类别的变量转换成 k 个 0-1 变量,然后利用 Dice 系数做进一步的计算

优点:通俗易懂且计算方便

缺点:非常容易受无标准化的连续型变量异常值影响,所以数据转换过程必不可少;该方法需要耗费较大的内存

利用 daisy 函数,我们只需要一行代码就可以计算出 Gower 距离。需要注意的是,由于新生入学人数是右偏变量,我们需要对其做对数转换。daisy 函数内置了对数转换的功能,你可以调用帮助文档来获取更多的参数说明。

In [6]:

# Remove college name before clustering

gower_dist <- daisy(college_clean[, -1],

metric = "gower",

type = list(logratio = 3))

# Check attributes to ensure the correct methods are being used

# (I = interval, N = nominal)

# Note that despite logratio being called,

# the type remains coded as "I"

summary(gower_dist)

Out[6]:

301476 dissimilarities, summarized :

Min. 1st Qu.Median Mean 3rd Qu. Max.

0.0018601 0.1034400 0.2358700 0.2314500 0.3271400 0.7773500

Metric : mixed Types = I, I, I, I, N, N

Number of objects : 777

此外,我们可以通过观察最相似和最不相似的样本来判断该度量方法的合理性。本案例中,圣托马斯大学和约翰卡罗尔大学最相似,而俄克拉荷马科技和艺术大学和哈佛大学差异最大。

In [7]:

gower_mat <- as.matrix(gower_dist)

# Output most similar pair

college_clean[

which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]),

arr.ind = TRUE)[1, ], ]

Out[7]:

In [8]:

# Output most dissimilar pair

college_clean[

which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]),

arr.ind = TRUE)[1, ], ]

Out[8]:

聚类算法的选择

现在我们已经计算好样本间的距离矩阵,接下来需要选择一个合适的聚类算法,本文采用 PAM(partioniong around medoids)算法来构建模型:

PAM 算法的主要步骤:

随机选择 k 个数据点,并将其设为簇中心点

遍历所有样本点,并将样本点归入最近的簇中

对每个簇而言,找出与簇内其他点距离之和最小的点,并将其设为新的簇中心点

重复第2步,直到收敛

该算法和 K-means 算法非常相似。事实上,除了中心点的计算方法不同外,其他步骤都完全一致 。

优点:简单易懂且不易受异常值所影响

缺点:算法时间复杂度为 O(n2)O(n2)

聚类个数的选择

我们将利用轮廓系数来确定最佳的聚类个数,轮廓系数是一个用于衡量聚类离散度的内部指标,该指标的取值范围是[-1,1],其数值越大越好。通过比较不同聚类个数下轮廓系数的大小,我们可以看出当聚类个数为 3 时,聚类效果最好。

In [9]:

# Calculate silhouette width for many k using PAM

sil_width <- c(NA)

for(i in 2:10){

pam_fit <- pam(gower_dist,

diss = TRUE,

k = i)

sil_width[i] <- pam_fit$silinfo$avg.width

}

# Plot sihouette width (higher is better)

plot(1:10, sil_width,

xlab = "Number of clusters",

ylab = "Silhouette Width")

lines(1:10, sil_width)

聚类结果解释

描述统计量

聚类完毕后,我们可以调用 summary 函数来查看每个簇的汇总信息。从这些汇总信息中我们可以看出:簇1主要是中等学费且学生规模较小的私立非顶尖院校,簇2主要是高收费、低录取率且高毕业率的私立顶尖院校,而簇3则是低学费、低毕业率且学生规模较大的公立非顶尖院校。

In [18]:

pam_fit <- pam(gower_dist, diss = TRUE, k = 3)

pam_results <- college_clean %>%

dplyr::select(-name) %>%

mutate(cluster = pam_fit$clustering) %>%

group_by(cluster) %>%

do(the_summary = summary(.))

print(pam_results$the_summary)

[[1]]

accept_rateOutstate Enroll Grad.Rate Private

Min. :0.3283 Min. : 2340 Min. : 35.0 Min. : 15.00 No : 0

1st Qu.:0.7225 1st Qu.: 8842 1st Qu.: 194.8 1st Qu.: 56.00 Yes:500

Median :0.8004 Median :10905 Median : 308.0 Median : 67.50

Mean :0.7820 Mean :11200 Mean : 418.6 Mean : 66.97

3rd Qu.:0.8581 3rd Qu.:13240 3rd Qu.: 484.8 3rd Qu.: 78.25

Max. :1.0000 Max. :21700 Max. :4615.0 Max. :118.00

isElite cluster

Not Elite:500 Min. :1

Elite: 0 1st Qu.:1

Median :1

Mean :1

3rd Qu.:1

Max. :1

[[2]]

accept_rateOutstate Enroll Grad.Rate Private

Min. :0.1545 Min. : 5224 Min. : 137.0 Min. : 54.00 No : 4

1st Qu.:0.4135 1st Qu.:13850 1st Qu.: 391.0 1st Qu.: 77.00 Yes:65

Median :0.5329 Median :17238 Median : 601.0 Median : 89.00

Mean :0.5392 Mean :16225 Mean : 882.5 Mean : 84.78

3rd Qu.:0.6988 3rd Qu.:18590 3rd Qu.:1191.0 3rd Qu.: 94.00

Max. :0.9605 Max. :20100 Max. :4893.0 Max. :100.00

isElite cluster

Not Elite: 0 Min. :2

Elite:69 1st Qu.:2

Median :2

Mean :2

3rd Qu.:2

Max. :2

[[3]]

accept_rateOutstate Enroll Grad.Rate Private

Min. :0.3746 Min. : 2580 Min. : 153 Min. : 10.00 No :208

1st Qu.:0.6423 1st Qu.: 5295 1st Qu.: 694 1st Qu.: 46.00 Yes: 0

Median :0.7458 Median : 6598 Median :1302 Median : 54.50

Mean :0.7315 Mean : 6698 Mean :1615 Mean : 55.42

3rd Qu.:0.8368 3rd Qu.: 7748 3rd Qu.:2184 3rd Qu.: 65.00

Max. :1.0000 Max. :15516 Max. :6392 Max. :100.00

isElite cluster

Not Elite:199 Min. :3

Elite: 9 1st Qu.:3

Median :3

Mean :3

3rd Qu.:3

Max. :3

PAM 算法的另一个优点是各个簇的中心点是实际的样本点。从聚类结果中我们可以看出,圣弗朗西斯大学是簇1 的中心点,巴朗德学院是簇2 的中心点,而密歇根州州立大学河谷大学是簇3 的中心点。

In [19]:

college_clean[pam_fit$medoids, ]

Out[19]:

可视化方法

t-SNE 是一种降维方法,它可以在保留聚类结构的前提下,将多维信息压缩到二维或三维空间中。借助t-SNE我们可以将 PAM 算法的聚类结果绘制出来,有趣的是私立顶尖院校和公立非顶尖院校这两个簇中间存在一个小聚类簇。

In [22]:

tsne_obj <- Rtsne(gower_dist, is_distance = TRUE)

tsne_data <- tsne_obj$Y %>%

data.frame() %>%

setNames(c("X", "Y")) %>%

mutate(cluster = factor(pam_fit$clustering),

name = college_clean$name)

ggplot(aes(x = X, y = Y), data = tsne_data) +

geom_point(aes(color = cluster))

进一步探究可以发现,这一小簇主要包含一些竞争力较强的公立院校,比如弗吉尼亚大学和加州大学伯克利分校。虽然无法通过轮廓系数指标来证明多分一类是合理的,但是这 13 所院校的确显著不同于其他三个簇的院校。

In [25]:

tsne_data %>%

filter(X >15 &X <25,

Y >-15 &Y <-10) %>%

left_join(college_clean, by = "name") %>%

collect %>%

.[["name"]]

Out[25]:

‘Kansas State University’

‘North Carolina State University at Raleigh’

‘Pennsylvania State Univ. Main Campus’

‘SUNY at Buffalo’

‘Texas A&M Univ. at College Station’

‘University of Georgia’

‘University of Kansas’

‘University of Maryland at College Park’

‘University of Minnesota Twin Cities’

‘University of Missouri at Columbia’

‘University of Tennessee at Knoxville’

‘University of Texas at Austin’

collect的读音是:英 [kə'lekt];美 [kə'lekt]

1、释义

v. 收集;聚集;募捐;运走;使(自己)镇定

2、用法

1)用作不及物动词S+~(+A)

Clouds are collecting.

云层越来越厚了。

2)用作及物动词S+~+ n./pron.

John collects foreign coins.

约翰收集外国硬币。

3、短语

1)collect for (v.+prep.)

为…募集钱 raise money for

2)collect from (v.+prep.)

从…领取接走 get sthmeet sb

扩展资料

同近义词—gather

1、读音

英 ['ɡæðə(r)];美 ['ɡæðər]

2、释义

v. 聚集;集合;收集;推测

n. 聚集;褶子

3、用法

1)用作不及物动词S+~(+A)

The crowd is gathering.

人群正在聚集。

2)用作及物动词S+~+ n./pron.

The teacher gathered all the pupils in the auditorium.

教师把全体同学集合在礼堂内。