R语言与统计分析 汤银才 主编 高等教育出版社 二○○八年五月 内容介绍 本书以数据的常用统计分析方法为基础,在简明扼要地阐述统计学基本概 念、基本思想与基本方法的基础上,讲述与之相对应的R函数的实现,并通过 具体的例子说明统计问题求解的过程. 本书注重思想性、实用性和可操作性. 在内容的安排上不仅包含了基础统 计分析中的探索性数据分析、参数的估计与假设检验,还包括的非参数统计分 析的常用方法、多元统计分析方法及贝叶斯统计分析方法. 每一部分都通过具 体例子重点讲述解决问题的思想、方法和在R中的实现过程. 通过本书读者不 仅可以快速学会R的基本原理与核心内容,而且根据提供的例子与相应的R程 序学会解决问题的统计计算方法与基本的编程技术,为解决更为复杂的统计问 题奠定扎实的基础. 本书可作为各专业本科生、研究生数理统计或应用统计课程的基础教材 或实验教材,也可作为从事数据统计分析研究人员、工程技术人员的工具书或 参考读物. I 前言 统计学的任务是研究有关收集、整理、分析数据,从而对所考察的问题作 出一定的结论的方法与理论. 作为一门科学,统计学有其坚实的理论基础,研 究统计学方法的理论基础问题的那一部分,构成了所谓数理统计学的内容。其 次,统计学就其本质来讲,是一门实用性很强的科学,它在人类活动的各个领 域有着广泛的应用。因此数理统计的理论与方法应该与实际相结合,解决社 会、经济、工农业生产、生物制药、航空航天、质量管理、环境资源等领域中的 各种问题。最后,统计学又是一门技术性很强的科学,由于所研究问题越来越 复杂、变量之间关联性越越强、数据的规模越来越大,使得原有的计算方法无 法实现. 现在,随着计算机的不断发展与普及,特别是近20年来统计计算的突 破性进展及统计软件的不断完善和成熟,使得解决这些问题不仅成为可能,而 且越来越容易、快速. 目前许多大学几乎所有的理工科,甚至文科的许多专业都开设了《数理 统计》或《应用统计》之类的课程,有的还编写了相应的教材,这是令人可 喜的. 这些课程与教材的共同特点是以较大的篇幅介绍数理统计的理论、方 法与实际背景,并配有一定数量的例子和习题. 部分学校还为有统计专业和 应用数学专业的学生开设SAS或Matlab统计软件,为经济统计专业的学生开 设SPSS或EViews统计软件, 但这还远远不够. 作者长期从事概率论与数理统计、统计计算及统计软件的教学工作,我 们发现目前的统计教学普遍存在的问题有:一、关于教学内容:在有限的课 时下,对于非统计专业的学生采用统计专业学生的教学方式,过多强调理论 的重要性,从而忽视了统计思想和数据处理能力的培养;有的因为仅用一学 期(54课时或更少)讲授概率论与数理统计,面面俱到的概率论教学使学生无法 学到诸如回归分析与方差分析的重要内容. 二、关于软件教学:由于没有软件 支持,使用传统的教学方法和教材,无论是老师讲解例题,还是学生完成习题 都要花费大量的时间进行手工计算,且错误率高. 使用软件可使数据分析更具 II 第零章 内容介绍 直观性、灵活性和可重复性,可起到举一反三的作用,提高学生的学习兴趣和 动手(操作或编程)能力. 三、关于统计教学与软件教学是否分开: 统计教学与 软件教学分开教学会产生一定的重复性,从而浪费有限教学课时,降低学习的 效率. 分开的教学会使大部分非统计专业的学生不能得到统计软件操作和数 据分析能力的培养. 有了统计软件, 可大大增加教学的信息量、节省时间用于 培养学生统计软件的上机操作能力;有了统计软件,使得大规模或海量数据 分析和精确计算成为可能,也使教材中的许多附表(如常用分布的分位数表)失 去其必要性. 四、关于R软件: 本书之所以采用R软件, 主要原因是其强大的数 据的图形展示和统计分析功能、免费使用和更新及大量可随时加载的有针对 性的软件包. 而SAS、Matlab、SPSS、EViews却都是收费软件,与R功能几乎相 同的S-PLUS也是收费的. R高效的代码、简洁的输出和强大的帮助系统使统 计软件辅助的统计教学成为可能. 基于R开发的菜单式驱动的图形界面工具R Commander和PMG(见附录B)使得基础统计分析像SPSS一样容易实现. 本书介绍了R的基本功能、常用的数据处理与分析方法及它们在R中的实 现. 全书共分十一章及三个附录: 第一章, R 介绍. 介绍了R软件的功能与安 装. 第二章, R的基本原理与核心. 简明扼要地介绍了R软件的使用方法, 主 要侧重于不同类型的数据的操作与函数的使用. 第三章, 概率与分布. 介绍了 常用的离散与连续型分布及R中有关的四类函数: 分布函数、概率函数、分位 数函数和随机数生存函数. 第四章, 探索性数据分析. 介绍了单组和多组数据 中特征量的提取方法及数据的图形展示方法. 第五章, 参数估计. 主要介绍了 单总体与两总体正态及二项分布参数的点估计与区间估计. 第六章, 参数的假 设检验. 主要介绍了单总体与两总体正态及二项分布参数的假设检验. 第七 章, 非参数的假设检验. 主要介绍了常用的几个非参数检验方法. 第八章, 方 差分析. 主要介绍了多组数据比较的单因子与双因子方差分析及协方差分析 方法. 第九章, 回归分析与相关分析. 介绍了随机变量之间关系的度量与回归 分析及诊断方法. 第十章, 多元统计分析介绍. 介绍了多元分析中常用的主 成分分析、因子分析、判别分析、聚类分析、典型相关分析及对应分析方法. 第十一章, 贝叶斯统计分析. 介绍了贝叶斯分析中单参数与多参数模型、分 层模型及回归模型的分析方法. 最后是附录, 附录B介绍了基于R开发的基础 统计分析的菜单式工具R Commander和PMG, 附录C介绍了R的3个编程环境: R WinEdt、Tinn-R及SciViews-R. 全书在所有程序都在R的2.6.0版本上调试通 过, 原则上在其它版本上也可以运行. 本书的特点是: 注重统计思想、实用性和可操作性. 我们在内容的设计上 尽可能简化统计理论与方法的推导过程,对于主要的统计知识都通过一个具体 例子展开、讲清要解决问题的思想、方法和具体的实现过程. 所有方法的实现 都有相应的R函数的调用格式,而例子讲解的R程序都全部嵌入在正文中,便 于读者举一反三,解答习题或进行其它类似的数据分析. 本书可作为各专业本科生、研究生数理统计或应用统计课程的基础教材 或实验教材,也可作为从事数据统计分析研究人员、工程技术人员的工具书或 参考读物. 本书整个教材的教学安排可考虑以1:3的比例安排上机时间. 具体教 学内容可根据需要进行取舍,具体可参考下表的安排课时: 教学内容 选取章节 课时安排 R语言入门 第一章, 第二章, 附录B 12 探索性数据分析 第三章, 第四章 12 数据统计分析 第五章, 第六章, 第八章, 第九章 24 第七章 8 选讲内容 第十章 8 第十一章 8 本书编写过程中,参考了大量的资料文献. 得到了华东师范大学金融与统 计学院全体老师, 特别是终生教授茆诗松老师的支持. 我的学生巍晓玲参与了 本书第四和第五章初稿的编写工作,徐安察参与了本书第六和第七章初稿的编 写工作,于巧丽参与了本书第八和第九章初稿的编写工作,岳昳婕参与了本书 第十一章初稿的编写工作, 上海师范大学的朱杰老师参与了本书第十章的编写 工作和全书的校对工作. 在全书的编写过程中,得到了高等教育出版社领导和 研究生教育与学术著作分社王丽萍女士的关心和帮助, 在此一并提示感谢. 由于编者水平有限,书中一定存在不足甚至错误之处,欢迎读者不吝指正. 作者 2008 年 5 月 IV 目录 目录 内容介绍 II 前言 I 第一章 R介绍 1 §1.1 S语言与R .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 §1.2 R的特点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 §1.3 R的资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 §1.4 R的安装与运行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.4.1 R软件的安装、启动与关闭 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.4.2 R程序包的安装与使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 第一章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 第二章 R的基本原理与核心 8 §2.1 R的基本原理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 §2.2 R的在线帮助 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 §2.3 一个简短的R会话 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 §2.4 R的数据结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.4.1 R的对象与属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.4.2 浏览对象的信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 目录 V 2.4.3 向量的建立 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.4.4 数组与矩阵的建立. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.4.5 数据框(data frame)的建立 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.4.6 列表(list)的建立 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 2.4.7 时间序列(ts)的建立 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 §2.5 数据的存储与读取 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.5.1 数据的存储 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.5.2 数据的读取 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 §2.6 R 的图形功能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 2.6.1 绘图函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 2.6.2 低级绘图命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 2.6.3 绘图参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 2.6.4 一个实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 §2.7 R 编程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 2.7.1 循环和向量化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 2.7.2 用R写程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 2.7.3 编写你自己的函数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 2.7.4 养成良好的编程习惯 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 第二章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 第三章 概率与分布 81 §3.1 随机抽样 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 §3.2 排列组合与概率的计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 §3.3 概率分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.3.1 离散分布的分布律. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.3.2 连续分布的密度函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 VI 目录 §3.4 R中内嵌的分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 §3.5 应用: 中心极限定理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 3.5.1 中心极限定理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 3.5.2 渐近正态性的图形检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 3.5.3 举例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 第三章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 第四章 探索性数据分析 101 §4.1 常用分布的概率函数图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 §4.2 直方图与密度函数的估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 4.2.1 直方图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 4.2.2 核密度估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 §4.3 单组数据的描述性统计分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 4.3.1 单组数据的图形描述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 4.3.2 单组数据的描述性统计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 §4.4 多组数据的描述性统计分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 4.4.1 两组数据的图形概括 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 4.4.2 多组数据的图形描述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 4.4.3 多组数据的描述性统计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 4.4.4 分组数据的图形概括 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 §4.5 分类数据的描述性统计分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 4.5.1 列联表的制作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 4.5.2 列联表的图形描述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 第四章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 第五章 参数估计 150 §5.1 矩法估计和极大似然估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 目录 VII 5.1.1 矩法估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 5.1.2 极大似然估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 §5.2 单正态总体参数的区间估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 5.2.1 均值µ的区间估计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 5.2.2 方差σ2的区间估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 §5.3 两正态总体参数的区间估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 5.3.1 均值差µ1 µ2的置信区间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 5.3.2 两方差比σ21{σ22的置信区间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 §5.4 单总体比率p的区间估计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 §5.5 两总体比率差p1 p2的区间估计. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 §5.6 样本容量的确定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 5.6.1 估计正态总体均值时样本容量的确定 . . . . . . . . . . . . . . . . . . . . . . . . 173 5.6.2 估计比例p时样本容量的确定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 第四章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 第六章 参数的假设检验 179 §6.1 假设检验与检验的p值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 6.1.1 假设检验的概念与步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 6.1.2 检验的p值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 §6.2 单正态总体参数的检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 6.2.1 均值µ的假设检验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 6.2.2 方差σ2的检验: χ2检验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 §6.3 两正态总体参数的检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 6.3.1 均值的比较: t检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 6.3.2 方差的比较: F检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 §6.4 成对数据的t检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 VIII 目录 §6.5 单样本比率的检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 6.5.1 比率p的精确检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 6.5.2 比率p的近似检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 §6.6 两样本比率的检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 第六章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 第七章 非参数的假设检验 200 §7.1 单总体位置参数的检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 7.1.1 中位数的符号检验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 7.1.2 Wilcoxon符号秩检验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 §7.2 分布的一致性检验:χ2检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 §7.3 两总体的比较与检验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 7.3.1 χ2独立性检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 7.3.2 Fisher精确检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 7.3.3 Wilcoxon秩和检验法和Mann-Whitney U检验 . . . . . . . . . . . . . 213 7.3.4 Mood检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 §7.4 多总体的比较与检验. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 7.4.1 位置参数的Kruskal-Wallis秩和检验 . . . . . . . . . . . . . . . . . . . . . . . 218 7.4.2 尺度参数的Ansari-Bradley检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 7.4.3 尺度参数的Fligner-Killeen检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 第七章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 第八章 方差分析 226 §8.1 单因子方差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 8.1.1 数学模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 8.1.2 均值的多重比较 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 8.1.3 同时置信区间: Tukey法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 目录 IX 8.1.4 方差齐性检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 §8.2 双因子方差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 8.2.1 无交互作用的方差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 8.2.2 有交互作用的方差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 §8.3 协方差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 第八章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 第九章 回归分析与相关分析 260 §9.1 相关性及其度量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 9.1.1 相关性概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 9.1.2 相关分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 §9.2 一元线性回归分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 9.2.1 数学模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 9.2.2 估计与检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 9.2.3 预测与控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 9.2.4 计算例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 §9.3 多元线性回归分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 9.3.1 数学模型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 9.3.2 估计与检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 9.3.3 预测与控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 9.3.4 计算例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 §9.4 回归诊断 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 9.4.1 残差分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 9.4.2 影响分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 9.4.3 共线性诊断 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 §9.5 Logistic回归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 X 目录 第九章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 第十章 多元统计分析介绍 315 §10.1 主成分分析与因子分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315 10.1.1 主成分的简要定义与计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 10.1.2 主成分R通用程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 10.1.3 因子分析的简要定义与计算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 10.1.4 因子分析R通用程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322 §10.2 判别分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 10.2.1 距离判别 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 10.2.2 Fisher判别法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 10.2.3 R通用程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 §10.3 聚类分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 10.3.1 基本思想 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 10.3.2 R通用程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 §10.4 典型相关分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 10.4.1 基本思想 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 10.4.2 R通用程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 §10.5 对应分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 10.5.1 基本思想 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 10.5.2 R通用程序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 第十章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 第十一章 贝叶斯统计分析 364 §11.1 贝叶斯统计分析与经典统计分析的比较 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 11.1.1 经典统计分析中存在的问题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 11.1.2 对贝叶斯统计分析的质疑及褒奖 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 目录 XI §11.2 贝叶斯统计分析与先验分布的选取 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 11.2.1 贝叶斯公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 11.2.2 先验分布的选取 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 11.2.3 贝叶斯分析体现了科学探索过程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 §11.3 单参数贝叶斯统计分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 11.3.1 两项分布下的贝叶斯推断 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 11.3.2 正态分布下的贝叶斯统计推断 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 §11.4 多参数贝叶斯统计分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 11.4.1 方法概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 11.4.2 正态分布参数中的贝叶斯分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 11.4.3 随机模拟方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 11.4.4 一个实例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 §11.5 分层贝叶斯统计分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 11.5.1 分层模型的建立及其贝叶斯推断 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 11.5.2 N-N模型与应用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 §11.6 贝叶斯线性回归分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 11.6.1 模型的表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 11.6.2 后验分布 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 11.6.3 回归拟合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 11.6.4 后验预测 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 第十一章习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 附录 A 秩与结的介绍 418 附录 B R的图形界面 420 §B.1 R Commander ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 B.1.1 功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 XII 目录 B.1.2 (网络)安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 B.1.3 运行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 B.1.4 结构与使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 §B.2 PMG ..... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 B.2.1 功能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 B.2.2 安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 B.2.3 结构与使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 附录 C R的编程环境 426 §C.1 R WinEdt ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 C.1.1 (网络)安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 C.1.2 运行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 C.1.3 R WinEdt的特点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 C.1.4 R WinEdt的菜单与热键. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 §C.2 Tinn-R .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 §C.3 SciViews R .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 参考文献 431 第一章 R介绍 本章概要 ♦ R的功能与特点 ♦ R的安装与运行 ♦ R程序包的安装与运行 §1.1 S语言与R R是一个有着强大统计分析及作图功能的软件系统,在GNU协议General Public Licence下免费发行, 最先是由Ross Ihaka和Robert Gentleman共同 创立, 现在由R开发核心小组(R Development Core Team)维护, 他们完全自 愿、工作努力负责,并将全球优秀的统计应用软件打包提供给我们共享. R可以看作是贝尔实验室(Bell Laboratories)的Rick Becker, John Chambers和Allan Wilks开发的S语言的一种实现或形式. 因此, R是一种 软件也可以说是一种语言. S语言现在主要内含在由Insightful公司经营的S- PLUS软件中. 我们可以将R和S-PLUS 视为S语言的两种形式, S/S-PLUS方面 的文档都可以直接用于R, 不过R和S在设计理念上存在着许多不同, 关于 这方面的详细内容大家可以参考Ihaka & Gentleman (1996) 或随R同时发布 的R-FAQ[16]. 本书今后主要使用R, 有时也使用R软件、R语言或R系统来称呼 这种形式的S语言. 2 第一章 R介绍 §1.2 R的特点 现在越来越多的人开始接触、学习和使用R, 因为它有其显著的优点, 主 要包括: 1) 免费: 尽管S-PLUS是非常优秀的统计分析软件,但你需要支付一笔费用, 而R是一个免费的统计分析软件(环境); 2) 浮点运算功能强大: R可以作为一台高级科学计算器, 因为R同Matlab一 样不需要编译就可执行代码; 3) 不依赖于操作系统: R可以在运行于UNIX, Linux, Windows 和Macintosh 的操作系统上, 它们的安装文件以及安装说明都可以在CRAN (Comprehensive R Archive Network) 社区上下载; 4) 帮助功能完善: R嵌入了一个非常实用的帮助系统—随软件所附 的pdf或html帮助文件可以随时通过主菜单打开浏览或打印. 通过help命 令可随时了解R所提供的各类函数的使用方法和例子; 5) 作图功能强大: 其内嵌的作图函数能将产生的图片展示在一个独立的窗 口中,并能将之保存为各种形式的文件(例如jpg, png, bmp, ps, pdf, emf, pictex, xfig); 6) 统计分析能力尤为突出: R内嵌了许多实用的统计分析函数, 统计分析的 结果也能被直接显示出来, 一些中间结果(如p-值、回归系数、残差等) 既 可保存到专门的文件中, 也可以直接用于进一步的分析. R的部分统计功能整合在R语言的底层,但是大多数功能则以包的形式 提供. 大约有25个包和R同时发布(被称为“标准”和“推荐”包),更多的 包可以通过网上或其CRAN 社区(http://CRAN.R-project.org) 得到, 它们 都配有完整的pdf帮助文件, 且其版本会随R新版本的发行得到更新, 通 过在线(或下载后)安装并加裁后就可融入原来的R中, 实现有针对性的分 析; 7) 可移植性强: R程序容易地移植到S-PLUS程序中; 反之S-PLUS的许多过程直接或 稍作修改可用于R; R与Matlab有许多相似的地方, 如都可作为高级计算器, 都可不经 过编译直接运行源代码, 但是R侧重于统计分析, 而Matlab侧重于 工程, 例如信号处理. 现在通过R.Matlab程序包可实现两者之间许 多功能的共享, 具体见程序的说明. 1.3 R的资源 3 许多常用的统计分析软件(如SPSS, SAS, Stata及EExcel)的数据文 件都可读入R, 这样其它软件的数据或分析的中间结果可用于R, 并 作出进一步的分析. 8) 较强大的拓展与开发能力: R是开发新的交互式数据分析方法一个非常 好的工具. 例如附录A介绍的R Commander就是一个非常成功的例子. 我 们可以编制自己的函数来扩展现有的R语言, 或制作相对独立的统计分 析包. 9) 灵活而不死板: 一般的软件往往会直接展示分析的结果,而R则将这些结 果都存放在一个对象(object)里,所以常常在分析执行结束后并不显示 任何结果. 使用者(特别是初学者或非专业人员)可能会对此感到困惑,其 实这样的特点是非常有用的,因为我们可以有选择地显示我们感兴趣的 结果. 而有的软件(如SAS和SPSS)会同时显示几个窗口,内容太多会使使 用者无从选择和解释. §1.3 R的资源 R的核心开发与维护小组通过R的主页,即R工程(R Project)网 站(http://www.r-project.org)及时发布有关信息, 包括R的简介、R的更新及 宏包信息、R常用手册、已经出版的关于R的图书、R通讯和会议信息等. 你还 可通过该主页预订邮件,通过电子邮件发出求助或提供帮助. R的CRAN社区是我们获得软件(及源代码)和资源的主要场所, 通过它或其 镜像站点我们可以下载最新版本及大量的统计程序包(packages). 本书将使用Windows(95及以后)操作系统上的R,其它操作系统上R的使 用方法请参考R相关说明. 除R自带的运行平台R-GUI(R Graphic User’s In- terface)外, 本书附录A还提供了Windows下几个R的运行平台, R-Commander, R-WinEdt, R-Sciview和R-Tinn. §1.4 R的安装与运行 1.4.1 R软件的安装、启动与关闭 R的安装: 从CRAN社区下载最新的封装好的R安装程序到本地计算机,运 行可执行的安装文件, 通常缺省的安装目录为C:\Program Files\R\R-x.x.x, 4 第一章 R介绍 其中x.x.x为版本号. 安装时可以改变目录,从2.2.0以后还可以选择中文作为基 本语言,这样RGui窗口的菜单都是中文的. R的启动: 安装完成后点击桌面上R x.x.x快击图标就可启动R的交互式用 户窗口(R-GUI). R是按照问答的方式运行的, 也即你在命令提示符“>”后键 入命令并回车, R就完成一些操作. 例如输入命令 > plot(rnorm(1000)) 就可得到图1.1, 此命令的具体含义我们将在后面第二章叙述. 图 1.1 R的启动 R的退出: 在命令行键入q( )或点击R-GUI右上角的叉叉. 退出时可选择 保存工作空间, 缺省文件名为R安装目录的bin子目录下的R.RData. 以后可以 通过命令load( )或通过菜单“文件”下的“载入工作空间”加载,进而继续你 前一次的工作. 1.4.2 R程序包的安装与使用 R程序包的安装有三种方式: 1) 菜单方式: 在已经联网的条件下, 按步骤“程序包ñ安装程序包...ñ选 择CRAN镜像服务器ñ选定程序包”进行实时安装; 1.4 R的安装与运行 5 2) 命令方式: 在已经联网的条件下, 在命令提示符后键入 > install.packages("PKname") 完成程序包PKname的安装. 3) 本地安装: 在无上网条件下,先从CRAN社区下载需要的程序包及与之关 联的程序包, 再按第一种方式通过“程序包”菜单中的“用本机的zip文件 安装程序包”选定本机上的程序包(zip文件)进行安装. 除R的标准程序包(如base包)外,新安装的程序包在使用前必须先载入, 有两种载入方式: 1) 菜单方式: 按步骤“程序包ñ载入程序包...”, 再从已有的程序包中选定 需要的一个加载; 2) 命令方式: 在命令提示符后键入 > library(“PKname”) 来加载程序包PKname. 若有必要,我们还可通过步骤“程序包ñ更新程序包...”对本机的程序包 进行实时更新. 注意: R命令对大小写敏感, 这在使用命令方式安装和载入程序包时应特别注 意. 6 第一章 R介绍 第一章习题 1.1 R与你学过的统计软件, 如SPSS, SAS, Matlab有何区别, 其主要的特点 有哪些? 1.2 到CRAN社区(http://cran.r-project.org/)下载并安装R的最新(中 文)版本, 并尝试R的启动与退化. 1.3 R可以作为一台很方便的计算器. 任取二个非零实数, 试用R完成它们 的加、减、乘、除、乘方、开方、指数、对数等运算. 1.4 John Fox基于R开发了一套进行基础统计分析的菜单驱动的分析系统, 称为R Commander. 附录A介绍了一种菜单式的安装方法. 另一种是采用命令 方式进行安装与加载, 其步骤为: 1) 用命令 > install.packages("Rcmdr") 来安装程序包Rcmdr(需要等待几分种); 2) 再用命令 > load("Rcmdr") 加载程序包Rcmdr. R Commander的结构与使用方法参见附录A的说明. 1.5 animation是由谢益辉建立的概率统计动态演示程序包, 请用命令或菜 单的方法安装并加载animation, 并尝试下面的二个例子: 蒲丰投针试验: > buffon.needle(nmax = 500, interval = 0) 中心极限定理: > f = function(n) rchisq(n, 5) > clt.ani(FUN = f) 具体使用方法参见程序包中的pdf说明文件. 1.4 R的安装与运行 7 1.6 登 录R的 社 区 主 页http://cran.r-project.org/, 并 进 入 左 侧Software下的Packages, 浏览并感受R所提供的资源(程序包). 选择其中 感兴趣的进行安装与试用, 例如概率统计教学演示程序包TeachingDemos和其 在R Commander下的插件RcmdrPlugin.TeachingDemos. 第二章 R的基本原理与核心 本章概要 ♦ R的基本原理 ♦ R的求助方法 ♦ R的主要数据结构 ♦ R的图形功能 ♦ R的编程方法 §2.1 R的基本原理 如第一章所述, 如果R已经安装在你的计算机中, 它就能立即运行一些可 执行的命令了. R默认的命令提示符是‘¡’,它表示正在等待输入命令. 如果 一个语句在一行中输不完, 按回车键, 系统会自动产生一个续行符“+”, 语句 或命令输完后系统又会回到命令提示符. 在同一行中输入多个命令语句, 则需 要使用分号来隔开. 在Windows系统中, 能直接运行下拉菜单中的一些操作命 令(如在线帮助,打开文件等,见图1.1). 在学习一些R的命令之前,让我们先了 解R的基本工作原理. 首先, 同Matlab一样, R是一种编程语言, 但我们没有必要对此感到害怕, 因为R是一种解释性语言,而不是编译语言, 也就意味着输入的命令能够直接 被执行, 而不需要像其它语言(如C和FORTAN)需要编译和连接等操作. 其次, R的语法非常简单和直观. 例如,线性回归的命令lm(yx)表示 以x为自变量,y为响应变量来拟合一个线性模型. 合法的R函数总是带有圆括 号的形式,即使括号内没有内容(如ls( )). 如果直接输入函数名而不输入圆 2.1 R的基本原理 9 括号, R则会自动显示该函数的一些具体内容. 因此在R中所有的函数后都带 有圆括号以区别于对象(object). 当R运行时,所有变量、数据、函数及结果都 以对象的形式存入计算机的活动内存中,并冠有相应的名字代号. 我们可以通 过一些运算(如算术、逻辑、比较等)和一些函数(其本身也是对象)来对这些对 象进行操作. 运行一个R函数可能不需要设定任何参量,原因是所有的参量都可以被默 认为缺省值,当然也有可能该函数本身就不含任何参量. 再次, 在R中进行的所有操作都是针对存储在活动内存中的对象的. 数据、 结果或图表的输入与输出都是通过对计算机硬盘中的文件读写而实现. 用户 通过输入一些命令调用函数,分析得出的结果可以被直接显示在屏幕上,也可 以存入某个对象或被写入硬盘(如图片对象). 因为产生的结果本身就是一种对 象,所以它们也能被视为数据并能像一般数据那样被处理分析. 数据文件即可 从本地磁盘读取也可通过网络传输从远程服务器端获得. 最后, 所有能使用的R函数都被包含在一个库(library) 中, 该库存 放在R安装文件夹的library目录下. 这个目录下含有具有各种功能的 包(packages),各个包也是按照目录的方式组织起来的. 其中名为base的 包是R的核心,因为它内嵌了R语言中所有像数据读写与操作这些最基本的函 数. 在上述目录中的每个包内,都有一个子目录R,这个目录里又都含有一个 与此包同名的文件, 该文件正是存放所有函数的地方. R语言中最简单的命令莫过于通过输入一个对象的名字来显示其内容了. 例如,一个名为n的对象,其内容是数值10: > n [1] 10 方括号中的数字1表示从n的第一个元素开始显示. 其实该命令的功能在这里 与函数print( )相似,输出结果与print(n) 相同. 对象的名字必须是以一个 字母开头(A-Z 或a-z), 中间可以包含字母、数字(0–9)、点(.)及下划线( ). 因 为R对对象的名字区分大小写,所以x和X就可以代表两个完全不同的对象. 一个对象可以通过赋值操作来产生,R语言中的赋值符号一般是由一个尖 括号与一个负号组成的箭头形标志, 该符号可以是从左到右的方向,也可以相 反. 赋值也可以用函数assign( )实现, 还可以用等号“=”, 但它们很少使用. 例如 10 第二章 R的基本原理与核心 > n <- 10 > n [1] 10 > 10 -> n > n [1] 10 > assign("n", 10) > n [1] 10 > n=10 > n [1] 10 当然你也可以只是输入函数或表达式而不把它的结果赋给某个对象(如果这样 在窗口中展示的结果将不会被保存到内存中), 这时我们就可将R作为一个计 算器使用. 下面的例子说明了R中的算术运算符(加、减、乘、除、乘方、开方、 指数)的使用方法. > ((10 + 2) * 5-2^4)/4 [1] 13 > sqrt(3)+exp(-2) [1] 1.867386 更为常用的是常量、向量、矩阵、数组等其它对象的赋值与运算, 我们将在后 面讲述. 所有的高级语言都有注释语句, R中使用井号(#)表示注释的开始. §2.2 R的在线帮助 学习一门编程语言离不开语句、函数和编程的语法和语义,R中的程序包 都是由大量的进行统计分析的函数,它们的含义和使用方法对于熟练使用R进 行数据分析是至关重要的. 在此我们将R的帮助分成两类: 1) 关于R的基本知识: 通过命令 2.2 R的在线帮助 11 > help.start( ) 或R用户界面上的“帮助”菜单的“html帮助”得到. i. R的常见问题(FAQ): 系统提供了二个版本,其一为“R FAQ”,其二 为“R for Windows FAQ”, 它们随R的新版本同时发布与更新,内 容包括R的特点、安装、使用、界面、编程规则等. ii. R帮助手册,也随新版本发布与更新,共有6本手册: An Introduction to R, R Reference Manual, R Data input/output, R Language Def- inition, Writing R Extensions, R Installation and Administration. “帮助”菜单提供了它们的PDF电子版本, 便于打印. 初学者可看一 下其中的第一本. 2) 关于R中的函数或关键字符: i. 命令 > help(fun) 或 > ?fun 会立即显示名为“fun”函数的帮助页面, 而命令 > help("char") 则会显示某个具有特殊语法意义字符“char”的帮助页面. 页面的 第一行一般会显示此函数或字符的所属的程序包(package),然后是 标题,标题下面则是一些详细信息: Description: brief description. Usage: for a function, gives the name with all its arguments and the possible options (with the corresponding default values); for an operator gives the typical use. Arguments: for a function, details each of its arguments. Details: detailed description. Value: if applicable, the type of object returned by the function or the operator. See Also: other help pages close or similar to the present one. Examples: some examples which can generally be executed with- out opening the help with the function example. 12 第二章 R的基本原理与核心 默认状态下,函数help( )只会在被载入内存的程序包中搜索. 选 项try.all.package 在缺省值是FALSE, 但如果把它设为TRUE,则可 在所有已安装的程序包中进行搜索. 如果读者确实想打开这样的页 面而所属程序包又没有被载入内存时,可以使用package这个选项. 请读者试试下面的两个命令. > help("bs",try.all.packages=TRUE) > help("bs",package = "splines") ii. 命令 > apropos(fun) 或 > apropos("fun") 找出所有在名字中含有指定字符串“fun”的函数,但只会在被载入 内存中的程序包中进行搜索. 注意:如果“fun”不是完整的函数名, 则前者会出错; iii. 命令 > help.search("char") 列出所有在帮助页面含有字符“char”的函数, 它的搜索范围 比apropos("fun")更广; iv. 命令 > find(fun) 或 > find("fun") 得到名为“fun”函数所在的程序包; v. 命令 > args(fun) 或 > args("fun") 得到名为“fun”函数的自变量列表. 2.3 一个简短的R会话 13 对初学者而言,帮助中例子(Examples)部分的信息是很有用的. 而仔细阅读自 变量(Arguments)中的一些说明也是非常有必要的. 帮助中还包含了其它一些 说明部分,如注释(Notes), 参考文献(References)或作者(Author(s))等. §2.3 一个简短的R会话 下面通过一个具体的例子来说明如何利用R软件进行数据的统计分析, 此例使用R内嵌的数据集mtcars. 它在datasets(数据)包中, 此包像base一样 随R的启动自动加载. 数据的描述 命令 > ?mtcars 显示为 mtcars package:datasets R Documentation ?mtcars的结果 Motor Trend Car Road Tests Description: The data was extracted from the 1974 _Motor Trend_ US magazine, and comprises fuel consumption and 10 aspects of automobile design and performance for 32 automobiles (1973-74 models). Usage: mtcars Format: A data frame with 32 observations on 11 variables. [, 1] mpg Miles/(US) gallon [, 2] cyl Number of cylinders [, 3] disp Displacement (cu.in.) [, 4] hp Gross horsepower [, 5] drat Rear axle ratio 14 第二章 R的基本原理与核心 [, 6] wt Weight (lb/1000) [, 7] qsec 1/4 mile time [, 8] vs V/S [, 9] am Transmission (0 = automatic, 1 = manual) [,10] gear Number of forward gears [,11] carb Number of carburetors 它告诉我们数据集metars的基本信息. 它是美国Motor Trend收集 的1973到1974年期间总共32辆汽车的11个指标: 油耗及10个与设计及性能 方面的指标. 数据的浏览与编辑 1) 数据的浏览 命令 > mtcars 可以显示数据集mtcars中全部的32个观测值. 命令 > head(mtcars) 仅显示数据集mtcars中前7个观测值. 命令 > names(mtcars) 仅显示数据集mtcars中的变量, 在此为11个指标. 2) 数据的编辑 数据的编辑主要有两种方式(函数): 命令 > data.entry(mtcars) 通过R的数据编辑器打开数据集mtcars, 除了浏览数据集外,这里 我们还可以对变量及其观测值进行修改. 命令 > MTcars <- edit(mtcars) 同样启动R的数据编辑器, 在此可对原来的数据集mtcars进行编辑, 完成后将生成的新的数据集赋给MTcars, 而原来的数据集保持不变. 如果你要修改原来的数据集,使命令edit( )前后的数据集同名即 可. 因此命令edit(mtcars) 将无法完成对数据的修改. 命令 2.3 一个简短的R会话 15 > xnew <- edit(data.frame( )) 可以编辑生成新的数据集xnew. 另外, 对于一维的数据, edit( )打 开的是R Editor. 试比较下面的例子中两个命令的区别 > x <- c(10.4, 5.6, 3.1, 6.4, 21.7) > x [1] 10.4 5.6 3.1 6.4 21.7 > data.entry(x) > edit(x) 命令 > fix(mtcars) 可以完成数据集mtcars的直接修改. 因此它等价于命令 > mtcars <- edit(mtcars) 注意: 1) 使用上面的三个命令将挂起R的对话窗口(R Console), 关闭编辑器即可 继续进行R的对话. 2) 我们这里说的数据集就是下面一小节要讲的数据框(data frame). 数据对 象中除了上面已经出现的向量和数据框外,下面一节还要讲矩阵、数组、 和列表. 命令data.entry( )和edit( )都可用于编辑向量、矩阵、数据 框和列表,前者启用的都是R的数据编辑器, 后者有所不同: 对于向量、 列表和数组edit( )启用的是R Editor. 3) 尽管我们在R中可以浏览与编辑数据集mtcars, 但它们还无法对此数据 集进行操作(分析), 例如命令 > mpg 无法看到变量mpg(每加仑公里数)的具体数值. 这时我们需要激活或挂 接(attach)数据集mtcars. 命令 > attach(mtcars) 就激活mtcars, 使之成为当前的数据集. 这时通过命令 > mpg 就可浏览变量mpg的32个值,其它分析我们将在后面进行. 16 第二章 R的基本原理与核心 属性数据的分析 变量cyl(汽缸数)为属性变量, 命令 > table(cyl) 告诉我们变量cyl取3个值:4,6,8,相应的频数为11, 7, 14. 而命令 > barplot(table(cyl)) 显示了cyl的频数直方图. 要注意的是, 命令 > barplot(cyl) 在此不适用, 它仅适用于数值型变量. 数值型数据的分析 统计分析中主要涉及数值型数据. 对此我们可考查它们的图形特征及常用 的特征量. 画茎叶图(stem-and-leaf plot), 命令为 > stem(mpg). 画直方图, 命令为 > hist(mpg). 画框须图(stem-and-leaf plot), 命令为 > boxplot(mpg). 计算平均值, 命令为 > mean(mpg). 计算截去10%的平均值, 命令为 > mean(mpg, trim = .1). 按分组变量cyl计算mpg的分组平均值, 命令为 > tapply(mpg,cyl,mean) 计算cyl为4的那些mpg的平均值, 命令为 > mean(mpg[cyl == 4]). 2.3 一个简短的R会话 17 计算四分位数的极差(interquartile range), 命令为 > IQR(mpg). 计算样本常用的分位数: 极小、极大、中位数及两个四分位数, 命令为 > quantile(mpg) 或者 > fivenum(mpg) 计算由向量prob给定的各概率处的样本分位数, 命令为 > quantile(mpg, probs) 例如probs = c(0.1, 0.5, 99.5)/100. 可见, quantile( )比fivenum( )更 为一般. 计算常用的描述性统计量, 它们分别是最小值(Min.)、第一四分位数(1st Qu.)、中位数(Median)、平均值(Mean)、第三分位数(3rd Qu.)和最大 值(Max.), 命令为 > summary(mpg). 计算标准差, 命令为 > sd(mpg). 计算中位绝对离差(median absolute deviation), 命令为 > mad(mpg). 寻找二元关系 画二维散点图, 例如cyl与mpg的散点图, 可通过下面的命令得到. > plot(cyl,mpg) 注意: 相仿命令 plot(hp,mpg) 可得到hp与mpg的散点图. 但32个点对应了不同的汽缸, 因此按cly为图 例作出散点图更清晰, 命令为 > plot(hp,mpg,pch=cyl) > legend(250,30,pch=c(4,6,8), > legend=c("4 cylinders","6 cylinders","8 cylinders")) 18 第二章 R的基本原理与核心 拟合线性回归, 例如命令 > z <- lm(cyl ~ mpg) 可以得到 Call: lm(formula = cyl ~ mpg) Coefficients: (Intercept) mpg 11.2607 -0.2525 线性回归的截距为11.2607, 斜率为-0.2525. 相关系数(或R2)考查回归拟合好坏的程度. 命令 > cor(cyl,mpg) 可以得到相关系数(Pearson correlation coefficient)R, 其平方 > cor(cyl,mpg)^2 得到R2为0.72618, 表明数据变化的72.6%可以用汽缸数(cyl)与每加仑的 英里数(mpg)来刻划. 残差分析: > lm.res <- lm(cyl ~ mpg) # 将回归分析的结果作为对象 # 保存到lm.res中 > lm.resids <- resid(lm.res) # 提取残差向量 > plot(lm.resids) # 考查残差的散点图 > hist(lm.resids) # 考查残差的直方图: 钟型? > qqnorm(lm.resids) # 残差的QQ图是否落在直线上? 结论: 从残差分析我们可以得出汽车的汽缸数与每加仑的里程数可以用线性回 归来刻划. 结束分析并退出R > detach(mtcars) # 从内存中清除数据集mtcars > q( ) # 退出R 2.4 R的数据结构 19 §2.4 R的数据结构 2.4.1 R的对象与属性 我们已经知道R通过一些对象来运行,这些对象是用它们的名称和内容来 刻画的,其次也通过对象的数据类型即属性来刻画. 所有的对象都有两个内在 属性:类型和长度. 类型是对象元素的基本种类,共有四种: 数值型, 包括 – 整型 – 单精度实型 – 双精度实型 字符型 复数型1 逻辑型(FALSE、TRUE或NA) 虽然还存在其它的类型,例如函数或表达式, 但是它们并不能用来表示数 据;长度是对象中元素的数目. 对象的类型和长度可以分别通过函数mode( ) 和length( )得到. 例如 > x <- 1 > mode(x) [1] "numeric" > length(x) [1] 1 > A <- "Gomphotherium"; compar <- TRUE; z <- 1i > mode(A); mode(compar); mode(z) [1] "character" [1] "logical" [1] "complex" 无论什么类型的数据,缺失数据总是用NA(Not Available的意思)来表示; 对很 大的数值则可用指数形式表示: 1本书不讨论复数型 20 第二章 R的基本原理与核心 > N <- 2.1e23 > N [1] 2.1e+23 R可以正确地表示无穷的数值,如用Inf和-Inf表示 8和8,或者用NaN(Not a Number 的意思)表示不是数字的值. > x <- 5/0 > x [1] Inf > exp(x) [1] Inf > exp(-x) [1] 0 > Inf - Inf [1] NaN > 0/0 [1] NaN >sqrt{-7) [1] NaN Warning message: 产生了NaNs in: sqrt(-17) >sqrt(-17+0i) # 按照复数进行运算 [1] 0+4.123106i 字符型的值输入时须加上双引号",如果需要引用双引号的话,可以让它 跟在反斜杠“\”后面, 在某些函数如cat( )的输出显示或write.table( )写 入磁盘时会被以特殊的方式处理. 例如 > x <- "Double quotes \" delimitate R's strings." > x [1] "Double quotes \" delimitate R's strings." > cat(x) Double quotes " delimitate R's strings. 另一种表示字符型变量的方法,即用单引号(’)来界定变量,这种情况下不需 要用反斜杠来引用双引号. 2.4 R的数据结构 21 > x <- 'Double quotes " delimitate R\'s strings.' > x [1] "Double quotes \" delimitate R's strings." 表2.1概括了表示数据对象的类别: 表 2.1 数据对象及类型 是否允许 对象 类型 同一个对象中 有多种类型? 向量 数值型,字符型,复数型,逻辑型 否 因子 数值型, 字符型 否 数组 数值型,字符型,复数型,逻辑型 否 矩阵 数值型,字符型,复数型,逻辑型 否 数据框 数值型,字符型,复数型,逻辑型 是 时间序列(ts) 数值型,字符型,复数型,逻辑型 否 列表 数值型,字符型,复数型,逻辑型, 是 函数,表达式,. . . 说明 1) 向量是一个变量(的取值),是R中最常用、最基本的操作对象;因子是一 个分类变量;数组是一个k维的数据表;矩阵是数组的一个特例,其维 数k 2. 注意: 数组或者矩阵中的所有元素都必须是同一种类型的;数据框是由 一个或几个向量和(或)因子构成,它们必须是等长的,但可以是不同的 数据类型;“ts”表示时间序列数据,它包含一些额外的属性,例如频率 和时间;列表可以包含任何类型的对象,包括列表! 2) 对于一个向量,用它的类型和长度足够描述数据;而其它的对象则另需 一些额外信息,这些信息由外在的属性给出, 例如这些属性中的表示对象 22 第二章 R的基本原理与核心 维数的dim. 比如一个2行2列的的矩阵,它的dim是一对数值[2,2],但是其 长度是4. 3) R中有三种主要类型的运算符, 表2.2是这些运算符的列表. 其中数学运算 符和比较运算符作用于两个元素上(例如x + y, a < b);数学运算符不只 是作用于数值型或复数型变量,也可以作用在逻辑型变量上;在后一种 情况中,逻辑型变量被强制转换为数值型. 比较运算符可以适用于任何 类型:结果是返回一个或几个逻辑型变量; 逻辑型运算符适用于一个(对 于“!”运算符)或两个逻辑型对象(对于其它运算符),并且返回一个(或 几个)逻辑性变量. 运算符“逻辑与”和“逻辑或”存在两种形式:“&” 和“|”作用在对象中的每一个元素上并且返回和比较次数相等长度的逻 辑值;“&&”和“||”只作用在对象的第一个元素上. 表 2.2 运算符 数学运算 比较运算 逻辑运算 + 加法 < 小于 ! x 逻辑非 - 减法 > 大于 x & y 逻辑与 * 乘法 <= 小于或等于 x && y 同上 / 除法 >= 大于或等于 x | y 逻辑或 ^ 乘方 == 等于 x || y 同上 %% 模 != 不等于 xor(x, y) 异或 %/% 整除 2.4.2 浏览对象的信息 函数ls( )的功能是显示所有在内存中的对象. ls( )只会列出对象名,例 如: > name <- "Carmen"; n1 <- 10; n2 <- 100; m <- 0.5 > ls( ) [1] "m" "n1" "n2" "name" 2.4 R的数据结构 23 如果只要显示出在名称中带有某个指定字符的对象,则通过设定选项pattern 来实现(可简写为pat) ): > ls(pat = "m") [1] "m" "name" 如果进一步限定显示名称中以某个字母开头的对象,则可使用命令: > ls(pat = "^m") [1] "m" 运行函数ls.str( )将会显示内存中所有对象的详细信息: > ls.str( ) m : num 0.5 n1 : num 10 n2 : num 100 name : chr "Carmen" 在ls.str( )函数中另一个非常有用的选项是max.level, 它将规定显示 有关对象信息的详细级别. 缺省情况下,ls.str( ) 将会列出关于对象的所有 信息,包括数据框、矩阵,或数据列表的详细信息, 显示结果可能会很长. 但如 果设定max.level =-1 就可以避免这种情况了. 试比较: > M <- data.frame(n1, n2, m) > ls.str(pat = "M") M : `data.frame': 1 obs. of 3 variables: $ n1: num 10 $ n2: num 100 $ m : num 0.5 > ls.str(pat="M", max.level=-1) M : `data.frame': 1 obs. of 3 variables: 要在内存中删除某个对象,可利用函数rm( ). 例如 运行rm(x)将会删除对象x 运行rm(x,y)将会删除对象x和y 运行rm(list=ls( ))则会删除内存中的所有对象 运行rm(list=ls(pat="^m"))则会删除对象中以字母m开头的对象 24 第二章 R的基本原理与核心 下面我们通过具体的例子说明向量(包括数值型向量、字符型向量、逻辑 型向量和因子型向量)、矩阵、数据框、列表和时间序列的构成方法. 2.4.3 向量的建立 数值型向量的建立 统计分析中最为常用的是数值型的向量, 它们可用下面的四种函数建立: 1) seq( )或“:” # 若向量(序列)具有较为简单的规律 2) rep( ) # 若向量(序列)具有较为复杂的规律 3) c( ) # 若向量(序列)没有什么规律 4) scan( ) # 通过键盘逐个输入 例子 > 1:10 [1] 1 2 3 4 5 6 7 8 9 10 > 1:10-1 [1] 0 1 2 3 4 5 6 7 8 9 > 1:(10-1) [1] 1 2 3 4 5 6 7 8 9 # 注意括号有无的区别 > z <- seq(1,5,by=0.5) # 等价于 seq(from=1,to=5,by=0.5) > z [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 > z <- seq(1,10,length=11) # 等价于 seq(1,10,length.out=11) > z [1] 1.0 1.9 2.8 3.7 4.6 5.5 6.4 7.3 8.2 9.1 10.0 > z <- rep(2:5,2) # 等价于 rep(2:5, times=2) > z [1] 2 3 4 5 2 3 4 5 > z <- rep(2:5,rep(2,4)) [1] 2 2 3 3 4 4 5 5 > z <- rep(1:3, times = 4, each = 2) > z 2.4 R的数据结构 25 [1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 > z <- x<-c(42,7,64,9) > z [1] 42 7 64 9 > z <- scan( ) # 通过键盘建立向量 1: 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 10: Read 9 items > z [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 > z <- sequence(3:5) > z [1] 1 2 3 1 2 3 4 1 2 3 4 5 > z <- sequence(c(10,5)) > z [1] 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 字符型向量的建立 字符和字符向量在R中广泛使用,比如图表的标签. 在显示的时候,相应 的字符串由双引号界定,字符串在输入时可以使用单引号(’)或双以号(”). 引 号(”)在输入时应当写作\”. 字符向量可以通过函数c( )连接. 函数paste()可 以接受任意个参数,并从它们中逐个取出字符并连成字符串,形成的字符串的 个数与参数中最长字符串的长度相同. 如果参数中包含数字的话,数字将被强 制转化为字符串. 在默认情况下,参数中的各字符串是被一个空格分隔的,不 过通过参数sep=string 用户可以把它更改为其他字符串,包括空字符串. 例 如 > Z <- c("green","blue sky","-99") > Z [1] "green" "blue sky" "-99" > labs <- paste(c("X","Y"), 1:10, sep="") > labs [1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10" 26 第二章 R的基本原理与核心 逻辑型向量的建立 与数值型向量相同,R允许对逻辑向量进行操作. 一个逻辑向量的值可以 是TRUE, FALSE和NA. 前两个通常简写为T和F2 . 逻辑向量是由条件给出的. 譬 如 > x <- c(10.4, 5.6, 3.1, 6.4, 21.7) > temp <- x > 13 > temp [1] FALSE FALSE FALSE FALSE TRUE temp为一个与x长度相同,元素根据是否与条件相符而由TRUE或FALSE组成的 向量. 逻辑向量可以在普通的运算中被使用,此时它们将被转化为数字向 量,FALSE当做0, 而TRUE当做1. 再看几个简单的例子: > 7!=6 [1] TRUE > !(7==6) [1] TRUE > !(7==6)==1 [1] TRUE > (7==9)|(7>0) [1] TRUE > (7==9)&(7>0) [1] FALSE 因子型向量的建立 一个因子或因子向量不仅包括分类变量本身, 还包括变量不同的可能水 平(即使它们在数据中不出现). 因子利用函数factor( )创建. factor( )的调 用格式如下: factor(x, levels = sort(unique(x), na.last = TRUE), factor( )的调用格式 labels = levels, exclude = NA, ordered = is.ordered(x)) 2注意T和F仅仅是默认被指向TRUE和FALSE的变量,而不是系统的保留字. 2.4 R的数据结构 27 说明: levels 用来指定因子的水平(缺省值是向量x中不同的值);labels用来 指定水平的名字;exclude表示从向量x中剔除的水平值;ordered是一个逻辑 型选项, 用来指定因子的水平是否有次序. 这里x可以是数值型或字符型, 这样 对应的因子也就称为数值型因子或字符型因子. 因此, 因子的建立可以通过字 符型向量或数值型向量来建立, 且可以转化. 1) 将字符型向量转换成因子 > a <- c("green", "blue", "green", "yellow") > a <- factor(a) a [1] green blue green yellow Levels: blue green yellow 2) 将数值型向量转换成因子 > b <- c(1,2,3,1) > b <- factor(b) > b [1] 1 2 3 1 Levels: 1 2 3 3) 将字符型因子转换为数值型因子 > a <- c("green", "blue", "green", "yellow") > a <- factor(a) > levels(a)<-c(1,2,3,4) > a [1] 2 1 2 3 Levels: 1 2 3 4 > ff <- factor(c("A", "B", "C"), labels=c(1,2,3)) > ff [1] 1 2 3 Levels: 1 2 3 4) 将数值型因子转换为字符型因子 28 第二章 R的基本原理与核心 > b <- c(1,2,3,1) > b <- factor(b) > levels(b) <- c("low", "middle", "high") > b [1] low middle high low Levels: low middle high > ff <- factor(1:3, labels=c("A", "B", "C")) ff [1] A B C Levels: A B C 注:函数levels( )用来提取一个因子中可能的水平值, 例如 > ff <- factor(c(2, 4), levels=2:5) > ff [1] 2 4 Levels: 2 3 4 5 > levels(ff) [1] "2" "3" "4" "5" 5) 函数gl( )能产生规则的因子序列. 这个函数的用法是gl(k,n),其中k是 水平数, n是每个水平重复的次数. 此函数有两个选项:length用来指定 产生数据的个数, label用来指定每个水平因子的名字. 例如: > gl(3, 5) [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 Levels: 1 2 3 > gl(3, 5, length=30) [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 Levels: 1 2 3 > gl(2, 6, label=c("Male", "Female")) [1] Male Male Male Male Male Male [7] Female Female Female Female Female Female Levels: Male Female > gl(2, 10) [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2.4 R的数据结构 29 Levels: 1 2 > gl(2, 1, length=20) [1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 Levels: 1 2 > gl(2, 2, length=20) [1] 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 Levels: 1 2 数值型向量的运算 向量可以用于算术表达式中,操作是按照向量中的元素一个一个进行的. 同一个表达式中的向量并不需要具有相同的长度, 如果它们的长度不同,表达 式的结果是一个与表达式中最长向量有相同长度的向量, 表达式中较短的向量 会根据它的长度被重复使用若干次(不一定是整数次),直到与长度最长的向量 相匹配, 而常数将被不断重复— 这一规则称为循环法则(recycling rule). 例 如, 命令 > x <- c(10.4, 5.6, 3.1, 6.4, 21.7) > y <- c(x,0,x) > v <- 2*x + y + 1 产生一个长度为11的新向量v, 其中2 x被重复2.2次,y 被重复1次,常数1被重 复11次. 为了方便使用,我们对向量的运算稍作细分: 向量与一个常数的加、减、乘、除为向量的每一个元素与此常数进行加、 减、乘、除; 向量的乘方( ˆ )与开方(sqrt)为每一个元素的乘方与开方, 这对 像log, exp, sin, cos, tan 等普通的运算函数同样适用; 同样长度向量的加、减、乘、除等运算为对应元素进行加、减、乘、除等; 不同长度向量的加、减、乘、除遵从循环法则(recycling rule), 但要注意 这种场合通常要求向量的长度为倍数关系, 否则会出现警告:“长向量并 非是短向量的整数倍”. 下面举例说明 30 第二章 R的基本原理与核心 > 5+c(4,7,17) [1] 9 12 22 > 5*c(4,7,17) [1] 20 35 85 > c(-1,3,-17)+c(4,7,17) [1] 3 10 0 > c(2,4,5)^2 [1] 4 16 25 > sqrt(c(2,4,25)) [1] 1.414214 2.000000 5.000000 > 1:2+1:4 [1] 2 4 4 6 > 1:4+1:7 [1] 2 4 6 8 6 8 10 Warning message: 长的目标对象长度不是短的目标对象长度的整倍数 in: 1:4 + 1:7 常用统计函数 最后列出统计分析中常用的函数与作用(见表2.1). 图 2.1 统计分析中常用的函数与作用 统计函数 作用 maxpxq 返回向量x中最大的元素 minpxq 返回向量x中最小的元素 which.maxpxq 返回向量x中最大元素的下标 which.minpxq 返回向量x中最小元素的下标 meanpxq 计算样本(向量)x的均值 medianpxq 计算样本(向量)x的中位数 madpxq 计算中位绝对离差 2.4 R的数据结构 31 varpxq 计算样本(向量)x的方差 sdpxq 计算向量x的标准差 rangepxq 返回长度为2的向量: cpminpxq,maxpxqq IQRpxq 计算样本的四分位数极差 quantilepxq 计算样本常用的分位数3 summarypxq 计算常用的描述性统计量(最小、最大、平均值、中 位数和四分位数) lengthpxq 返回向量x的长度 sumpxq 给出向量x的总和 prodpxq 给出向量x的乘积 revpxq 取向量x的逆序 sortpxq 将向量x按升序排序, 选项decreasing=TRUE表示 降序 orderpxq 返回x的秩(升序), 选项decreasing=TRUE得到降 序的秩 rankpxq 返回x的秩 cumsumpxq 返 回 向 量x和 累 积 和(其 第i个 元 素 是 从xr1s到xris的和) cumprodpxq 返 回 向 量x和 累 积 积(其 第i个 元 素 是 从xr1s到xris的积) cumminpxq 返 回 向 量x和 累 积 最 小 值(其 第i个 元 素 是 从xr1s到xris的最小值) cummaxpxq 返 回 向 量x和 累 积 最 大 值(其 第i个 元 素 是 从xr1s到xris的最大值) 3quantile(x)仅计算x的极小、极大、中位数及两个四分位数, 更一般地使用quantile(x, probs)可计算 给定向量probs处的样本分位数. 32 第二章 R的基本原理与核心 varpx, yq 计算样本(向量)x与y的协方差 covpx, yq 计算样本(向量)x与y的协方差 corpx, yq 计算样本(向量)x与y的相关系数 outerpx, yq 计算样本(向量)x与y的外积4 函数maxpq, minpq, median( ), var( ), sd( ), sum( ), cumsum( ), cumprod( ), cummax( ), cummin( )对于矩阵及数据框的意义有方向性. 对于 矩阵, cov( )和cor( ) 分别用于求矩阵的协方差阵和相关系数阵, 这些将在 后面举例说明. 向量的下标(index)与子集(元素)的提取 选择一个向量的子集(元素)可以通过在其名称后追加一个方括号中的索 引向量来完成. 更一般地,任何结果为一个向量的表达式都可以通过追加索引 向量来选择其中的子集. 这样的索引向量有四种不同的类型. 1) 正整数向量 — 提取向量中对应的元素. 这种情况下索引向量中的值必 须在集合{1, 2, , lengthpxq}中. 返回的向量与索引向量由相同的长度, 且按索引向量的顺序排列. 例如x[6] 是x的第六个元素,而 > x[1:10] 选取了x的前10个元素(假设x的长度不小于10). > x[c(1,4)] 取出向量x的第1和第4个元素. 2) 负整数向量 — 去掉向量中与索引向量对应的元素. 例如 > y <- x[-(1:5)] 从x中去除前5个元素得到y. 3) 字符串的向量. 这种可能性只存在于拥有names属性并由它来区分向量中 元素的向量. 这种情况下一个由名称组成的子向量起到了和正整数的索 引向量相同的效果. 例如 4函数outer( )的一般形式为(x,y,"op"), 其中op可为任一四则运算符. 2.4 R的数据结构 33 > fruit <- c(5, 10, 1, 20) > names(fruit) <- c("orange", "banana", "apple", "peach") fruit orange banana apple peach 5 10 1 20 > lunch <- fruit[c("apple","orange")] > lunch apple orange 1 5 4) 逻辑的向量 — 取出满足条件的元素. 在索引向量中返回值是TRUE的元 素所对应的元素将被选出,返回值为FALSE的值所对应的元素将被忽略. 例如 > x <- c(42,7,64,9) > x>10 # 值大于10的元素逻辑值 [1] TRUE FALSE TRUE FALSE > x[x>10] # 值大于10的元素 [1] 42 64 > x[x<40&x>10] numeric(0) > x[x>10] <- 10 > x [1] 10 7 10 9 >y = runif(100,min=0,max=1) #(0,1)上100个均匀分布随机数 >sum(y<0.5) # 值小于0.5的元素的个数 [1] 47 >sum(y[y<0.5]) # 值小于0.5的元素的值的和 [1] 10.84767 > y <- x[!is.na(x)] # x中的非缺失值 > z <- x[(!is.na(x))&(x>0)] # x中的非负非缺失值 34 第二章 R的基本原理与核心 2.4.4 数组与矩阵的建立 前面已经指出数组是一个kp¥ 1q维的数据表; 矩阵是数组的一个特例,其 维数k 2,而上面所述的向量自然也可看成维数为k 1的数组5. 而且向量、 数组或者矩阵中的所有元素都必须是同一种类型的. 对于一个向量,其属性由 其类型和长度构成;而对于数组与矩阵, 除了类型和长度两个属性外, 还需要 维数dim这个属性来描述. 因此如果一个向量需要在R中以数组的方式被处理, 则必须含有一个维数向量作为它的dim属性. 数组的建立 R中数组由函数array( )建立, 其一般格式为: > array(data, dim, dimnames) 其中data为一向量, 其元素用于构建数组; dim为数组的维数向量(为数值型向 量); dimnames为由各维的名称构成的向量(为字符型向量), 缺省为空. 以一个3维的数据为例来说明. 设A是一个存放在向量a中的24个数据项组 成的数组, A的维数向量为c(3,4,2). 维数可由命令 > dim(A) <- c(3,4,2) 建立. 这样, 命令 > A <- array(a, dim = c(3,4,2)) 就建立了数组A. 24个数据项在数组A中的顺序依次为: ar1, 1, 1s, ar2, 1, 1s, , ar2, 4, 2s, ar3, 4, 2s. 我们再来看一个具体的例子: > A <- array(1:8, dim = c(2, 2, 2)) > A , , 1 [,1] [,2] [1,] 1 3 [2,] 2 4 , , 2 [,1] [,2] [1,] 5 7 [2,] 6 8 5通常使用c( )建立向量, 使用matrix( )建立矩阵, 使用array( )建立数组, 因此它们在R中的属性是不 同的 2.4 R的数据结构 35 > dim(A) [1] 2 2 2 > dimnames(A) <- list(c("a", "b"), c("c", "d"), c("e", "f")) > A , , e c d a 1 3 b 2 4 , , f c d a 5 7 b 6 8 > colnames(A) [1] "c" "d" > rownames(A) [1] "a" "b" > dimnames(A) [[1]] [1] "a" "b" [[2]] [1] "c" "d" [[3]] [1] "e" "f" 如果数据项太少,则采用循环准则填充数组(或矩阵), 见下面的的第二个例子. 矩阵的建立 因为矩阵是数组的特例,因此矩阵也可以用函数array( )来建立, 例如 > A <- array(1:6, c(2,3)) > A [,1] [,2] [,3] [1,] 1 3 5 36 第二章 R的基本原理与核心 [2,] 2 4 6 > A<-array(1:4,c(2,3)) > A [,1] [,2] [,3] [1,] 1 3 1 [2,] 2 4 2 > A<-array(1:8,c(2,3)) > A [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 然而, 由于矩阵在数学及统计中的特殊性, 在R中最为常用的是使用命 令matrix( )建立矩阵, 而对角矩阵用函数diag( )建立更为方便, 例如 > X <- matrix(1, nr = 2, nc = 2) [,1] [,2] [1,] 1 1 [2,] 1 1 > X <- diag(3) # 生成单位阵 [,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 > v <- c(10, 20, 30) > diag(v) [,1] [,2] [,3] [1,] 10 0 0 [2,] 0 20 0 [3,] 0 0 30 > diag(2.5, nr = 3, nc = 5) [,1] [,2] [,3] [,4] [,5] [1,] 2.5 0.0 0.0 0 0 [2,] 0.0 2.5 0.0 0 0 [3,] 0.0 0.0 2.5 0 0 > X <- matrix(1:4, 2) # 等价于X <- matrix(1:4, 2, 2) 2.4 R的数据结构 37 > X [,1] [,2] [1,] 1 3 [2,] 2 4 > rownames(X) <- c("a", "b") > colnames(X) <- c("c", "d") > X c d a 1 3 b 2 4 > dim(X) [1] 2 2 > dimnames(X) [[1]] [1] "a" "b" [[2]] [1] "c" "d" 注意: 循环准则仍然适用于matrix( ), 但要求数据项的个数等于矩阵的列数的 倍数, 否则会出现警告. 矩阵的维数使用c( )会得到不同的结果(除非是方阵), 因此需要小心. 数据项填充矩阵的方向可通过参数byrow来指定, 其缺省是按列填充 的(byrow=FALSE). byrow=TRUE表示按行填充数据. 再看几个例子: > X <- matrix(1:4, 2, 4) # 按列填充 > X [,1] [,2] [,3] [,4] [1,] 1 3 1 3 [2,] 2 4 2 4 > X <- matrix(1:4, 2, 3) Warning message: 38 第二章 R的基本原理与核心 In matrix(1:4, 2, 3) : 数据长度[4]不是矩阵列数[3]的整倍数 > X <- matrix(1:4, c(2, 3)) # 不经常使用 > X [,1] [,2] [1,] 1 3 [2,] 2 4 > X <- matrix(1:4, 2, 4, byrow=TRUE) # 按行填充 > X [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 1 2 3 4 数组与矩阵的下标(index)与子集(元素)的提取 同向量的下标一样,矩阵与数组的下标可以使用正整数、负整数和逻辑表 达式,从而实现子集的提取或修改. 考查矩阵 x <- matrix(1:6, 2, 3) > x [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 提取一个元素 > x[2,2] [1] 4 提取若一个或若干个行或列6 > x[2,] [1] 2 4 6 > x[,2] [1] 3 4 > x[,2,drop=FALSE] 6R的缺省规则是返回一个维数尽可能低的对象, 这可以通过修改选项drop的值来改变. 2.4 R的数据结构 39 [,1] [1,] 3 [2,] 4 > x[,c(2,3),drop=FALSE] [,1] [,2] [1,] 3 5 [2,] 4 6 去掉若一个或若干个行与列 > x[-1,] [1] 2 4 6 > x[,-2] [,1] [,2] [1,] 1 5 [2,] 2 6 添加与替换元素 > x[,3] <- NA > x [,1] [,2] [,3] [1,] 1 3 NA [2,] 2 4 NA > x[is.na(x)] <- 1 # 缺失值用1代替 > x [,1] [,2] [,3] [1,] 1 3 1 [2,] 2 4 1 对矩阵的运算(函数) 对于矩阵的运算, 我们分通常的矩阵代数运算与统计运算来分别讨论. 1) 矩阵的代数运算: 转置函数t( ): 40 第二章 R的基本原理与核心 > X <- matrix(1:6, 2, 3) > X [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > t(X) [,1] [,2] [1,] 1 2 [2,] 3 4 [3,] 5 6 提取对角元diag( ): > X <- matrix(1:4, 2, 2) > diag(X) [1] 1 4 几个矩阵按行合并rbind( )与按列合并cbind( ): > m1 <- matrix(1, nr = 2, nc = 2) > m2 <- matrix(2, nr = 2, nc = 2) > rbind(m1, m2) [,1] [,2] [1,] 1 1 [2,] 1 1 [3,] 2 2 [4,] 2 2 > cbind(m1, m2) [,1] [,2] [,3] [,4] [1,] 1 1 2 2 [2,] 1 1 2 2 矩阵的逐元乘积“*”: > m2*m2 [,1] [,2] [1,] 4 4 [2,] 4 4 矩阵的代数乘积“%*%”: 2.4 R的数据结构 41 > rbind(m1, m2) %*% cbind(m1, m2) [,1] [,2] [,3] [,4] [1,] 2 2 4 4 [2,] 2 2 4 4 [3,] 4 4 8 8 [4,] 4 4 8 8 > cbind(m1, m2) %*% rbind(m1, m2) [,1] [,2] [1,] 10 10 [2,] 10 10 方阵的行列式det( ) > X<-matrix(1:4, 2) > X [,1] [,2] [1,] 1 3 [2,] 2 4 > det(X) [1] -2 其它函数: 交叉乘积(cross product), 函数为crossprod( ); 特征根 与特征向量, 函数为eigen( ); QR分解, 函数为qr( ), 等等. 2) 矩阵的统计运算: 在讲述向量时我们已经提到过函数max( ), min( ), median( ), var( ), sd( ), sum( ), cumsum( ), cumprod( ), cummax( ), cummin( )对于矩阵(及数据框)有方向性. 而函数cov( )和cor( ) 分别用于计算 矩阵的协方差阵和相关系数阵. 正是由于矩阵的排列是有方向性的,在R中规定矩阵是按列排 的,若没有特别说明上述函数的使用也是按列计算的, 但也可以通 过选项MARGIN来改变. 下面我们要用到对一个对象施加某种运算的函 数apply( ), 其格式为 > apply(X, MARGIN, FUN) 其中X为参与运算的矩阵, FUN为上面的一个函数或“+”、“- ”、“*”、“\”(必须放在引号中), MARGIN=1表示按列计算, MARGIN=2表 示按行计算, MARGIN=c(1,2)表示按行列计算(在至少3维的数组中使用). 42 第二章 R的基本原理与核心 我们还用到sweep( )函数, 命令 > sweep(X, MARGIN, STATS, FUN) 表示从矩阵X中按MATGIN计算STATS,并从X中除去(sweep out). 下面举 几个例子加以说明: 求均值, 中位数等: > m<-matrix(rnorm(n=12),nrow=3) > apply(m, MARGIN=1, FUN=mean) # 求各行的均值 [1] -0.2540148 0.5474583 0.1493290 > apply(m, MARGIN=2, FUN=mean) # 求各列的均值 [1] -0.5389053 0.4731592 0.7821656 -0.1260561 标准化: > scale(m, center=T, scale=T) 减去中位数: > row.med <- apply(m, MARGIN=1, FUN=median) > sweep(m, MARGIN=1, STATS=row.med, FUN=”-”) 2.4.5 数据框(data frame)的建立 统计分析中一个完整的数据集通常是由若干个变量的若干个观测值组成 的, 在R中称为数据框. 数据框是一个对像, 它与前面讲的矩阵与二维数组形式 上是类似的, 也是二维的,也有维数这个属性, 且各个变量的观测值有相同的 长度. 但不同的是: 在数据框中, 行与列的意义是不同的, 其中的列表示变量, 而行表示观测. 显示数据框时左侧会显示观测值的序号. 数据框的建立分为直接的与简接的两种方法: 数据框的直接建立 若你在R中建立了一些向量并试图想由它们生成数据框,则可以使用函 数data.frame( ). 例如 > x=c(42,7,64,9) > y=1:4 > z.df=data.frame(INDEX = y, VALUE = x) 2.4 R的数据结构 43 INDEX VALUE 1 1 42 2 2 7 3 3 64 4 4 9 数据框中的向量必须有相同的长度或长度有倍数关系,如果其中有一个比其它 的短,它将按循环法则“循环”整数次. 例如 > weight <- c(70.6, 56.4, 80, 59.5) > x <- (c("adult", "teen", "adult", "teen")) > wag <- data.frame(weight, age = x) > wag weight age 1 70.6 adult 2 56.4 teen 3 80.0 adult 4 59.5 teen > x <- 1:4; y <- 2:4 > data.frame(x, y) 错误于data.frame(x, y) : 变元值意味着不同的行数 4, 3 数据框的简接建立 一个数据框还可以通过数据文件(文本文件、EXCEL文件或其它统计 软件的数据文件)读取并建立, 在此我们仅通过一个例子来说明如何通过函 数read.table( )读取文件c:\data\foo.txt中的观测值,并建立一个数据框. 其它简接方法可参考下一节“数据的存贮与读取”的介绍. 已知存于foo.txt上 的数据如下: treat weight A 3.4 B NA A 5.8 则下面的命令建立了数据框foo. 44 第二章 R的基本原理与核心 > foo <- read.table(file = "c:/data/foo.txt", header = T) > foo treat weight 1 A 3.4 2 B NA 3 A 5.8 适用于数据框的函数 在上一小节中我们所讨论的关于矩阵的统计计算函数max( ), min( ), median( ), var( ), sd( ), sum( ), cumsum( ), cumprod( ), cummax( ), cummin( ), cov( ), cor( )同样适用于数据框, 意义也相同. 这里通过R内 嵌的另一个数据集Puromycin来说明summary( )、pairs( )和xtable( )等的 使用. > attach(Puromycin) # 挂接数据集使之激活 > help(Puromycin) # 显示前几行 > summary(Puromycin) # 显示主要的描述性统计量 conc rate state Min. :0.0200 Min. : 47.0 treated :12 1st Qu.:0.0600 1st Qu.: 91.5 untreated:11 Median :0.1100 Median :124.0 Mean :0.3122 Mean :126.8 3rd Qu.:0.5600 3rd Qu.:158.5 Max. :1.1000 Max. :207.0 从summary可以看出, 变量conc和rate是数值型的, 而state为因子变量. 变量 之间的关系可以通过成对数据散点图考查: > pairs(Puromycin, panel = panel.smooth) 最后使用xtabs( )函数由交叉分类因子产生一个列联表: > xtabs(~state + conc, data = Puromycin) conc state 0.02 0.06 0.11 0.22 0.56 1.1 2.4 R的数据结构 45 conc 50 100 150 200 0. 0 0. 2 0. 4 0. 6 0. 8 1. 0 50 10 0 15 0 20 0 rate 0.0 0.2 0.4 0.6 0.8 1.0 1.0 1.2 1.4 1.6 1.8 2.0 1. 0 1. 2 1. 4 1. 6 1. 8 2. 0 state 图 2.2 Puromycin的成对散点图 treated 2 2 2 2 2 2 untreated 2 2 2 2 2 1 数据框的下标与子集的提取 数据框的下标与子集的提取与矩阵基本相同. 不同的是: 对于列我们可以 使用变量的名称, 仍以数据集Puromycin进行举例说明. 提取单个元素 > Puromycin[1, 1] [1] 0.02 46 第二章 R的基本原理与核心 提取一个子集,例如第1, 3, 5行,第1, 3列 > Puromycin[c(1, 3, 5), c(1, 3)] conc state 1 0.02 treated 3 0.06 treated 5 0.11 treated > Puromycin[c(1, 3, 5), ] conc rate state 1 0.02 76 treated 3 0.06 97 treated 5 0.11 123 treated 常使用变量名称来指定列的位置,上面的命令等价于 > Puromycin[c(1, 3, 5), c("conc", "state")]] 提取一列(变量的值). 一个数据框的变量对应了数据框的一列, 如果变量 有名称, 则可直接使用“数据框名$变量名”这种格式指向对应的列. 例如 > Puromycin$conc # 等价于 Puromycin[,1] [1] 0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 [11] 1.10 1.10 0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 [21] 0.56 0.56 1.10 > Puromycin$state [1] treated treated treated treated treated [6] treated treated treated treated treated [11] treated treated untreated untreated untreated [16] untreated untreated untreated untreated untreated [21] untreated untreated untreated Levels: treated untreated 提取满足条件的子集 > subset(Puromycin, state == "treated" & rate > 160) conc rate state 9 0.56 191 treated 2.4 R的数据结构 47 10 0.56 201 treated 11 1.10 207 treated 12 1.10 200 treated > subset(Puromycin, conc > mean(conc)) conc rate state 9 0.56 191 treated 10 0.56 201 treated 11 1.10 207 treated 12 1.10 200 treated 21 0.56 144 untreated 22 0.56 158 untreated 23 1.10 160 untreated 数据框中添加新变量 在原有的数据框中添加新的变量有三种方法. 假设我们想在Puromycin中 增加变量iconc, 其定义为1/conc, 则可分别使用: 1) 基本方法 > Puromycin$iconc <- 1/Puromycin$conc 2) 使用with( ) 函数 > Puromycin$iconc <- with(Puromycin, 1/conc) 3) 使用transform( )函数, 且可一次性定义多个变量 > Puromycin <- transform(Puromycin, iconc = 1/conc, sqrtconc = sqrt(conc)) > head(Puromycin) conc rate state iconc sqrtconc 1 0.02 76 treated 50.00000 0.1414214 2 0.02 47 treated 50.00000 0.1414214 3 0.06 97 treated 16.66667 0.2449490 4 0.06 107 treated 16.66667 0.2449490 5 0.11 123 treated 9.09091 0.3316625 6 0.11 139 treated 9.09091 0.3316625 48 第二章 R的基本原理与核心 2.4.6 列表(list)的建立 复杂的数据分析时,仅有向量与数据框还不够, 有时需要生成包含不同类 型的对象. R的列表(list)就是包含任何类型的对象. 列表可以用函数list( )创建,方法与创建数据框类似(见§2.4.5). 和data.frame( )一样,缺省值没有给出对象的名称. 列表的下标与子集 的提取也与数据框没有本质区别. 数据分析时通常是在提取部分对象后按上面 讲述的向量、矩阵或数据框等运算进行, 在此不再一一列举. 下面仅举一例进 行说明. > L1 <- list(1:6, matrix(1:4, nrow = 2)) > L1 [[1]] [1] 1 2 3 4 5 6 [[2]] [,1] [,2] [1,] 1 3 [2,] 2 4 L2 <- list(x = 1:6, y = matrix(1:4, nrow = 2)) > L2 $x [1] 1 2 3 4 5 6 $y [,1] [,2] [1,] 1 3 [2,] 2 4 > L2$x [1] 1 2 3 4 5 6 > L2[1] $x [1] 1 2 3 4 5 6 2.4 R的数据结构 49 > L2[[1]] [1] 1 2 3 4 5 6 > L2[[1]][2] [1] 2 > L2$x[2] [1] 2 > L2$y[4] [1] 4 2.4.7 时间序列(ts)的建立 由函数ts( )通过一向量或者矩阵创建一个一元的或多元的时间序 列(time series), 它称为ts型对象,其调用格式为: ts(data = NA, start = 1, end = numeric(0), frequency = 1, 函数ts( )的调用格式 deltat = 1, ts.eps = getOption("ts.eps"), class, names) 函数ts( )可带一些表明序列特征的选项(其本身可使用缺省值), 它们是: data 一个向量或者矩阵 start 第一个观察值的时间,为一个数字或者是一个由两个整数 构成的向量(参见下面的例子) end 最后一个观察值的时间,指定方法和start相同 frequency 单位时间内观察值的频数(频率) deltat 两个观察值间的时间间隔(例如,月度数据的取值为1/12); frequency和deltat必须并且只能给定其中的一个 ts.eps 序列之间的误差限. 如果序列之间的频率差异小于ts.eps, 则认为这些序列的频率相等. class 对象的类型. 一元序列的缺省值是"ts",多元序列的缺省值 是c("mts", "ts") names 一个字符型向量,给出多元序列中每个一元序列的名称, 缺 省为data中每列数据的名称或者Series 1, Series 2, . . . 我们看几个用ts( )创建时间序列的一些例子: 50 第二章 R的基本原理与核心 > ts(1:10, start = 1959) Time Series: Start = 1959 End = 1968 Frequency = 1 [1] 1 2 3 4 5 6 7 8 9 10 > ts(1:47, frequency = 12, start = c(1959, 2)) Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1959 1 2 3 4 5 6 7 8 9 10 11 1960 12 13 14 15 16 17 18 19 20 21 22 23 1961 24 25 26 27 28 29 30 31 32 33 34 35 1962 36 37 38 39 40 41 42 43 44 45 46 47 > ts(1:10, frequency = 4, start = c(1959, 2)) Qtr1 Qtr2 Qtr3 Qtr4 1959 1 2 3 1960 4 5 6 7 1961 8 9 10 > ts(matrix(rpois(36,5),12,3), start=c(1961,1),frequency=12) Series 1 Series 2 Series 3 Jan 1961 8 5 4 Feb 1961 6 6 9 Mar 1961 2 3 3 Apr 1961 8 5 4 May 1961 4 9 3 Jun 1961 4 6 13 Jul 1961 4 2 6 Aug 1961 11 6 4 Sep 1961 6 5 7 Oct 1961 6 5 7 Nov 1961 5 5 7 Dec 1961 8 5 2 本书不讨论时间序列的统计分析, 有兴趣的可参考Zivot与Wang(2002). 2.5 数据的存储与读取 51 §2.5 数据的存储与读取 对于在文件读取和写入的工作,R使用工作目录来完成. 如果一个文件不 在工作目录里则必须给出它的路径. 可以使用命令getwd( )(获得工作目录)来 找到目录,使用命令setwd("C:/data")将当前的工作目录改变为C:\data(注 意R命令中目录的分割符使用正斜杠“/”或两个反斜杠“\\”). 工作目录的设 定也可通过“文件”菜单的“改变当前目录...”来完成7. 2.5.1 数据的存储 保存为文本文件 R软件中使用函数write.table( )或save( )在文件中写入一个对象,一 般是写一个数据框,也可以是其它类型的对象(向量、矩阵、数组、列表等). 我 们以数据框为例加以说明,例如数据框d是用下面的命令建立的: > d <- data.frame(obs = c(1, 2, 3), treat = c("A", "B", "A"), weight = c(2.3, NA, 9)) 1) 保存为简单的文本文件 > write.table(d, file = "c:/data/foo.txt", row.names = F, quote = F) 其中选项row.names = F表示行名不写入文件, quote = F表示变量名不 放在双引号中. 2) 保存为逗号分割的文本文件 > write.csv(d, file = "c:/data/foo.csv", row.names = F, quote = F) 3) 保存为R格式文件 > save(d, file = "c:/data/foo.Rdata") 在经过了一段时间的分析后, 常需要将工作空间的映像保存起来, 命令为 7如果不设定工作目录, 在读写文件时也可将目录直接写在file参数中. 52 第二章 R的基本原理与核心 > save.image( ) 实际上它等价于 > save(list =ls(all=TRUE), file=".RData") 我们了也可通过菜单“文件”下的“保存工作空间”来完成. 上述三个函 数的选项及具体使用请查看它们的帮助文件. 2.5.2 数据的读取 文本文件数据的读取 R可 以 用 下 面 的 函 数 读 取 存 储 在 文 本 文 件(ASCII)中 的 数 据: read.table( ), scan( )和read.fwf( ). 1) 使用函数read.table( ) 函数read.table( )用来创建一个数据框,所以它是读取表格形式的数 据的主要方法, 这一点我们在前一节已经提到. 我们再举一个例子, 先 在“c:\data”下建立文件houses.dat, 其内容为 Price Floor Area Rooms Age Cent.heat 01 52.00 111.0 830 5 6.2 no 02 54.75 128.0 710 5 7.5 no 03 57.50 101.0 1000 5 4.2 no 04 57.50 131.0 690 6 8.8 no 05 59.75 93.0 900 5 1.9 yes 则使用命令: > setwd("C:/data") > HousePrice <- read.table(file="houses.dat") 建立数据框HousePrice. 默认情况下,数值项(除了行标号)将被当作数 值变量读入. 非数值变量, 如例子中的Cent.heat, 将被作为因子读入. 如 果明确数据的第一行作为表头行, 则使用header选项: > HousePrice <- read.table("houses.dat", header=TRUE) 2.5 数据的存储与读取 53 除上面的基本形式外, read.table( )还有4个变形: read.csv( ), read.csv2( ), read.delim( ), read.delim2( ). 前二个读取用逗号 分割的数据; 后二个则针对使用其它分割符分割的数据(它们不使用行 号). 具体可参考read.table( )的帮助文件. 如果上面的文件在取消行号 后每一个数据项后加上逗号“,”, 并改名为house.csv, 则上述命令改为 > HousePrice <- read.csv("houses.csv", header=TRUE) 2) 使用函数scan( ) 函数scan( )比read.table( )要更加灵活,它们的区别之一是: scan( )可以指定变量的类型,例如我们先建立文件C:\data\data.dat: M 65 168 M 70 172 F 54 156 F 58 163 命令: > mydata <- scan("data.dat", what = list("", 0, 0)) 读取了文件data.dat中三个变量,第一个是字符型变量,后两个是数值 型变量. 其中第二个参数是一个名义列表结构,用来确定要读取的三个 向量的模式. 在名义列表中,我们可以直接命名对象. 例如 > mydata <- scan("data.dat", + what = list(Sex="", Weight=0, Height=0)) > mydata $Sex [1] "M" "M" "F" "F" $Weight [1] 65 70 54 58 $Height [1] 168 172 156 163 54 第二章 R的基本原理与核心 另一个重要的区别在于scan( )可以用来创建不同的对象: 向量、矩阵、 数据框、列表等. 在缺省情况下(即what被省略),scan( )将创建一个数 值型向量. 如果读取的数据类型与缺省类型或指定类型不符, 则将返回一 个错误信息. 更一般的说明可参考scan( )的帮助文件. 3) 使用函数read.fwf( ) 函数read.fwf( )可以用来读取文件中一些固定宽度格式的数据. 除了 选项widths用来说明读取字段的宽度外,其它选项与read.table( )基 本相同. 例如, 我们先建立文件C:\data\data.txt: A1.501.2 A1.551.3 B1.601.4 B1.651.5 C1.701.6 C1.751.7 命令: > mydata <- read.fwf("data.txt", widths=c(1, 4, 3), col.names=c("X","Y","Z")) 得到 X Y Z 1 A 1.50 1.2 2 A 1.55 1.3 3 B 1.60 1.4 4 B 1.65 1.5 5 C 1.70 1.6 6 C 1.75 1.7 更详细的说明可参考read.fwf( )的帮助文件. Excel数据的读取 有两种简单的方法获得Excel电子表格中的数据. 2.5 数据的存储与读取 55 1) 利用剪贴板 一种简单不过的方法是打开Excel中电子表格, 选中需要的数据区域, 再 复制到剪贴板中(使用CTRL+C). 然后在R中键入命令 > mydata <- read.delim("clipboard") 2) 使用程序包RODBC. 要得到文件"c:\data\body.xls"中工作表1(sheet1)中的数据,设为 Sex Weight Height M 65 168 M 70 172 F 54 156 F 58 163 可以使用命令 > library(RODBC) > z <- odbcConnectExcel("c:/data/body.xls") > foo <- sqlFetch(z, "Sheet1") > close(z) R中数据集的读取 1) R的标准数据datasets RR提供了一个基本的数据集包datasets, 其中包含了100多个数据集(通 常为数据框和列表). 它随着R的启动全部一次性自动载入, 通过命令 > data( ) 就可列出全部的数据集(包括已经通过library( )加载的其它程序包的 数据集). 输入数据集的名字或用help(dataname)就可看到你所关心的 数据集的信息. 2) 专用程序包中的数据集 要读取其他已经安装的专用程序包中的数据,可以使用package参数,例 如 56 第二章 R的基本原理与核心 > data(package="pkname") # pkname 为已安装的程序包的名字 就可以列出程序包pkname中的所有数据集, 但要注意的是它们还未被载 入到R系统中供浏览. 而命令 > data(dataname, package="pkname") 则载入程序包pkname中的名为dataname的数据集. 这时数据dataname的 信息就可通过其名字或help( )进行浏览. 用户发布的程序包是一个丰富 的数据集来源. 注意: 从上面的例子我们看到data( )有两个功能: 浏览数据列表和加载数 据集, 但可浏览到的数据集并不一定已经加载; 命令library( )用于加载程序包, 程序包加载后其函数可以使用, 但其中的数据集仍未载入, 仍需要使用data( )加载. 因此通常的做 法是逐个使用下面的命令 > library("pkname") > data( ) # 或 data(package="pkname") > data(dataname) # data(dataname,package="pkname") data(dataname)将从第一个能够找到data(dataname)的程序包中 载入这个数据集. 为避免载入同名的其它数据集, 加上package选项 是有必要的. 加载的数据集中的变量是不能直接按其名字参与运算的, 例如 在R刚启动后, 数据集mtcars中的变量mpg是无法直接按其名字浏 览与参与计算的. 例如要计算其平均值, 可以使用命令 > mean(mtcars$mpg) 得到20.09062. 另一个方法是使用命令attach(mtcars)将此数据集 挂接进来, 成为当前的数据集. 这时R就将这个数据集中的变量放到 一个临时的目录中供访问. 这时与上面命令等价的是 > attach(mtcars) > mean(mpg) [1] 20.09062 2.6 R 的图形功能 57 一个好的习惯是在不用此数据集时将它挂起(卸载,detach): > detach(mtcars) R格式的数据 R的数据或更为一般的对象(包括向量、数据框、列表、函数等)可以 通过save( )保存起来, 文件名以Rdata为后缀. 例如我们将mtcars中的变 量mpg和hp生成为数据框mtcars2, 并保存在文件myR.Rdata中: > attach(mtcars) > mtcars2 <- data.frame(mtcars[,c(1,4)]) > save(mtcars2, "c:/data/myR.Rdata") 而命令 > load("c:/data/myR.Rdata") 则可以重新加载进来. 涉及多个数据集的统计分析经常使用这种方法保存与加 载数据. 其它统计软件数据的读取 R也可以读取其它统计软件的数据文件(如SAS, SPSS, Stata, S-PLUS)和 访问SQL类型的数据库, 程序包foreign提供了这一便利. 由于它们仅对R的 高级应用有用, 我们在此不再细说, 具体可参考随机R同时发行的R data Import/Export手册. §2.6 R 的图形功能 R提供非常多样的绘图功能. 我们可以通过R提供的二组演示例子进行了 解: demo(graphics)为二维的图形示例; demo(persp)为三维的图形示例. 58 第二章 R的基本原理与核心 我们在这里不可能详细说明R软件在绘图方面的所有功能,主要是因为每个绘 图函数都有大量的选项,使得图形的绘制十分的灵活多变. 绘图函数的工作方式与本文前面描述的工作方式大为不同,不能把绘图函 数的结果赋给一个对象8,其结果将直接输出到一个“绘图设备”上. 绘图设备 是一个绘图的窗口或是一个文件. 在R中有两种绘图函数: 1) 高级绘图函数(high-level plotting functions)创建一个新的图形 2) 低级绘图函数(low-level plotting functions)在现存的图形上添加元素. 另外绘图参数(graphical parameters)提供了丰富的绘图选项,可以使用缺省值 或者用函数par( )修改. 更高级的图形可使用grid 和lattice 绘图包实现, 具 体可查看其中的说明文档. Paul Murrell(2006)系统地介绍了R中作图方法 和例子. 2.6.1 绘图函数 表2.3概括了R中的高级绘图函数. 图 2.3 高级绘图函数 函数名 功能 plot(x) 以x的元素值为纵坐标、以序号为横坐标绘图 plot(x, y) x(在x-轴上)与y(在y-轴上)的二元作图 sunflowerplot(x, y) 同上, 但是以相似坐标的点作为花朵,其花瓣数目为点的个数 pie(x) 饼图 boxplot(x) 盒形图(“box-and-whiskers”) stripchart(x) 把x的值画在一条线段上,样本量较小时可作为盒形图的替代 coplot(x~y | z) 关于z的每个数值(或数值区间)绘制x与y的二元图 8有一些值得注意的例外: hist( )和barplot( )仍然把生成的数据结果作为列表或矩阵. 2.6 R 的图形功能 59 interaction.plot (f1, f2, y) 如果f1和f2是因子,作y的均值图,以f1的不同值作为x轴,而f2的不 同值对应不同曲线;可以用选项fun指定y的其他的统计量(缺省计算 均值,fun=mean) matplot(x,y) 二元图,其中x的第一列对应y的第一列,x的第二列对应y的第二列, 依次类推. dotchart(x) 如果x是数据框,作Cleveland点图(逐行逐列累加图) fourfoldplot(x) 用四个四分之一圆显示2times2列联表情况(x必须是dim=c(2, 2, k)的数组,或者是dim=c(2, 2)的矩阵,如果k 1) assocplot(x) Cohen–Friendly图,显示在二维列联表中行、列变量偏离独立性的 程度 mosaicplot(x) 列联表的对数线性回归残差的马赛克图 pairs(x) 如果x是矩阵或是数据框,作x的各列之间的二元图 plot.ts(x) 如果x是类"ts"的对象,作x的时间序列曲线,x可以是多元的,但是 序列必须有相同的频率和时间 ts.plot(x) 同上,但如果x是多元的,序列可有不同的时间但须有相同的频率 hist(x) x的频率直方图 barplot(x) x的值的条形图 qqnorm(x) 正态分位数-分位数图 qqplot(x, y) y对x的分位数-分位数图 contour(x, y, z) 等高线图(画曲线时用内插补充空白的值),x和y必须为向量,z必须为 矩阵,使得dim(z)=c(length(x), length(y)) (x和y可以省略) filled.contour (x, y, z) 同上,等高线之间的区域是彩色的,并且绘制彩色对应的值的图例 image(x, y, z) 同上,但是实际数据大小用不同色彩表示 persp(x, y, z) 同上,但为透视图 stars(x) 如果x是矩阵或者数据框,用星形和线段画出 symbols(x, y, ...) 在由x和y给定坐标画符号(圆,正方形,长方形,星,温度计式或者盒 形图),符号的类型、大小、颜色等由另外的变量指定 termplot(mod.obj) 回归模型(mod.obj)的(偏)影响图 60 第二章 R的基本原理与核心 R的绘图函数的部分选项是一样的. 下面列出主要的共同选项及其缺省值: 选项 功能 add=FALSE 如果是TRUE,叠加图形到前一个图上(如果有的话) axes=TRUE 如果是FALSE,不绘制轴与边框 type="p" 指定图形的类型,"p": 点,"l": 线,"b": 点连线,"o": 同 上,但是线在点上,"h": 垂直线,"s": 阶梯式,垂直线顶端 显示数据,"S": 同上,但是在垂直线底端显示数据 xlim=, ylim= 指定轴的上下限,例如xlim=c(1, 10)或者xlim=range(x) xlab=, ylab= 坐标轴的标签,必须是字符型值 main= 主标题,必须是字符型值 sub= 副标题(用小字体) 2.6.2 低级绘图命令 R的低级作图命令作用于现存的图形上的, 下表给出了一些主要的: 函数名 功能 points(x, y) 添加点(可以使用选项type=) lines(x, y) 同上,但是添加线 text(x, y, labels, ...) 在(x,y)处 添 加 用labels指 定 的 文 字; 典 型 的 用 法 是: plot(x, y, type="n"); text(x, y, names) mtext(text, side=3, line=0, ...) 在边空添加用text指定的文字,用side指定添加到哪一边(参照下面的axis( ));line指定添加的文字距离绘图区域的行数 segments(x0, y0, x1, y1) 从(x0,y0)各点到(x1,y1)各点画线段 2.6 R 的图形功能 61 arrows(x0, y0, x1, y1, angle= 30, code=2) 同上, 但加画箭头. 如果code=2, 则在各(x0,y0)处画箭头; 如果code=1, 则在 各(x1,y1)处画箭头; 如果code=3, 则在两端都画箭头angle控制箭头轴到箭头 边的角度. abline(a,b) 绘制斜率为b和截距为a的直线 abline(h=y) 在纵坐标y处画水平线 abline(v=x) 在横坐标x处画垂直线 abline(lm.obj) 画由lm.obj确定的回归线 rect(x1, y1, x2, y2) 绘制长方形,(x1, y1)为左下角,(x2,y2)为右上角 polygon(x, y) 绘制连接各x,y坐标确定的点的多边形 legend(x, y, legend) 在点(x,y)处添加图例,说明内容由legend给定 title( ) 添加标题,也可添加一个副标题 axis(side, vect) 画坐标轴. side=1时画在下边; side=2时画在左边; side=3时画在上边; side=4时画在右边. 可选参数at指定画刻度线的位置坐标 box( ) 在当前的图上加上边框 rug(x) 在x-轴上用短线画出x数据的位置 locator(n, type="n", ...) 在用户用鼠标在图上点击n次后返回n次点击的坐标(x, y);并可以在点击处绘 制符号(type="p"时)或连线(type="l"时),缺省情况下不画符号或连线 注意: 用 > text(x, y,expres\-sion(...)) 可以在一个图形上加上数学公式,函数expression把自变量转换为数学公式. 例如, > text(x, y, expression(p==over(1,1+e^-(beta*x+alpha)))) 在图中相应坐标点px, yq处显示下面的方程: p 1 1 epβx αq . 62 第二章 R的基本原理与核心 为了能在表达式中代入某个变量的值,我们可以使用函数substitute( )和as.expression( ). 例如,为了代入R2的值(之前计算并储存在对 象Rsquared中) > text(x, y, as.expression(substitute(R^2==r, list(r=Rsquared)))) 在图中相应坐标点px, yq处显示: R2 0.9856298. 如果只显示3位小数,上述命令修改为: > text(x, y, as.expression(substitute(R^2==r, list(r=round(Rsquared, 3))))) 它将显示: R2 0.986. 最后,用斜体字显示R2,命令为 > text(x, y, as.expression(substitute(italic(R)^2==r, list(r=round(Rsquared, 3))))) 得到 R2 0.986. 2.6.3 绘图参数 除了低级作图命令之外,图形的显示也可以用绘图参数来改良. 绘图参数 可以作为图形函数的选项(但不是所有参数都可以这样用),也可以用函数par( )来永久地改变绘图参数,也就是说后来的图形都将按照函数par( )指定的参 数来绘制. 例如,下面的命令: > par(bg="yellow") 将导致后来的图形都以黄色的背景来绘制. 有73个绘图参数,其中一些有非常 相似的功能. 这些参数详细的列表可以通过help(par)获得. 下面的表格只列 举了最常用的参数. 2.6 R 的图形功能 63 参数 功能 adj 控制关于文字的对齐方式: 0是左对齐,0.5是居中对齐,1是右对齐,值¡ 1时对齐位置在文本右 边的地方,取负值时对齐位置在文本左边的地方;如果给出两个值(例如c(0, 0)),第二个只控 制关于文字基线的垂直调整 bg 指定背景色(例如bg="red", bg="blue"; 用colors( )可以显示657种可用的颜色名) bty 控制图形边框形状,可用的值为: "o", "l", "7", "c", "u" 和"]" (边框和字符的外表相像);如 果bty="n"则不绘制边框 cex 控制缺省状态下符号和文字大小的值;另外,cex.axis控制坐标轴刻度数字大小, cex.lab控制 坐标轴标签文字大小, cex.main控制标题文字大小, cex.sub控制副标题文字大小 col 控制符号的颜色;和cex类似,还可用:col.axis, col.lab, col.main, col.sub font 控制文字字体的整数(1: 正常,2: 斜体,3: 粗体,4: 粗斜体);和cex类似,还可用: font.axis, font.lab, font.main, font.sub las 控制坐标轴刻度数字标记方向的整数(0: 平行于轴,1: 横排,2: 垂直于轴,3: 竖排) lty 控制连线的线型,可以是整数(1: 实线,2: 虚线,3: 点线,4: 点虚线,5: 长虚线,6: 双虚线), 或者是不超过8个字符的字符串(字符为从"0"到"9"之间的数字) 交替地指定线和空白的长度, 单位为磅(points)或象素,例如lty="44"和lty=2效果相同 lwd 控制连线宽度的数字 mar 控制图形边空的有4个值的向量c(bottom, left, top, right), 缺省值为c(5.1, 4.1, 4.1, 2.1) mfcol c(nr,nc)的向量,分割绘图窗口为nr行nc列的矩阵布局,按列次序使用各子窗口 mfrow 同上,但是按行次序使用各子窗口 pch 控制符号的类型,可以是1到25的整数,也可以是""里的单个字符(见图 2.4) ps 控制文字大小的整数,单位为磅(points) pty 指定绘图区域类型的字符,"s": 正方形,"m":最大利用 tck 指定轴上刻度长度的值,单位是百分比,以图形宽、高中最小一个作为基数;如果tck=1则绘 制grid tcl 同上,但以文本行高度为基数(缺省下tcl=-0.5) xaxt 如果xaxt="n"则设置x-轴但不显示(有助于和axis(side=1, ...)联合使用) yaxt 如果yaxt="n"则设置y-轴但不显示(有助于和axis(side=2, ...)联合使用) 64 第二章 R的基本原理与核心 * ? X a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 "*" "?" "." "X" "a" 图 2.4 R (pch=1:25)的绘图符号. 用选项col="blue", bg="yellow"来产生 如上的颜色,其中背景色选项只对符号21–25有作用. 可以使用任意字符作为 绘点符号(pch="*", "?", ".", . . . ). 2.6.4 一个实例 这一小节我们仍以R软件的内嵌数据Puromycin来说明R软件中基本的会 图方法. Puromycin的结构如下: > dim(Puromycin) [1] 23 3 > head(Puromycin) conc rate state 1 0.02 76 treated 2 0.02 47 treated 3 0.06 97 treated 4 0.06 107 treated 5 0.11 123 treated 6 0.11 139 treated 2.6 R 的图形功能 65 简单的散点图(scatterplot) 对于状态(state)为treated, 画出rate关于cone的散点图, 见图2.5: > PuroA <- subset(Puromycin, state == "treated") > plot(rate ~ conc, data = PuroA) 0.0 0.2 0.4 0.6 0.8 1.0 50 10 0 15 0 20 0 conc ra te 图 2.5 简单的散点图 0.0 0.2 0.4 0.6 0.8 1.0 50 10 0 15 0 20 0 conc ra te 图 2.6 使用彩色符号散点图 指明所用的数据集 有三种方法指明函数plot( )使用的数据集: 1) plot( )函数中使用data选项; 2) 在with( )中使用plot( ); > with(PuroA, plot(conc, rate)) 3) 使用$ 直接指向数据与变量 > plot(PuroA$rate, PuroA$conc) 美化图形 1) R提供了25种不同的符号和8种不同的颜色,浏览它们的命令是: 66 第二章 R的基本原理与核心 > u <- 1:25 > plot(u ~ 1, pch = u, col = u, cex = 3) 2) 选择合适的符号及其大小与颜色. 例如图2.6是由图2.5选用绿色(选项 为col=4或col="blue") 小三角形(选项为pch=2或pch="T")得到的, 大小 为cex=2.5倍缺省值, 其命令为: > plot(rate ~ conc, data = PuroA, pch = 2, col = 4, cex = 2.5) 3) 坐标轴与标题设定. 命令 > plot(rate ~ conc, data = PuroA, pch = 2, col = 4, cex = 2.5, xlim = c(0, 1.2), ylim = c(40, 210), ylab = "Concentration", xlab = "Rate", cex.lab = 2) > title(main = "Puromycin", cex.main = 3) 得到图2.7, 它做的工作有: 限定X轴范围为0 到1.2, Y轴范围为40 到210 X轴标为“Rate”, Y轴标为“Concentration” 规定坐标轴标签大小(cex.lab=1.2) 增加图题 主图添线 1) 连接数据点. 命令 > library(doBy) # 需要先安装 > PuroA.mean <- summaryBy(rate ~ conc, data = PuroA, FUN = mean) > plot(rate ~ conc, data = PuroA, pch = 16, col = 4, cex = 1.5) > points(mean.rate ~ conc, data = PuroA.mean, col = "cyan", lwd = 10, pch = "x") > lines(mean.rate ~ conc, data = PuroA.mean, col = "blue") 2.6 R 的图形功能 67 0.0 0.2 0.4 0.6 0.8 1.0 1.2 50 10 0 15 0 20 0 Rate C on ce nt ra tio n Puromycin 图 2.7 设定坐标轴与标题 0.0 0.2 0.4 0.6 0.8 1.0 50 10 0 15 0 20 0 conc ra te x x x x x x 图 2.8 散点联线 得到图2.8, 它做的工作有: 使用doBy包的summaryBy( )计算每一浓度(concentration)处的平均 值 在每一浓度的平均值处作点 用直线连接这些点 2) 添加局部多项式拟合线. locfit( )由局部多项式包locfit提供(需要安 装). 其参数nn为光滑化参数, 用于指明曲线的光滑程度; 参数deg指明所 使用的局部光滑的多项式的次数. 下面的命令给出了二条光滑曲线(见 图2.9): plot(rate ~ conc, data = PuroA) smooth1 <- with(PuroA, lowess(rate ~ conc, f = 0.9)) smooth2 <- with(PuroA, lowess(rate ~ conc, f = 0.3)) lines(smooth1, col = "red") lines(smooth2, col = "blue") 3) 添加多项式拟合线. 下面的命令给出了一次、二次和三次多项式拟合(见 图2.10): > m1 <- lm(rate ~ conc, data = PuroA) > m2 <- lm(rate ~ conc + I(conc^2), data = PuroA) 68 第二章 R的基本原理与核心 0.0 0.2 0.4 0.6 0.8 1.0 50 10 0 15