内容


在 SPSS Statistics 和 Modeler 中调用 R 语言的实现和应用

Comments

1. 简介

R 语言是一个开源的数据分析环境,是由 Robert Gentleman 和 Ross Ihaka 两位统计学家于 1992 年建立,用以更好的进行统计计算和绘图。R 语言的安装包较小,由于 R 可以通过安装扩展包(Packages)而得到增强,所以其功能已经远远不限于统计分析和绘图。目前 R 有四千多个包,分布在统计、金融、经济、实验设计、机器学习、社会科学、空间数据分析、大数据高性能运算、图形展示、可重复报告生成等将近 30 个大的领域,R 语言的另外一个优势在于可以快速的以包的形式跟踪新的统计学等其他学科新的方法和思想,只需加载写好的包,就可以把新的方法和思想用到实践中。

SPSS Statistics 最早在版本 14 时就提供了可编程扩展模块来实现嵌入 Python、R 语言或 .NET 的编程控制。当前提供的最早 R 语言接口软件包为 2011 年注册 SourceForge 的一个开源项目 (Peck, 2011),能够将 R 集成到 SPSS Statistics 18。随后的版本 19、20、21,以及目前的 22 都移到了 IBM 的开发网站 (IBM),随着 Statistics 的升级而推出相应的新版本。进一步,通过在 SPSS Modeler 中使用 SPSS Statistics 节点的方式,又能将 R 语言很容易地引入到 Modeler 的建模设计中。这样,我们就能够在 SPSS 的环境中很方便利用 R 语言的一些特点来完善我们的研究和工作,特别是 R 所提供的各种新兴的统计、分析和挖掘的算法和技术,以及更加绚丽和富有创意的图形展示。

本文将介绍在 SPSS Statistics 和 SPSS Modeler 中融入 R 语言的方式和过程,而主要以实例展示通过调用 R 语言来拓展 SPSS Statistics 和 SPSS Modeler 的计算分析和绘图演示的功能,从而充分地结合了 SPSS 的专业集成、便捷使用和 R 语言的灵活易扩展、绘图丰富的各自优势。

2. SPSS 调用 R 语言的方法

这节介绍在 SPSS Statistics 和在 SPSS Modeler 调用 R 语言的方法,重点是前者的实现。而后者需要在前者已有的环境中,使用 SPSS Statistics 输出节点实现,也就是说在 SPSS Modeler 中调用 R 语言,也必须先安装 SPSS Statistics 软件。

2.1 SPSS Statistics 调用 R 语言的实现方式

首先是环境的准备。在已经安装了 SPSS Statistics 和 R 语言的环境中,需要新安装软件包 SPSS Statistics Essentials for R 来实现在 SPSS Statistics 中调用 R 语言。这个新的软件包就像一座桥梁将两个统计分析软件联系起来。

图 1. 用 Essentials for R 连接 R 语言和 SPSS Statistics
图 1. 用 Essentials for R 连接 R 语言和 SPSS Statistics
图 1. 用 Essentials for R 连接 R 语言和 SPSS Statistics

但应注意的是,针对不同的 SPSS Statistics 版本,需要有相对应的 R 语言版本和 SPSS Statistics Essentials for R 版本来匹配,其关系参照如下表格 :

表 1. SPSS Statistics 和 R 语言版本匹配表
表 1. SPSS Statistics 和 R 语言版本匹配表
表 1. SPSS Statistics 和 R 语言版本匹配表

注:
1.前四个版本需要在IBM官网:https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=swg-tspssp下载
2.最后一个版本需要在http://sourceforge.net/projects/ibmspssstat/下载

本文以下都以 Windows 操作系统中,使用 SPSS Statistics 22, R 2.15.3 和 SPSS Statistics Essentials for R 22.0.0 为例来讲解。安装 SPSS Statistics Essentials for R 软件包时会要求输入已有的 SPSS Statistics 和 R 语言环境,并建立联系。下面我们就来介绍在 SPSS Statistics 中调用 R 的最简单实现过程。

第 1 步:通过 SPSS Statistics 菜单:文件 --> 新建 --> 语法,打开 语法编辑器

