《R语言编程艺术》——1.5 扩展案例:考试成绩的回归分析

1.5 扩展案例:考试成绩的回归分析

在接下来的案例中,我们会从头到尾进行一个简单的统计回归分析。这个例子实际上没有多少编程技术,不过它说明了如何使用前面提到的一些数据结构,包括R的S3对象。同样,它在后面的章节里也充当了编程案例的基础。
ExamsQuiz.txt文件包含了我所教班级的成绩。下面是该文件的前几行:

数字表示的是学生成绩的学分绩点。比如绩点3.3对应的就是平常所说的B+。每一行包含的是一个学生的数据,由期中考试成绩、期末考试成绩和平均小测验成绩组成。此例的兴趣点在于用期中考试成绩和平均小测验成绩来预测期末成绩。
先来读入数据文件。

这个数据文件的第一行不是记录的变量名,也就是说没有表头行,所以在函数调用中设定header=FALSE。这是前文提到过的关于默认参数的一个例子。实际上,表头参数的默认值已经是FALSE了(关于这一点,可以在R里查看函数read.table()的在线帮助),所以没必要做前面那样的设定,不过这样做会更明了。
数据现在在examsquiz中,它是数据框类的R对象。

由于缺少数据表头行,R自动把列名设置为V1、V2和V3。行号出现在每行的最左边。可能你会觉得数据文件有表头比较好,用有意义的名称(比如Exam1)来标识变量。在后面的例子中,我们通常会设定变量名。
我们来用期中考试成绩(examsquiz的第一列)预测期末考试成绩(examsquiz的第二列):

这里调用lm()函数(lm是linear model的缩写),让R拟合下面的预测方程:
期末考试成绩预测值=β0+β1×期中考试成绩
其中,β0和β1都是用本例的数据估计出来的常数。换句话说,我们用数据中的数对(期中考试成绩,期末考试成绩)拟合了一条直线。拟合过程是用经典的最小二乘法来完成的。(如果你没有相关的背景知识也不用担心。)
注意,存储在数据框第一列的期中考试成绩是用examsquiz[,1]表示,省略了第一维的下标(代表行号)表示我们引用的是数据框的一整列。期末考试也是用类似的方式引用的。这样,我们调用上面的lm()命令,利用examsquiz的第一列来预测第二列。
也可以这样写:

前面提到过,数据框是种各元素都为向量的列表。在这里,各列是列表的组件V1、V2和V3。
lm()的返回结果现在是保存于变量lma中的对象。它是lm类的一个实例。可以调用attributes()函数列出它的所有组件。

和往常一样,调用str(lma)可以得到lma的更详细说明。βi的估计值保存在lma$coefficients中。在命令提示符下键入系数的变量名就可以显示系数。
在键入组件名时也可以使用缩写形式,只要缩写后的组件名不发生混淆即可。例如,如果一个列表由组件xyz、xywa和xbcde构成,则第二个和第三个组件的名称可以分别缩写为xyw和xb。因此我们可以键入下面的命令:

因为lma$coefficients是一个向量,所以比较容易打印。但是当打印对象lma本身的时候是这样的:

为什么R只打印出这些项,而没有打印出lma的其他组件?这个问题的答案是,R在这里使用的print()函数是另一个泛型函数的例子,作为一个泛型函数,print()实际上把打印的任务交给了另一个函数——print.lm(),这个函数的功能是打印lm类的对象,即上面函数展示的内容。
可以用前面讨论过的泛型函数summary()打印输出lma的更详细的内容。它实际上在后台调用了summary.lm(),得出针对某个特定回归模型的摘要:

许多其他泛型函数都是针对这个类定义的。可以查看在线帮助来获取关于lm()的更多细节。(1.7节将讨论如何使用R的在线文档。)
要用期中考试成绩和测验成绩预测期末考试成绩,可以使用记号+。

注意,+号并不表示计算两个量的和。它仅仅是预测变量(predictor variable)的分隔符。

时间: 2024-12-21 22:23:47

《R语言编程艺术》——1.5 扩展案例:考试成绩的回归分析的相关文章

《R语言编程艺术》——导读

前言 R是一种用于数据处理和统计分析的脚本语言,它受到由AT&T实验室开发的统计语言S的启发,且基本上兼容于S语言.S语言的名称代表统计学(statistics),用来纪念AT&T开发的另一门以一个字母命名的编程语言,这就是著名的C语言.后来一家小公司买下了S,给它添加了图形用户界面并命名为S-Plus. 由于R是免费的,而且有更多的人贡献自己的代码,R语言变得比S和S-Plus更受欢迎.R有时亦称为GNU S,以反映它的开源属性.(GNU项目是开源软件的一个重要集合.) 为什么在统计工作

《R语言编程艺术》——1.3 函数入门

1.3 函数入门 和大多数编程语言一样,R语言编程的核心是编写"函数".函数就是一组指令的集合,用来读取输入.执行计算.返回结果.我们先定义一个函数oddcount(),以此简单介绍函数的用法.这个函数的功能是计算整数向量中奇数的个数.一般情况下,我们会用文本编辑器编写好函数代码并保存在文件中,不过在这个简单粗略的例子中,我们只需要在R的交互模式中一行行输入代码.接下来,我们还会在几个测试案例中调用这个函数: 首先,我们告诉R想定义一个名为oddcount的函数,该函数有一个参数x.左

