S语言是由AT&T贝尔实验室开发的一种用来进行数据探索、统计分析、作图的解释型语言。它的丰富的数据类型(向量、数组、列表、对象等)特别有利于实现新的统计算法,其交互式运行方式及强大的图形及交互图形功能使得我们可以方便的探索数据。
目前S语言的实现版本主要是S-PLUS。它基于S语言,并由MathSoft公司的统计科学部进一步完善。作为统计学家及一般研究人员的通用方法工具箱,S-PLUS强调演示图形、探索性数据分析、统计方法、开发新统计工具的计算方法,以及可扩展性。
S-PLUS可以直接用来进行标准的统计分析得到所需结果,但是它的主要的特点是它可以交互地从各个方面去发现数据中的信息,并可以很容易地实现一个新的统计方法。
S-PLUS有微机版本和工作站版本,它是一个商业软件。Auckland大学的Robert Gentleman 和 Ross Ihaka 及其他志愿人员开发了一个R系统,其语法形式与S语言基本相同,但实现不同,两种语言的程序有一定的兼容性。R是一个GPL自由软件,现在的版本是1.00版,它比S-PLUS 还少许多功能,但已经具有了很强的实用性。我们在这里尽量介绍S-PLUS和R都能使用的功能,且以R为主。下面我们用S统称S-PLUS和R。
S的基本界面是一个交互式命令窗口,命令提示符是一个大于号,命令的结果马上显示在命令下面。S命令主要有两种形式:表达式或赋值运算(用<-表示)。在命令提示符后键入一个表达式表示计算此表达式并显示结果。赋值运算把赋值号右边的值计算出来赋给左边的变量。可以用向上光标键来找回以前运行的命令再次运行或修改后再运行。
S是区分大小写的,所以x和X是不同的名字。
我们用一些例子来看S-PLUS的特点。假设我们已经进入了S-PLUS(或R)的交互式窗口。如果没有打开的图形窗口,在R中,用:
> x11()
在S-PLUS Windows版中用:
> win.graph()
可以打开一个作图窗口。然后,输入以下语句:
> x1 <- 0:100 > x2 <- x1*2*pi/100 > y <- sin(x2) > plot(x,y, type='l')
这些语句可以绘制正弦曲线图。其中,“<-”是赋值运算符。0:100表示一个从0到100 的等差数列向量。从第二个语句可以看出,我们可以对向量直接进行四则运算,计算得到的x2 是向量x1的所有元素乘以常数2*pi/100的结果。从第三个语句可以看到函数可以以向量为输入,并可以输出一个向量,结果向量y的每一个分量是自变量x2的每一个分量的正弦函数值。从最后一个语句可以看出函数的调用也很自由,可以按位置给出自变量,也可以用“自变量名=”的形式指定自变量值,这样可以使用缺省值。
下面我们看一看S的统计功能。
> marks <- c(10, 6, 4, 7, 8) > mean(marks) [1] 7 > sd(marks) [1] 2.236068 > median(marks) [1] 7 > min(marks) [1] 4 > max(marks) [1] 10 > boxplot(marks) >
第一个语句输入若干数据到一个向量,函数c()用来把数据组合为一个向量。后面用了几个函数来计算数据的均值、标准差、中位数、最小值、最大值。最后的函数绘制数据的盒形图。例中sd()是R中才有的函数,在S-PLUS中要用sqrt(var())来计算。在S命令方式中要显示一个表达式的值只要键入它。
为了演示S的回归计算,我们把SAS中的例子数据SASUSER.CLASS输出到了一个文本文件CLASS.TXT,SAS程序如下:
data _null_; set sasuser.class; file 'class.txt'; put name sex age height weight; run;
我们在R中把这个文件读入为为一个数据框(data frame,相当于SAS中的数据集),并进行回归,绘制数据散点图和回归直线。假设图形窗口已经打开,程序及结果如下:
> cl <- read.table("c:/work/class.txt", + col.names=c("Name", "Sex", "Age", "Height", "Weight")) > cl
Name Sex Age Height Weight 1 Alice F 13 56.5 84.0 2 Becka F 13 65.3 98.0 3 Gail F 14 64.3 90.0 4 Karen F 12 56.3 77.0 5 Kathy F 12 59.8 84.5 6 Mary F 15 66.5 112.0 7 Sandy F 11 51.3 50.5 8 Sharon F 15 62.5 112.5 9 Tammy F 14 62.8 102.5 10 Alfred M 14 69.0 112.5 11 Duke M 14 63.5 102.5 12 Guido M 15 67.0 133.0 13 James M 12 57.3 83.0 14 Jeffrey M 13 62.5 84.0 15 John M 12 59.0 99.5 16 Philip M 16 72.0 150.0 17 Robert M 12 64.8 128.0 18 Thomas M 11 57.5 85.0 19 William M 15 66.5 112.0 > attach(cl) > plot(Height, Weight) > fit1 <- lm(Weight ~ Height) > fit1 Call: lm(formula = Weight ~ Height) Coefficients: (Intercept) Height -143.02692 3.89903 > abline(fit1) >
结果可以产生图1。我们从这个例子可以看到,分析由函数完成,结果也是对象,可以作为进一步分析的输入。
S-PLUS也提供了一般的计算功能。比如,求一个矩阵的逆:
> A <- matrix(c(1,2, 7,3), ncol=2, byrow=T) > A [,1] [,2] [1,] 1 2 [2,] 7 3 > Ai <- solve(A) > Ai [,1] [,2] [1,] -0.2727273 0.18181818 [2,] 0.6363636 -0.09090909
还可以进行矩阵运算,如:
> b <- c(2,3) > x <- Ai %*% b > x [,1] [1,]-2.220446e-016 [2,] 1.000000e+000 >
这实际上是解了一个线性方程组。“%*%”表示矩阵乘法。
可以把若干行命令保存在一个文本文件(比如C:\WORK\MYPROG.S)中,然后用source 函数来运行整个文件:
> source("C:\\WORK\\MYPROG.S")
注意字符串中的反斜杠要写成两个。用sink()函数可以把以后的输出从屏幕窗口转向到一个外部文本文件,例如:
> sink("C:\\WORK\\MYPROG.OUT")
要恢复输出到屏幕窗口,使用:
> sink()
在S中可以用“?”号后面跟要查询的函数来显示帮助信息,例如
> ?c
> ?"=="
(查询特殊符号要用撇号括起来)。另外,在MS Windows版的S-PLUS中可以用Windows帮助来得到帮助,而在R中可以用HTML浏览器来查询帮助(用“help.start()函数或Help | R language (html)”启动)。用好S语言重要的一点就是要用熟系统的帮助功能,因为S的教材或手册都不能列出所有的细节,如果列出所有细节则过于繁琐了。
要退出S-PLUS或R,可以用q()函数,也可以用菜单命令。R在退出时提问是否保存当前工作空间,它可以把当前定义的所有对象(有名字的向量、矩阵、列表、函数等)保存到一个文件。S-PLUS自动把对象保存到一个子目录,子目录中每一个文件保存一个对象。