图 2. 调用 R 的第 1 步——使用语法编辑器
图 2. 调用 R 的第 1 步——使用语法编辑器
图 2. 调用 R 的第 1 步——使用语法编辑器

第 2 步:在编辑框中输入对应的语法脚本,遵循结构为:

代码 1. 嵌入 R 代码的基本语法结构
BEGIN PROGRAM R. 
……
 中间为R代码
……
END PROGRAM

如下图所示:

图 3. 调用 R 的第 2 步——在语法框中输入脚本
图 3. 调用 R 的第 2 步——在语法框中输入脚本
图 3. 调用 R 的第 2 步——在语法框中输入脚本

第 3 步:选取这段语法,执行菜单的:运行 --> 选择,或点击图标绿色三角,或执行快捷命令 Ctrl+R, R 代码分析的结果就会在 SPSS Statistics查看器中输出

图 4. 调用 R 的第 3 步——运行结果显示
图 4. 调用 R 的第 3 步——运行结果显示
图 4. 调用 R 的第 3 步——运行结果显示

以上是在 SPSS Statistics 中嵌入 R 代码的最简单形式。如果希望在 R 代码中使用 SPSS Statistics 数据编辑器中的数据集,可以使用函数 spssdata.GetDataFromSPSS()。在数据编辑器中打开 SPSS 的实例数据 demo.sav,自动命名为【数据集 1 】。在语法编辑器中执行代码:

代码 2. 使用 SPSS Statistics 编辑器中的数据
BEGIN PROGRAM R.
   demodata <- spssdata.GetDataFromSPSS()
   mean(demodata$age)
END PROGRAM.

就可以计算得到 age 字段的均值,如下图:

图 5. 输出结果
图 5. 输出结果
图 5. 输出结果

另一方面,也可以更直观地在 SPSS Statistics 查看器中输出 R 中的表格数据,例如代码:

代码 3. 查看 R 中产生的表格
BEGIN PROGRAM R.
   spsspivottable.Display(Formaldehyde,title="Determination of Formaldehyde")
END PROGRAM.

输出结果为 SPSS 中的表格式样:

图 6. 输出结果
图 6. 输出结果

这里使用了函数 spsspivottable.Display()。而更复杂的多维数据表格展示,需要使用更多 SPSS Statistics 的类型和函数,参考我们后面的例子。

2.2 SPSS Modeler 调用 R 语言的实现方式

SPSS Modeler 中调用 R 代码需要使用 Modeler 中 Statistics 输出节点作为过渡来实现。因而该系统中必须也要安装 SPSS Statistics,使用 Modeler 的统计量实用程序(Statistics Utility)关联上 Statistics 的应用目录。同样安装对应的 SPSS Statistics Essentials for R 包。这样就可以在 Modeler 中调用 R 语言了。

图 7. 在 SPSS Modeler 中使用 R 语言的方法
图 7. 在 SPSS Modeler 中使用 R 语言的方法
图 7. 在 SPSS Modeler 中使用 R 语言的方法

在 Modeler 中添加 Statistics 输出节点,然后在节点的语法编辑器中按照 Statistics 调用 R 的格式输入代码:

图 8. 在 SPSS Modeler 中调用 R 代码的方法
图 8. 在 SPSS Modeler 中调用 R 代码的方法
图 8. 在 SPSS Modeler 中调用 R 代码的方法

另外,虽然 Statistics 变换节点也有语法编辑器,但其并不支持 BEGIN PROGRAM … END PROGRAM 的语法,所以并不能调用 R 语言。

3. SPSS 调用 R 语言的实例

3.1 利用 SPSS Statistics 优化 R 语言的数据显示

因为 R 语言是基于命令行的文本显示方式,对于常见的多维数据不能很直观地展示。当把 R 语言集成到 SPSS Statistics 后,就可以调用 Statistics 专门设计的一些函数,在查看器中更形象地使用数据透视表(pivot table)来展示多维数据。以下例子为 R 中自带数据 HairEyeColor,其统计了不同头发和眼睛颜色的男女学生的学生人数:

