楼主: 我的素质低
3740 2

[clementine] SPSS Statistics 和 Modeler 中调用 R 语言的实现和应用 [推广有奖]

学术权威

83%

还不是VIP/贵宾

-

TA的文库  其他...

〖素质文库〗

结构方程模型

考研资料库

威望
8
论坛币
23388 个
通用积分
28302.3504
学术水平
2705 点
热心指数
2881 点
信用等级
2398 点
经验
223623 点
帖子
2977
精华
52
在线时间
2175 小时
注册时间
2012-11-24
最后登录
2024-1-13

一级伯乐勋章 初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章 中级信用勋章 高级学术勋章 高级热心勋章 高级信用勋章 特级学术勋章

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
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

但应注意的是,针对不同的 SPSS Statistics 版本,需要有相对应的 R 语言版本和 SPSS Statistics Essentials for 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 步:在编辑框中输入对应的语法脚本,遵循结构为:

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

如下图所示:

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

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

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

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


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

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

图 5. 输出结果

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

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

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

图 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 语言的方法

在 Modeler 中添加 Statistics 输出节点,然后在节点的语法编辑器中按照 Statistics 调用 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


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



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

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

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

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

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

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




  • 创建 BasicPivotTable 类的一个实例
  • 增加维度
  • 定义各个维度的类别
  • 设置单元值

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

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

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




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

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

  11.    # 定义各个维度的类别   
  12.    ctg1=BasePivotTable.SetCategories(table,
  13.                 dim1,
  14.                 as.list(apply(as.matrix(levels(demo[[1]])),1,spss.CellText.String)))
  15.    ctg2=BasePivotTable.SetCategories(table,
  16.                 dim2,
  17.                 as.list(apply(as.matrix(levels(demo[[2]])),1,spss.CellText.String)))
  18.    ctg3=BasePivotTable.SetCategories(table,
  19.                 dim3,
  20.                 as.list(apply(as.matrix(levels(demo[[3]])),1,spss.CellText.String)))

  21.    # 设置单元值
  22.    MyCellFun <- function(x)
  23.    cell = BasePivotTable.SetCellValue(
  24.                   table,
  25.                   list(spss.CellText.String(x[1]),
  26.                                 spss.CellText.String(x[2]),
  27.                                 spss.CellText.String(x[3])),
  28.                   spss.CellText.Number(as.numeric(x[4])))
  29.    apply(demo, 1, MyCellFun)
  30.    
  31.    spsspkg.EndProcedure()
  32. END PROGRAM.
复制代码


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




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Statistics statistic Statist MODELER Statis 软件包 统计 Modeler 调用 R 语言 实现和应用

已有 1 人评分经验 论坛币 收起 理由
niuniuyiwan + 60 + 60 精彩帖子

总评分: 经验 + 60  论坛币 + 60   查看全部评分

本帖被以下文库推荐

心晴的时候,雨也是晴;心雨的时候,晴也是雨!
扣扣:407117636,欢迎一块儿吐槽!!
沙发
我的素质低 学生认证  发表于 2015-4-10 14:25:35 |只看作者 |坛友微信交流群
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

由于马赛克图适用于展示分类型变量的列联表(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. 输出图形

上图的左边 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)地震发生地点显示

获得以上输出的代码为:

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

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

图 17. 图形输出

由上图我们可以发现:


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

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

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

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

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

图 19. 图形输出

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



已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
niuniuyiwan + 100 + 100 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 100  论坛币 + 100  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

心晴的时候,雨也是晴;心雨的时候,晴也是雨!
扣扣:407117636,欢迎一块儿吐槽!!

使用道具

藤椅
sunyiping 发表于 2015-4-10 14:43:23 |只看作者 |坛友微信交流群
谢谢楼主!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 02:16