统计学基础与R-8

统计学基础与R-8

写在前面

入门生物信息,所有人都绕不开统计基础知识和相关实现方式。本章我们将简要介绍统计学相关基础知识以及如何使用R语言进行简单地计算和分析

第八节 常用高阶分析方法

回归分析

所谓回归分析(regression analysis),在统计学中有着非常重要的作用,从大的层面来讲指用自变量(解释变量或者预测变量)来预测因变量(相应变量或者结果变量)的方法。比如在几个自变量中找到和因变量更相关的一个,利用自变量和因变量的关系生成等式对因变量进行预测。从小的层面来说,回归的模型非常之多,也非常复杂,例如最小二乘回归,logistic回归和泊松回归等等。

最小二乘回归是最常用到的回归模型,包括简单线性回归(一元一阶),多项式回归(一元多阶)和多元线性回归(多元)。所谓最小二乘法是用一条直线$y=ax+b$(回归线)拟合一组两变量数据的方法,使得误差平方和(点到直线的距离平方和)最小。对数据进行最小二乘回归分析时,要求数据符合正态分布,独立和同方差性。

简单线性回归可以使用F检验,拟合优度($R^2$)为回归平方和/总平方和,代表因变量可以被自变量解释的比例。

相关系数(r)描述个数据点与直线的偏离程度,度量回归线和数据的拟合程度。

在R中,lm()是拟合回归模型最简单的函数。针对两个变量,我们一般会先通过简单线性回归进行拟合,通过结果图,根据具体的需要再增加二次项提高预测精度。类似之前提到的ANOVA分析,可以使用summary()函数获取回归模型的详细参数和统计量。

有的时候,我们希望能够让回归模型尽量的简单,既减少自变量的数量还不影响对因变量预测的准确对。这是就可以使用anova()函数,查看是否可以删掉一些回归系数不显著的变量。

如果因变量不符合正态分布或者非连续变量,我们就需要考虑使用广义线性模型来进行拟合。当因变量为类别性变量(二项分布)时可以使用logistic回归,当因变量为计数型(泊松分布)可以使用泊松回归。在R中,这两种方法都可以使用glm()来进行计算。

聚类分析

聚类分析是统计中另一个非常重要的方法,可以帮助我们在多维度的数据中把相似的数据归为子集,每个子集中的数据都具有某种程度的相似性。在具体的生物研究中,聚类可以帮助我们通过表达类似的基因找到功能相关的基因,或者帮助推测未知基因的功能。通常聚类分析也被称作非监督机器学习。

进行聚类分析首先需要计算不同观测值之间的距离,进而生成聚类使用的距离矩阵。
计算距离的方法有很多,选择不同的距离计算方法也会对最终的聚类结果产生很大的影响。常用的距离计算方法有欧氏距离(Euclidean distance)、曼哈顿距离(Manhattan distance)和基于相关性距离(correlation-based distances)的Pearson correlation distances、Spearman’s rank correlation、Kendall correlation distance 等等。

另外,在构建距离矩阵之前,往往会对原始的观测数据进行标准化,如计算z score。

总的来说,聚类方法从整体上主要使用的有Partitioning method 和Hierarchical Clustering 两类,其中Partitioning 包括K-means clustering,K-medoids clustering(PAM)等具体方法。

k-means

在k-means算法中,首先我们需要确定数据最终分为几类(k),然后会根据分类数量随机选取k个点最为每个类的初始质心(这也是同一组数据每次聚类的结果都不尽相同的原因),随后其他的点都会通过欧式距离找到分到和自己最近的初始中心。通过一次这样的过程之后,再根据每个集合中的点计算均值得到新的质心,重复之前的过程进行迭代。每次迭代,每个集合中的质心都会重新产生,所有的非质心点再重新分配给新的质心形成集合。如果在一次迭代中,只有非常少的点会发生集合的转移则迭代停止。

需要注意的是,k-means聚类的方法对异常值非常敏感,与之相比PAM要好一些。

在R中,kmeans聚类可以使用stats包中的kmeans()函数,如果想使用K-medoids clustering 可以借助cluster包中的pam()函数。另外,在进行cluster和pca相关的分析中,factoextra 也是一个不错的选择,包括了各种常用的功能。

一个比较完整的k-means聚类分析过程主要包括数据标准化,评估合适cluster数数目,进行计算以及可视化展示等步骤。

Hierarchical Clustering

层次聚类和k-means相比不需要预先设定聚类的数目,最终的聚类结果会以颠倒树状结构显示,不同类别观测值在树的最底层(树叶),越向上节点越少。层次聚类可以细分为Agglomerative Clustering 和 Divisive Hierarchical,前者的思路是从“树叶”向“树干”聚集,后者的思路是从“树干”向“树叶”分裂。一般而言,Agglomerative Clustering 适合在clusters比较少时使用;而Divisive Hierarchical 适合在有大量clusters 时使用,可以选择到那一步停下不再细分。

以Agglomerative Clustering 为例,大致流程是首先将每个对象归为一类,每类仅包含一个对象,计算类与类之间的距离。找到最近的两个类然后合并, 接着计算新类与所有旧类之间的距离。重复之前的过程,直到最后合并成一个类为止。

根据类间距离计算方法的不同,又可以分为五种: single-linkage(类和类两组对象间的最小距离)、 complete-linkage(类和类两组对象间的最大距离)、 average-linkage(两组对象间的平均距离)、centroid linkage 和Ward′s method(在每一步使组内离差平方和增量最小)。

一个比较完整的层次聚类分析过程主要包括数据标准化,计算距离,构建聚类树,确定分组以及可视化展示等步骤。

在R中,计算距离时可以使用dist()函数,构建聚类树可以使用hclust()函数,将树分组可以使用cutree()。当然也可以使用cluster包同时完成上面几个步骤。

以R中数据集USArrests为例,进行聚类分析。

# 标准化
usa_norm <- dist(scale(USArrests), method = "euclidean")

# 构建树
hc <- hclust(usa_norm, method = "complete")

# install.packages(c("factoextra", "dendextend"))
# 可视化展示
library(factoextra)
#基础
plot(hc, hang = -1, cex = 0.7)

#美化
fviz_dend(hc, k = 4, # 分为4类
cex = 0.4, # label大小,防止字不显示完全
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
color_labels_by_k = TRUE, # color labels by groups
rect = TRUE, # Add rectangle around groups
rect_fill = TRUE,
rect_border = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
ggtheme = theme_void() # ggplot2主题
)

# 环形
fviz_dend(hc, cex = 0.4, k = 4,
k_colors = "jco", type = "circular")

主成分分析

当数据集中变量过多时,会为我们的分析带来很大的不便,在这些变量中很可能存在冗余成分。为了减少冗余变量,降低数据维度,只留下少数能够依旧很好预测因变量的不相关变量,我们可以使用主成分分析(PCA)方法。

在R中,内置函数procomp()可以用来进行PCA分析,以R中数据集iris为例

# 只支持数值型变量,所以提取原数据集前4列
ir_num <- iris[, 1:4]

# 进行pca分析
ir_pca <- prcomp(ir_num,
scale. = TRUE)
# 查看主成分信息
summary(ir_pca)

# Importance of components%s:
# PC1 PC2 PC3 PC4
# Standard deviation 1.7084 0.9560 0.38309 0.14393
# Proportion of Variance 0.7296 0.2285 0.03669 0.00518
# Cumulative Proportion 0.7296 0.9581 0.99482 1.00000

通过上述结果可以发现,主成分1和2可以解释0.95的变化。


本文作者:思考问题的熊

版权声明:本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×