图 9. R 中的数据 HairEyeColor
图 9. R 中的数据 HairEyeColor

由此可见,这个数据有头发颜色(Hair)、眼睛颜色(Eye)和性别(Sex)3 个维度(dimension),而度量(measure)是统计的人数。在基本的 R 中只能显示二维数据表格,包含一个行维度(row dimension)和一个列维度(column dimension)。更高维的数据则分解为多个二维表格——即分解到这两个维度以外的其他维度取值的组合数目的表格中,其它维度的组合称作层维度(layer dimension)。这个例子中第三个维度 Sex 有 Male 和 Female 两个取值,所以用两个二维数据表格来展示整个数据。如果需要在一个表格中展示整个多维数据,传统中使用平表(flat table),例如:

图 10. 平表 (flat table) 显示多维数据
图 10. 平表 (flat table) 显示多维数据

将三个维度分别作为 3 列,它们取值的组合正好就对应了第 4 列的人数度量(measure)。这样的显示不直观,而且各个维度的取值会重复显示多次,太累赘。而在 SPSS Statistics 中可以定义复杂的数据透视表(pivot table),例如在一个数据透视表中显示 HairEyeColor 的所有三个维度:

图 11. 透视表 (pivot table) 显示多维数据
图 11. 透视表 (pivot table) 显示多维数据

SPSS Statistics 中数据透视表的结构和各部分定义如图。

图 12. SPSS Statistics 中数据透视表的结构和定义
图 12. SPSS Statistics 中数据透视表的结构和定义
图 12. SPSS Statistics 中数据透视表的结构和定义

你可将多维数据中的一个或多个维度设定在任意的行维度、列维度或层维度上,这些维度的取值称作类别(category),而度量值放在单元(cell)中。依据以上数据透视表各个部分的定义,创建一个数据透视表包括以下四个基本步骤:

  1. 创建 BasicPivotTable 类的一个实例
  2. 增加维度
  3. 定义各个维度的类别
  4. 设置单元值

而各个步骤中需要调用相应的 SPSS Statistics 函数。这里是所有用于数据透视表显示的类和方法包括:

表 2. 显示数据透视表的类和方法
表 2. 显示数据透视表的类和方法
表 2. 显示数据透视表的类和方法

根据以上的步骤,使用数据透视表显示的函数,我们给出一个 R 语言代码的例子:

代码 4. SPSS Statistics 中显示数据透视表
BEGIN PROGRAM R.
   spsspkg.StartProcedure("MyProcedure")
   demo <- data.frame(HairEyeColor)
   
   # 创建一个BasePivotTable的实例
   table = spss.BasePivotTable("Hair and Eye Color of Students", "OMS table subtype")

   # 增加三个维度:前两个行维度(Hair and Eye),最后一个列维度(Sex)
   dim1=BasePivotTable.Append(table,Dimension.Place.row,names(demo)[1])
   dim2=BasePivotTable.Append(table,Dimension.Place.row,names(demo)[2])
   dim3=BasePivotTable.Append(table,Dimension.Place.column,names(demo)[3])

   # 定义各个维度的类别   
   ctg1=BasePivotTable.SetCategories(table,
		dim1,
		as.list(apply(as.matrix(levels(demo[[1]])),1,spss.CellText.String)))
   ctg2=BasePivotTable.SetCategories(table,
		dim2,
		as.list(apply(as.matrix(levels(demo[[2]])),1,spss.CellText.String)))
   ctg3=BasePivotTable.SetCategories(table,
		dim3,
		as.list(apply(as.matrix(levels(demo[[3]])),1,spss.CellText.String)))

   # 设置单元值
   MyCellFun <- function(x) 
   cell = BasePivotTable.SetCellValue(
		  table, 
		  list(spss.CellText.String(x[1]), 
				spss.CellText.String(x[2]), 
				spss.CellText.String(x[3])),
		  spss.CellText.Number(as.numeric(x[4])))
   apply(demo, 1, MyCellFun)
   
   spsspkg.EndProcedure()
END PROGRAM.