《R语言编程艺术》——2.9 向量化的ifelse()函数

2.9 向量化的ifelse()函数 除了多数语言中常见的if-then-else结构,R还有一个向量化的版本:ifelse()函数.它的形式如下: 其中b是一个布尔值向量,而u和v是向量. 该函数返回的值也是向量,如果b[i]为真,则返回值的第i个元素为u[i],如果b[i]为假,则返回值的第i个元素为v[i].这一概念相当抽象,因此我们看一个例子: 在这里,我们希望产生一个向量,这个向量在x中对应元素为偶数的位置取值是5,且在x中对应元素为奇数的位置取值12.因此,对应到形式参数b的实际参数

《R语言编程艺术》——3.4 增加或删除矩阵的行或列

3.4 增加或删除矩阵的行或列 严格来说,矩阵的长度和维度是固定的,因此不能增加或删除行或列.但是可以给矩阵重新赋值,这样可以得到和增加或删除一样的效果.3.4.1 改变矩阵的大小 回忆之前通过重新赋值改变向量大小的方法: 第一个例子里,x原来长度为5,通过拼接和重新赋值,将其长度变为6.事实上我们没有改变x的长度,而是生成一个新的向量,然后赋值给x. 注意 重新赋值的过程可能会在用户看不见的情况下进行,在14章我们将会介绍.例如,即使是x[2]<-12这种小操作事实上都是一个重新赋值的过程.

《R语言编程艺术》——2.4 常用的向量运算

2.4 常用的向量运算 接下来将介绍一些常用的向量运算,包括算术和逻辑运算.向量索引以及一些创建向量的有用方法.然后将给出两个使用这些运算的扩展案例.2.4.1 向量运算和逻辑运算记住R是一种函数式语言,它的每一个运算符,包括下例中的+,实际上也是函数. 再回顾一次,标量实际上是一元向量,因此向量也可以相加,+算子按元素逐一进行运算. 如果你熟悉线性代数,当将两个向量相乘时,你也许会对所发生的感到惊讶. 但请记住,由于*函数的使用方式,实际上是元素和元素相乘.上例结果中的第一个元素5,是x的第一

《R语言编程艺术》——3.2 一般矩阵运算

3.2 一般矩阵运算 前面介绍了创建矩阵的基本方法,现在我们来看一些常用的矩阵运算,包括线性代数运算.矩阵索引和矩阵元素筛选.3.2.1 线性代数运算 你可以对矩阵进行各种线性代数运算,比如矩阵相乘.矩阵数量乘法和矩阵加法.针对以前例子中的y,以下为这三种运算的实例: 关于矩阵线性代数运算的更多细节请参见8.4节.3.2.2 矩阵索引 2.4.2节中的向量运算同样适用于矩阵,例如: 这里我们提取了矩阵z中第2.3列的所有元素组成了一个子矩阵. 下面的例子提取的是矩阵的行: 还可以对一个矩阵的子矩

《R语言编程艺术》——3.3 对矩阵的行和列调用函数

3.3 对矩阵的行和列调用函数 *apply()函数系列是R中最受欢迎同时也是最常用的,该函数系列包括apply().tapply()和lapply().这里我们主要介绍apply().apply()函数允许用户在矩阵的各行或各列上调用指定的函数.3.3.1 使用apply()函数以下是apply()函数的一般形式: 参数解释如下:m 是一个矩阵.dimcode 是维度编号,若取值为1代表对每一行应用函数,若取值为2代表对每一列应用函数.f是应用在行或列上的函数.fargs是f的可选参数集.例如

《R语言编程艺术》——第2章 2.0 向量

第2章 2.0 向量 R语言最基本的数据类型是向量(vector).第1章已经给出了向量的一些例子,本章将详细介绍向量.首先考察向量与R语言的其他数据类型之间的关系.与C语言家族不同,R语言中,单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例.而另一方面,R语言中矩阵是向量的一种特例,这一点与C语言家族相同.接下来我们会用大量时间关注以下话题:循环补齐:在一定情况下自动延长向量.筛选:提取向量子集.向量化:对向量的每一个元素应用函数.这些运算是R编程的核心,在本书的其他部分也会经常提

《R语言编程艺术》——2.1 标量、向量、数组与矩阵

2.1 标量.向量.数组与矩阵 在许多编程语言中,向量与标量(即单个数值)不同.例如,考虑下面的C代码: 这段代码请求编译器给一个x的整型变量x分配空间,并给一个名为y的三元素整型数组(C语言中的术语,类似于R中的向量)分配内存空间.但在R中,数字实际上被当做一元向量,因为数据类型里没有标量.R语言中变量类型称为模式(mode).回顾第1章,同一向量中的所有元素必须是相同的模式,可以是整型.数值型(浮点数).字符型(字符串).逻辑型(布尔逻辑).复数型等等.如果在程序中查看变量x的类型,可以调用