运行以上的语法代码就会获得前面的多维度数据透视表输出。应该注意的是,使用这些这些类和方法,需要在一个 Procedure 环境中,也就是必须以 spsspkg.StartProcedure() 为开始行,以 spsspkg.EndProcedure() 为结束行。

3.2 利用 R 语言来增强 SPSS Statistics 的作图能力

R 语言具有灵活多样的绘图能力,常用的统计图形都可以便捷的在 R 中绘制,其中还有大量的统计图形的绘制可通过各种 R 的扩展包实现,因而大大丰富了 SPSS Statistics 的图形展示能力。这里以绘制马赛克图为例。

马赛克图(Mosaic Plots)是一种有效展示多维列联表数据的工具,它对维数没有限制。马赛克图形看起来就像是若干块马赛克放置在一起,马赛克图中的各个矩阵块与对应的频数成比例,频数越大,对应的矩阵块就越大。vcd 包(首次使用需要安装,install.packages("vcd"))中的马赛克图不仅仅可以展示多维列联表的数据,同时可以给出各个维度上的独立检验的信息。

下面以 Statistics 中自带的 demo 数据为例来画马赛克图。该数据共有 6400 行数据,29 个变量,代表着 6400 个个人在 29 个指标上的数据信息。demo 数据的部分变量信息如下图:

图 13. SPSS Statistics 中演示数据 demo.sav
图 13. SPSS Statistics 中演示数据 demo.sav
图 13. SPSS Statistics 中演示数据 demo.sav

由于马赛克图适用于展示分类型变量的列联表(contingency table),这里我们选取 demo 数据中:Marital、Inccat、ed 和 gender 四个分类变量来绘制马赛克图。其中:

  • marital 为婚姻状况变量,取值 0 代表未婚,1 代表已婚;
  • inccat 为收入状况,取值
    • 1 代表收入少于 25000 美元,
    • 2 代表收入在 25000-49000 之间,
    • 3 代表收入在 50000-74000,
    • 4 代表收入在 75000 以上;
  • ed 为受教育程度,取值:
    • 1 代表未完成高中学业,
    • 2 代表完成高中学业,
    • 3 部分完成专科学业,
    • 4 为完成大学学业,
    • 5 为完成研究生学业;
  • gender 为性别,取值 f 代表 Female 为女性,m 为男性。

四个变量共有 2*4*5*2 个属性值,我们用马赛克图来展示以上的频次统计数据:

首先,在 Statistics 中打开 demo.sav 的数据,然后新建语法如下:

代码 5. 显示马赛克图(Mosaic Plots)
BEGIN PROGRAM R.
   library(vcd)

   dat = spssdata.GetDataFromSPSS()
   mosaic(~ed+gender+marital+inccat, shade=TRUE, legend=TRUE,data=dat)
END PROGRAM.

执行语法输出结果:

图 14. 输出图形
图 14. 输出图形
图 14. 输出图形

上图的左边 ed 是受教育程度的维度,上边 gender 是性别的维度,右边 marital 是婚姻状况的维度,下边 inccat 是收入水平的维度。我们可以很清楚的看到,在所有 6400 个个人中:

  • ed 为 2 即完成高中学业的人数最多,ed 为 5 即完成研究生学业的人最少;
  • 各个受教育程度上对应的男性和女性大致相当;
  • 在收入水平为 4 即收入在 75000 以上的水平上,女性中未婚的受教育程度为 1、2、3、4. 即研究生学业以下的人数比已婚的同等教育水平的人数多,而在完成研究生教育后,未婚的女性人数比已婚的人数要少;
  • 而同样观察收入水平在 75000 以上的水平的男性中,在各个受教育水平,已婚的男性都比未婚的男性人数多;
  • 相对而言,完成研究生教育(ed 为 5)的人群中,收入水平达到 75000 美元以上(即 inccat 为 4)的人数占同等教育水平比例最大。

图形中的颜色显示的是独立模型拟合的残差的大小,本图可以清楚的看出未完成高中学业(ed 为 1)已婚(marital 为 1)收入在 25000 美元以下(inccat 为 1)的男性(gender 为 m)单元格的拟合欠佳。

3.3 利用 R 语言灵活的外部接口功能来拓展 Statistics

R 语言有丰富的外部接口功能。例如,目前所有版本的 SQL 都有对应的接口(相应的 R 包)连接 R 语言;XML 包可以解析网页编码的代码,方便的提取网页中的数据;R 基础包中也有直接读取网页上规范好的数据;googleVis 包提供了直接连接 Google Analytics 上的数据以及分析工具等等。这里我们主要介绍 ggmap 包直接调用 Google Map 上地图的功能。

SPSS Statistics 同样有画地图的功能,因为是在 UI 设置,较为复杂,可参考这个网页了解其用法: http://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1108zhangxp/index.html。这里将以实例来展示在 SPSS Statistics 中调用 R 语言的方式来绘制地图,对熟悉 R 语言的用户,比较简单。

David Kahle 和 Hadley Wickham 利用 Google 的 API 开发了 ggmap 包。该包可以直接从 Google 提取地图信息,然后在 R 语言中绘制。为此,需要首先在 R 语言中安装 ggmap 和 mapproj 包。只要是 Google Map 中存在的地方,用 ggmap 包都可以绘制,比如北京市地图、中关村软件园地图等。而在实际应用中,通常会在绘制的地图上添加一些有意义的信息,这里将在中国地图上描述出最近一周(2013.1.2-2013.1.8)在中国发生的所有的地震信息,如下图所示(红点处即为在这一周中发生地震的地点):

图 15. 中国一周(2013.1.2-2013.1.8)地震发生地点显示
图 15. 中国一周(2013.1.2-2013.1.8)地震发生地点显示
图 15. 中国一周(2013.1.2-2013.1.8)地震发生地点显示

获得以上输出的代码为:

代码 6. 显示中国一周(2013.1.2-2013.1.8)地震发生地点
BEGIN PROGRAM R.
   library(ggmap)
   library(mapproj)
   library(XML)
   
   # 从网页上抓取地震数据,并进行清理
   webpage <-'http://data.earthquake.cn/datashare/globeEarthquake_csn.html'
   tables <- readHTMLTable(webpage,stringsAsFactors = FALSE)
   
   earthqk <- tables[[6]][-1,c(1,3,4)]
   names(earthqk) <- c('date','lan','lon')
   earthqk$lan <- as.numeric(earthqk$lan)
   earthqk$lon <- as.numeric(earthqk$lon)
   earthqk$date <- as.Date(earthqk$date,  "%Y-%m-%d")
   
   # 获取城市数据
   webpage<-
    'http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9B%BD%E5%9F%8E%E5%B8%82%E5%88%97%E8%A1%A8'
   tables <- readHTMLTable(webpage)
   
   cities <- tables[[2]][2:10,c(2,3,5)]
   names(cities) <- c('cname','name','pop')
   cities$pop <- as.numeric(gsub(',','',cities$pop))
   cities$name <- as.character(cities$name)
   cities <- cbind(cities, geocode(cities$name))
   
   # 构建最近地震的分布图,附加上重要城市的图标和名字
   map <- get_googlemap(center='china',zoom=4,scale=2,maptype='terrain')
   ggmap(map,extent='device')+
	  geom_point(data=earthqk,aes(x=lon,y=lan),colour = 'red4',alpha=0.5,size=2)+
	  geom_point(data=cities,aes(x=lon,y=lat),colour = 'black',shape=1,size=5)+
	  geom_point(data=cities,aes(x=lon,y=lat),colour = 'black',size=2)+
	  geom_text(data=cities,aes(x=lon,y=lat,label=name),size=4,hjust=-.4,vjust=0)
END PROGRAM.

先从国家地震科学数据共享中心获得地震日期和经纬度数据。然后,在 wiki 的中国城市列表中抓取了城市名称,并用函数 geocode() 得到城市的经纬度信息。最后调用 get_googlemap() 得到中国的地图图片,用 ggmap() 显示为 ggplot2 格式对象,参照经纬度再叠加上之前的地震地点和城市。这样就完成了一个用地图展示数据的简单例子。

ggmap 中提供了六种地图的呈现形式,常用的有卫星图、地形图、道路图、混合图等等。该包获取地图信息的途径也有多种,分别为 Google Maps, OpenStreetMap ,Stamen Maps ,CloudMade maps 四种获取地图信息的途径,可以针对不同需求选择不同的地图信息来源。更多详细的细节请查阅 ggmap 包的文档。

3.4 在 SPSS Modeler 中应用 R 语言做分析和图形展示

这里以 Modeler 中 demo 中的 car_sales_knn.str 为例,该数据中有 16 个变量,159 行数据,这里只选取其中 8 个连续变量,这 8 个变量分别为:

  • "sales"为销售的个数(单位:千),
  • "price"为汽车的售价(单位:千)
  • "horsepow"为汽车的马力 ,
  • "engine_s"为汽车发动机的尺寸 ,
  • "wheelbas"为汽车的轴距 ,
  • "width"为车宽 ,
  • "length"为车长 ,
  • "mpg"为每加仑汽油可行驶的英里数。

这里希望做出这 8 个变量的相关系数图,以此来了解这八个变量彼此之间的相关程度。统计分析中常常需要处理变量之间的相关关系,我们可以很方便的计算出两个变量的相关系数,以及相关系数检验,进而可以做出散点图来分析。而使用 corrplot 包(首次使用,需要安装该包 install.packages("corrplot"))中的 corrplot 图就可以很直观地展示多变量之间的相关系数大小。

首先在 Modeler 中打开 car_sales_knn.str,在该 stream 中加入 Statistics Output 节点,编辑该节点,点选该节点的句法的语法编辑器,输入类似在 Statistics 中的代码:

图 16. 在 SPSS Modeler 中嵌入 R 代码显示图形
图 16. 在 SPSS Modeler 中嵌入 R 代码显示图形
图 16. 在 SPSS Modeler 中嵌入 R 代码显示图形

运行后,得到 Modeler 输出的截图:

图 17. 图形输出
图 17. 图形输出
图 17. 图形输出

由上图我们可以发现:

  • price 和 engine_s 与 horsepow 的相关程度都较大,马力越大的车,价格越贵,且发动机尺寸越大;
  • 而 price 与 wheelbas 的相关程度很低;
  • horsepow、engine_s 都与 mpg 的有较大的负相关,可解释为马力越大或发动机尺寸越大,每加仑汽油行驶的英里数都会越少,也就是越费油。

本图还有更多的发现,这里不再列举。

corrplot 命令中还有很多参数可以用来更改展示的形状,比如可以用方格来代替圆,也可以更改颜色等。因为相关系数矩阵是一个对称矩阵,利用 corrplot 可以很方便的将上三角阵画图,下三角阵来显示相关系数的数值,代码如下:

图 18. 在 SPSS Modeler 中嵌入 R 代码显示图形——修改格式
图 18. 在 SPSS Modeler 中嵌入 R 代码显示图形——修改格式
图 18. 在 SPSS Modeler 中嵌入 R 代码显示图形——修改格式

其中 tl.pos 是设置 text label 的位置,”d”表示在 diagonal,而”n”为不添加;cl.pos 则是 color label 的位置;diag=FALSE 表示不在对角单元中显示相关系数,否则就会都是 1。输出的结果如下图:

图 19. 图形输出
图 19. 图形输出
图 19. 图形输出

右上角和左下角相对称,能提供更多的信息。

结束语

SPSS Statistics 有自身强大的优势,更可以集 R 语言的优势为我所用,为不同的统计分析目的提供全面的服务和功能。这里介绍了 SPSS Statistics 以及 SPSS Moderler 中调用 R 语言的过程和例子,以及利用该调用过程借用 R 语言快捷的绘制图形的优势,来方便的在 SPSS 中实现不同的需求。当然更多的应用,有待各位读者持续的开发。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=960450
ArticleTitle=在 SPSS Statistics 和 Modeler 中调用 R 语言的实现和应用
publish-date=01022014