我们通常会将R的工作环境先进行一些设置,这些设置包括了「设定当前工作目录」、 「设定系統中文文字编码」、以及「设定绘图物件中的中文文字」等项, 以下是一些操作范例。
#呈现code 与output
knitr::opts_chunk$set(echo = TRUE)
#设定当前工作目录(请选择一个你自己的工作目录)
setwd("/Users/simonfair/Desktop/闽南师范大学/量化培训班/(9)20230611")
#显示目前工作目录
getwd()
## [1] "/Users/simonfair/Desktop/闽南师范大学/量化培训班/(9)20230611"
#设定系統中文文字編碼 (mac)
Sys.setlocale(category = "LC_ALL", locale = "en_US.UTF-8") #美式英文
## [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/zh_CN.UTF-8"
Sys.setlocale(category = "LC_ALL", locale = "Zh_TW.UTF-8") #繁体中文
## [1] "Zh_TW.UTF-8/Zh_TW.UTF-8/Zh_TW.UTF-8/C/Zh_TW.UTF-8/zh_CN.UTF-8"
Sys.setlocale(category = "LC_ALL", locale = "zh_CN.UTF-8") #简体中文
## [1] "zh_CN.UTF-8/zh_CN.UTF-8/zh_CN.UTF-8/C/zh_CN.UTF-8/zh_CN.UTF-8"
#载入showtext套件
library(showtext)
## 载入需要的程辑包:sysfonts
## 载入需要的程辑包:showtextdb
#使绘图物件中的中文文字能正确呈现
showtext_auto(enable = TRUE)
在传播研究中,我们经常需要探索两个变量之间的关系,例如,A变量的变化会不会与B变量 的变化有关系?B变量的变化会不会因为A变量的不同变化而有差异?当自变量与因变量两者 皆属于类别变量时,我们一般会通过百分比比较分析,来探索两者之间的关系,最常用的是 “交叉分析与卡方检验”。
假设我们想要知道,民众的”快乐感”(分为:不快乐、快乐、无法选择三类),会不会因为受 教育程度的不同(分为:小学及以下、初中、高中职、专科、本科及以上五类)而有差异? 我们该如何使用R软进行分析呢?
#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R
TCS2015sc <- read_spss("TCS2015sc.sav")
## Converting atomic to factors. Please wait...
#察看数据档中的变量名称
names(TCS2015sc)
## [1] "ID" "strata" "A1" "A2.year" "A2.age"
## [6] "age_strata" "A7" "A8" "B1a" "B1b"
## [11] "B2" "C1a" "C1b.1" "C1b.2" "C3"
## [16] "C4a" "C4b.1" "C4b.2" "D1a" "D1b.1"
## [21] "D1b.2" "E1" "E2.1" "E2.2" "F6"
## [26] "F7.1" "F7.2" "G1.1.A" "G1.1.B" "G1.1.C"
## [31] "G2.1" "G2.2" "G2.3" "G2.4" "G2.5"
## [36] "G2.6" "G2.7" "G4.1" "G4.2" "G4.3.1"
## [41] "G4.3.2" "G5.1" "G5.2" "G5.3" "G5.4"
## [46] "H1" "H2" "H3" "H4.1" "H4.2"
## [51] "H4.3" "H4.4" "H4.5" "I1" "I3.1"
## [56] "I3.2" "I3.3" "I3.4" "I3.5" "I3.6"
## [61] "I3.7" "I3.8" "I3.9" "I3.10" "I3.11"
## [66] "I3.12" "I3.13" "I3.14" "I3.88" "J1.1"
## [71] "J1.2" "J1.3" "J1.4" "J1.5" "J2.1"
## [76] "J2.2" "J2.3" "J2.4" "J2.5" "S1.1"
## [81] "S1.2" "S1.3" "S1.4" "S1.5" "S1.6"
## [86] "S1.7" "S1.8" "S1.9" "S1.10" "V1.1"
## [91] "V1.2" "V1.3" "V1.4" "V1.5" "W3"
## [96] "weight1" "W_Raking" "V1.5.cat3" "S1.9.cat3" "V1.5.cat2"
## [101] "sex" "edu.cat5"
在TCS2015sc数据档中,变量V1.5是快乐程度,将其设置为因变量;A8是教育程度,将其设 置为自变量。我们可以使用sjmisc套件的frq函数,呈现这两个变量的频数分布。
library(sjmisc)#调用sjmisc套件
frq(TCS2015sc$V1.5,out = "v")#使用frq函数做V1.5的频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
1 | 非常不快樂 | 21 | 1.05 | 1.05 | 1.05 | |
2 | 不快乐 | 232 | 11.59 | 11.59 | 12.64 | |
3 | 快乐 | 1498 | 74.83 | 74.83 | 87.46 | |
4 | 非常快乐 | 195 | 9.74 | 9.74 | 97.20 | |
94 | 無法选择 | 56 | 2.80 | 2.80 | 100.00 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=5.51 · σ=15.02 |
frq(TCS2015sc$A8,out = "v")#呈现A8的频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
1 | 无 | 63 | 3.15 | 3.15 | 3.15 | |
2 | 自修 | 5 | 0.25 | 0.25 | 42.91 | |
3 | 小学 | 235 | 11.74 | 11.74 | 61.34 | |
4 | 初中 | 225 | 11.24 | 11.24 | 72.58 | |
5 | 初职 | 9 | 0.45 | 0.45 | 73.03 | |
6 | 高中普通科 | 113 | 5.64 | 5.64 | 78.67 | |
7 | 高中职业科 | 114 | 5.69 | 5.69 | 84.37 | |
8 | 高职(高商/高工) | 312 | 15.58 | 15.58 | 99.95 | |
9 | 士官学校 | 1 | 0.05 | 0.05 | 100.00 | |
10 | 五专 | 75 | 3.75 | 3.75 | 6.89 | |
11 | 二专 | 152 | 7.59 | 7.59 | 14.49 | |
12 | 三專 | 23 | 1.15 | 1.15 | 15.63 | |
13 | 军警专修班 | 0 | 0.00 | 0.00 | 15.63 | |
14 | 军警专科班 | 4 | 0.20 | 0.20 | 15.83 | |
15 | 空中行专 | 2 | 0.10 | 0.10 | 15.93 | |
16 | 空中大学 | 7 | 0.35 | 0.35 | 16.28 | |
17 | 军警官校或大学 | 9 | 0.45 | 0.45 | 16.73 | |
18 | 技术学院/科大 | 113 | 5.64 | 5.64 | 22.38 | |
19 | 大学 | 406 | 20.28 | 20.28 | 42.66 | |
20 | 硕士 | 123 | 6.14 | 6.14 | 49.05 | |
21 | 博士 | 11 | 0.55 | 0.55 | 49.60 | |
88 | 其他 | 0 | 0.00 | 0.00 | 99.95 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=10.59 · σ=6.46 |
将原始变量(V1.5)依照我们的编码规则(1:2=1; 3,4=2; 94=3),重新编码(rec)为另一 新的变量(V1.5.cat3);给予变量名称(var.label)和变量标签名称(val.labels); 将新的变量(V1.5.ca3)设置为类别变量(as.num=FALSE);检查编码转换是否正确(table); 并呈现重新编码后的频数分布(frq)。
library(sjmisc) #调用sjmisc套件
frq(TCS2015sc$V1.5) #使用frq函数做V1.5的频数分布
## V1.5. 整体来说,你觉得目前的日子过得快不快乐? (x) <categorical>
## # total N=2002 valid N=2002 mean=5.51 sd=15.02
##
## Value | Label | N | Raw % | Valid % | Cum. %
## ----------------------------------------------------
## 1 | 非常不快樂 | 21 | 1.05 | 1.05 | 1.05
## 2 | 不快乐 | 232 | 11.59 | 11.59 | 12.64
## 3 | 快乐 | 1498 | 74.83 | 74.83 | 87.46
## 4 | 非常快乐 | 195 | 9.74 | 9.74 | 97.20
## 94 | 無法选择 | 56 | 2.80 | 2.80 | 100.00
## <NA> | <NA> | 0 | 0.00 | <NA> | <NA>
TCS2015sc$V1.5.cat3 <- rec(TCS2015sc$V1.5, #使用rec函数重新编码
rec = "1:2=1; 3:4=2; 94=3",
var.label = "V1.5.cat3日子过的快不快乐三分类",
val.labels = c("不快乐","快乐","无法选择"),
as.num = FALSE #设置为类别变量
)
table(TCS2015sc$V1.5, TCS2015sc$V1.5.cat3)#使用table函数检查编码转换是否正确
##
## 1 2 3
## 1 21 0 0
## 2 232 0 0
## 3 0 1498 0
## 4 0 195 0
## 94 0 0 56
frq(TCS2015sc$V1.5.cat3)#使用frq函数做V1.5.cat3的频数分布
## V1.5.cat3日子过的快不快乐三分类 (x) <categorical>
## # total N=2002 valid N=2002 mean=1.90 sd=0.38
##
## Value | Label | N | Raw % | Valid % | Cum. %
## --------------------------------------------------
## 1 | 不快乐 | 253 | 12.64 | 12.64 | 12.64
## 2 | 快乐 | 1693 | 84.57 | 84.57 | 97.20
## 3 | 无法选择 | 56 | 2.80 | 2.80 | 100.00
## <NA> | <NA> | 0 | 0.00 | <NA> | <NA>
将原始变量(A8)依照我们的编码规则(1:3=1; 4:5=2; 6:9=3; 10:15=4; 16:21=5), 重新编码(rec)为另一新的变量(edu.cat5),给予变量名称(var.label)和变量标签名称 (val.labels);将新的变量(edu.cat5)设置为类别变量(as.num=FALSE);检查编码转换是否 正确(table);并呈现重新编码后的频数分布(frq)。
library(sjmisc)#调用sjmisc套件
frq(TCS2015sc$A8)#使用frq函数做变量A8的频数分布
## A8. 教育程度 (x) <categorical>
## # total N=2002 valid N=2002 mean=10.59 sd=6.46
##
## Value | Label | N | Raw % | Valid % | Cum. %
## --------------------------------------------------------
## 1 | 无 | 63 | 3.15 | 3.15 | 3.15
## 2 | 自修 | 5 | 0.25 | 0.25 | 42.91
## 3 | 小学 | 235 | 11.74 | 11.74 | 61.34
## 4 | 初中 | 225 | 11.24 | 11.24 | 72.58
## 5 | 初职 | 9 | 0.45 | 0.45 | 73.03
## 6 | 高中普通科 | 113 | 5.64 | 5.64 | 78.67
## 7 | 高中职业科 | 114 | 5.69 | 5.69 | 84.37
## 8 | 高职(高商/高工) | 312 | 15.58 | 15.58 | 99.95
## 9 | 士官学校 | 1 | 0.05 | 0.05 | 100.00
## 10 | 五专 | 75 | 3.75 | 3.75 | 6.89
## 11 | 二专 | 152 | 7.59 | 7.59 | 14.49
## 12 | 三專 | 23 | 1.15 | 1.15 | 15.63
## 13 | 军警专修班 | 0 | 0.00 | 0.00 | 15.63
## 14 | 军警专科班 | 4 | 0.20 | 0.20 | 15.83
## 15 | 空中行专 | 2 | 0.10 | 0.10 | 15.93
## 16 | 空中大学 | 7 | 0.35 | 0.35 | 16.28
## 17 | 军警官校或大学 | 9 | 0.45 | 0.45 | 16.73
## 18 | 技术学院/科大 | 113 | 5.64 | 5.64 | 22.38
## 19 | 大学 | 406 | 20.28 | 20.28 | 42.66
## 20 | 硕士 | 123 | 6.14 | 6.14 | 49.05
## 21 | 博士 | 11 | 0.55 | 0.55 | 49.60
## 88 | 其他 | 0 | 0.00 | 0.00 | 99.95
## <NA> | <NA> | 0 | 0.00 | <NA> | <NA>
TCS2015sc$edu.cat5 <- rec(TCS2015sc$A8, #使用rec函数重新编码
rec = "1:3=1; 4:5=2; 6:9=3; 10:15=4; 16:21=5",
var.label = "edu.cat5受教育程度五分类",
val.labels = c("小学及以下","初中","高中职", "专科",
"本科及以上"),
as.num = FALSE #设定为类别变量
)
table(TCS2015sc$A8, TCS2015sc$edu.cat5)#使用table函数检查编码转换是否正确
##
## 1 2 3 4 5
## 1 63 0 0 0 0
## 2 5 0 0 0 0
## 3 235 0 0 0 0
## 4 0 225 0 0 0
## 5 0 9 0 0 0
## 6 0 0 113 0 0
## 7 0 0 114 0 0
## 8 0 0 312 0 0
## 9 0 0 1 0 0
## 10 0 0 0 75 0
## 11 0 0 0 152 0
## 12 0 0 0 23 0
## 14 0 0 0 4 0
## 15 0 0 0 2 0
## 16 0 0 0 0 7
## 17 0 0 0 0 9
## 18 0 0 0 0 113
## 19 0 0 0 0 406
## 20 0 0 0 0 123
## 21 0 0 0 0 11
frq(TCS2015sc$edu.cat5, out = "v") #使用frq函数做edu.cat5的频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
1 | 小学及以下 | 303 | 15.13 | 15.13 | 15.13 | |
2 | 初中 | 234 | 11.69 | 11.69 | 26.82 | |
3 | 高中职 | 540 | 26.97 | 26.97 | 53.80 | |
4 | 专科 | 256 | 12.79 | 12.79 | 66.58 | |
5 | 本科及以上 | 669 | 33.42 | 33.42 | 100.00 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=3.38 · σ=1.43 |
在进行交叉分析时,每个交叉细格通常可以呈现三种百分比:row%, col%, 以及total%。 学习者最困扰的是,不知要选择哪一种百分比作为比较的标准。 我们的建议是:「呈现自变量所在的百分比」。 如果我们想将自变量放在表格的「左边」,就要呈现「row」百分比。(这也是作者所 偏好的交叉表呈现方式)。
就此处例子来说,edu5.cat5是我们所设想的自变量,在进行交叉分析时,我们想将其放在 表格的左边,所以就要呈现row%。我们可以调用sjPlot套件的tab_xtab函数,呈现交叉分析 的row%(show.row.prc = TRUE)。 另外,由于我们使用的是抽样调查资料,该资料中亦有提供加权变量(weight1)供研究者使 用,所以我们记得要使用加权变量进行分析(weight.by),这样产生出来的数据,才会是比 较正确的。
library(sjPlot) #调用sjPlot套件
## Learn more about sjPlot with 'browseVignettes("sjPlot")'.
tab_xtab(TCS2015sc$edu.cat5,TCS2015sc$V1.5.cat3, #使用tab_xtab函数做交叉分析表
#row自变量edu.cat5, col因变量V1.5.cat3
#show.row.prc = TRUE,#呈现 row %
weight.by = TCS2015sc$weight1,#加权
show.summary = FALSE)#单纯呈现交叉表,不呈现卡方检验相关数据
edu.cat5受教育程度五分类 | V1.5.cat3日子过的快不快乐三分类 | Total | ||
---|---|---|---|---|
不快乐 | 快乐 | 无法选择 | ||
小学及以下 | 37 | 249 | 4 | 290 |
初中 | 42 | 171 | 6 | 219 |
高中职 | 69 | 444 | 13 | 526 |
专科 | 30 | 211 | 7 | 248 |
本科及以上 | 76 | 618 | 26 | 720 |
Total | 254 | 1693 | 56 | 2003 |
#encoding = "GB18030") #for 简体中文电脑
library(sjPlot) #调用sjPlot套件
tab_xtab(TCS2015sc$edu.cat5,TCS2015sc$V1.5.cat3, #使用tab_xtab函数做交叉分析表
#row自变量edu.cat5, col因变量V1.5.cat3
show.row.prc = TRUE,#呈现 row %
weight.by = TCS2015sc$weight1,#加权
show.summary = FALSE)#单纯呈现交叉表,不呈现卡方检验相关数据
edu.cat5受教育程度五分类 | V1.5.cat3日子过的快不快乐三分类 | Total | ||
---|---|---|---|---|
不快乐 | 快乐 | 无法选择 | ||
小学及以下 |
37 12.8 % |
249 85.9 % |
4 1.4 % |
290 100 % |
初中 |
42 19.2 % |
171 78.1 % |
6 2.7 % |
219 100 % |
高中职 |
69 13.1 % |
444 84.4 % |
13 2.5 % |
526 100 % |
专科 |
30 12.1 % |
211 85.1 % |
7 2.8 % |
248 100 % |
本科及以上 |
76 10.6 % |
618 85.8 % |
26 3.6 % |
720 100 % |
Total |
254 12.7 % |
1693 84.5 % |
56 2.8 % |
2003 100 % |
#encoding = "GB18030") #for 简体中文电脑
另外一种呈现方式是将自变量放在表格的「上头」,此时就要呈现「column」百分比。 就此处例子来说,edu5.cat5是我们所设想的自变量,在进行交叉分析时,我们想将其放在 表格的上头,所以就要呈现col%(show.col.prc = TRUE),一样要记得将加权变量放入分析 语法中。
library(sjPlot)#调用sjPlot套件
tab_xtab(TCS2015sc$V1.5.cat3,TCS2015sc$edu.cat5, #使用tab_xtab函数做交叉分析表
#row因变量V1.5.cat3, col自变量edu.cat5
show.col.prc = TRUE,#show col %
weight.by = TCS2015sc$weight1,#加权
show.summary = FALSE)
V1.5.cat3日子过的快不快乐三分类 | edu.cat5受教育程度五分类 | Total | ||||
---|---|---|---|---|---|---|
小学及以下 | 初中 | 高中职 | 专科 | 本科及以上 | ||
不快乐 |
37 12.8 % |
42 19.2 % |
69 13.1 % |
30 12.1 % |
76 10.6 % |
254 12.7 % |
快乐 |
249 85.9 % |
171 78.1 % |
444 84.4 % |
211 85.1 % |
618 85.8 % |
1693 84.5 % |
无法选择 |
4 1.4 % |
6 2.7 % |
13 2.5 % |
7 2.8 % |
26 3.6 % |
56 2.8 % |
Total |
290 100 % |
219 100 % |
526 100 % |
248 100 % |
720 100 % |
2003 100 % |
#单纯呈现交叉表,不呈现卡方检验相关数据
#encoding = "GB18030") #for 简体中文电脑
在进行交叉分析时,我们也可以调用sjPlot套件的plot_xtab函数,呈现交叉分析百分比的 条形图(type=“bar”)以及折线图(type=“line”),以视觉化的方式,查看两变量间的关系。
自变量在x轴(row), 因变量在y轴(col)
#彩色图
library(sjPlot)#调用sjPlot套件
plot_xtab(TCS2015sc$edu.cat5, TCS2015sc$V1.5.cat3, #使用plot_xtab函数绘图
#row:x轴变量(自变量)edu.cat5,col:y轴变量(因变量)V1.5.cat3
type = "bar", #呈现条形图
margin = "row", #呈现row% (自变量所在的%)
weight.by = TCS2015sc$weight1)#加权
#黑白图
library(sjPlot)#调用sjPlot套件
library(ggplot2)
##
## 载入程辑包:'ggplot2'
## The following object is masked from 'package:sjlabelled':
##
## as_label
theme_set(theme_bw())#黑白主题
plot_xtab(TCS2015sc$edu.cat5, TCS2015sc$V1.5.cat3, #使用plot_xtab函数绘图
#row:x轴变量(自变量)edu.cat5,col:y轴变量(因变量)V1.5.cat3
geom.colors = "gs",# gray scale
type = "bar", #呈现条形图
margin = "row", #呈现row% (自变量所在的%)
weight.by = TCS2015sc$weight1)#加权
#翻转90度
library(sjPlot)#调用sjPlot套件
theme_set(theme_bw())#黑白主题
plot_xtab(TCS2015sc$edu.cat5, TCS2015sc$V1.5.cat3, #使用plot_xtab函数绘图
#row:x轴变量(自变量)edu.cat5,col:y轴变量(因变量)V1.5.cat3
geom.colors = "gs",# gray scale
coord.flip = TRUE, #翻转90度
type = "bar", #呈现条形图
margin = "row", #呈现row% (自变量所在的%)
weight.by = TCS2015sc$weight1)#加权
自变量在x轴(row), 因变量在y轴(col)
library(sjPlot)#调用sjPlot套件
plot_xtab(TCS2015sc$edu.cat5, TCS2015sc$V1.5.cat3, #使用plot_xtab函数绘图
#row:x轴变量(自变量)edu.cat5,col:y轴变量(因变量)V1.5.cat3
type = "line", #呈现折线图
margin = "row", #呈现row%(自变量所在的%)
weight.by = TCS2015sc$weight1) #加权
#黑白图
library(sjPlot)#调用sjPlot套件
theme_set(theme_bw())#黑白主题
plot_xtab(TCS2015sc$edu.cat5, TCS2015sc$V1.5.cat3, #使用plot_xtab函数绘图
#row:x轴变量(自变量)edu.cat5,col:y轴变量(因变量)V1.5.cat3
geom.colors = "gs", #gray scale
type = "line", #呈现折线图
margin = "row", #呈现row% (自变量所在的%)
weight.by = TCS2015sc$weight1)#加权
#输入表格资料
happy<-c("unhappy", "happy", "hard too say")
edu1<- c(0.128,0.859,0.014)
edu2<- c(0.192,0.781,0.027)
edu3<- c(0.131,0.844,0.025)
edu4<- c(0.121,0.851,0.028)
edu5<- c(0.106,0.888,0.036)
#组合成data.frame
happy_edu<-data.frame(happy,edu1,edu2,edu3,edu4,edu5)
happy_edu
## happy edu1 edu2 edu3 edu4 edu5
## 1 unhappy 0.128 0.192 0.131 0.121 0.106
## 2 happy 0.859 0.781 0.844 0.851 0.888
## 3 hard too say 0.014 0.027 0.025 0.028 0.036
#下载套件
devtools::install_github("ricardo-bion/ggradar", dependencies=TRUE)
## Skipping install of 'ggradar' from a github remote, the SHA1 (53404a56) has not changed since last install.
## Use `force = TRUE` to force installation
#呈现雷达图
library(ggradar)
ggradar(happy_edu)
为了要检验在”样本”交叉表中(例如:edu.cat5教育程度*V1.5.cat3快乐感)所观察到的百分比 差距,能否推论到”总体”达到统计上的显著差异,必须进一步使用「皮尔森卡方检验(Pearson Chi-Square Test)」,来做统计检验的工作。 我们可调用sjPlot套件的tab_xtab函数,来呈现卡方检验值,对应的P值,以及Cramer’V 相关系数(0~1)等这些统计数据(show.summary=TRUE)。
#row:自变量
library(sjPlot)#调用sjPlot套件
tab_xtab(TCS2015sc$edu.cat5,TCS2015sc$V1.5.cat3, #使用tab_xtab函数做交叉分析表
#row自变量edu.cat5, col因变量V1.5.cat3
show.row.prc = TRUE,#呈现 row %
weight.by = TCS2015sc$weight1,#加权
show.summary = TRUE)#呈现卡方检验值,P值,以及Cramer'V相关系数
edu.cat5受教育程度五分类 | V1.5.cat3日子过的快不快乐三分类 | Total | ||
---|---|---|---|---|
不快乐 | 快乐 | 无法选择 | ||
小学及以下 |
37 12.8 % |
249 85.9 % |
4 1.4 % |
290 100 % |
初中 |
42 19.2 % |
171 78.1 % |
6 2.7 % |
219 100 % |
高中职 |
69 13.1 % |
444 84.4 % |
13 2.5 % |
526 100 % |
专科 |
30 12.1 % |
211 85.1 % |
7 2.8 % |
248 100 % |
本科及以上 |
76 10.6 % |
618 85.8 % |
26 3.6 % |
720 100 % |
Total |
254 12.7 % |
1693 84.5 % |
56 2.8 % |
2003 100 % |
χ2=15.289 · df=8 · Cramer’s V=0.062 · p=0.054 |
#encoding = "GB18030" #for 简体中文电脑
#col: 自变量
library(sjPlot)#调用sjPlot套件
tab_xtab(TCS2015sc$V1.5.cat3, TCS2015sc$edu.cat5,#使用tab_xtab函数做交叉分析表
#row因变量V1.5.cat3, col自变量edu.cat5,
show.col.prc = TRUE,#呈现 col %
weight.by = TCS2015sc$weight1,#加权
show.summary = TRUE)#呈现卡方检验值,P值,以及Cramer'V相关系数
V1.5.cat3日子过的快不快乐三分类 | edu.cat5受教育程度五分类 | Total | ||||
---|---|---|---|---|---|---|
小学及以下 | 初中 | 高中职 | 专科 | 本科及以上 | ||
不快乐 |
37 12.8 % |
42 19.2 % |
69 13.1 % |
30 12.1 % |
76 10.6 % |
254 12.7 % |
快乐 |
249 85.9 % |
171 78.1 % |
444 84.4 % |
211 85.1 % |
618 85.8 % |
1693 84.5 % |
无法选择 |
4 1.4 % |
6 2.7 % |
13 2.5 % |
7 2.8 % |
26 3.6 % |
56 2.8 % |
Total |
290 100 % |
219 100 % |
526 100 % |
248 100 % |
720 100 % |
2003 100 % |
χ2=15.289 · df=8 · Cramer’s V=0.062 · p=0.054 |
#encoding = "GB18030" #for 简体中文电脑
统计报表显示,Pearson χ2=15.289, df(degree of freedom,自由度)=8, 其所对应的p=0.054 (=0.05),代表我们可以拒绝H0(虚无假设),不排斥或接受H1(研究假设), 也就是说,如果将样本的结果推论回母体,则民众的”快乐感”的确会因为其”受教育程度”的 不同,而存在显著差异,此一差异已超过抽样误差的范围,可以推论到总体。
当两个变量都是属于「定类变量」时(nominal scale),一般会使用Cramer’s V(介于0~1之间), 来衡量两变量彼此间的相关强度。
本例中,Cramer’s V=0.062,表示民众的”快乐感” 与其”受教育程度”之间的关连,呈现一种极弱的”弱相关”关系。
综合卡方检验与Cramer’s V的统计分析结果,我们可以这样说:对于民众的快乐感受而言, 民众的教育水平是一个达到统计显着差异的解释(预测)变量;然而,由于两变量间的相关 关系很弱,所以,民众的教育水平可能不是其快乐感受的最佳解释(预测)变量。
当卡方检验结果,显示因变量(例如:V1.5.cat3民众的”快乐感”)的确会因为我们所设置的 自变量(例如:edu.cat5民众的”受教育程度”)而存在显著差异时,我们进一步可以观察交叉 方格的”调整后标准化残差”,判断到底是哪一类别或哪一细格产生显着差异。
要观察卡方检验的显着差异是发生在那一方格,需要借重”调整后标准化残差”(Adjusted Standardized Residual)此一參數。如果該方格内”调整后标准化残差”的絕對值大於1.96, 则该方格即为显着差异之所在(方格内的百方比显着高于或低于某一类目全体的比例)。 反之,即表示无显着差异。
我们可以套用descr套件的crosstab函数,来呈现交叉表中每一方格的调整后标准化残差。
#使用base套件的levels函数赋予变量值标签
#levels(TCS2015sc$edu.cat5) <- c("1.小学及以下", "2.初中", "3.高中职", "4.专科", "5.本科及以上")
#levels(TCS2015sc$V1.5.cat3) <- c("1.不快乐", "2.快乐", "3.无法选择")
#使用plyr套件的mapvalues函数赋予变量值标签
library(plyr)
TCS2015sc$edu.cat5.label <- mapvalues(TCS2015sc$edu.cat5,
from = c("1","2", "3", "4", "5"),
to = c("1.小学及以下","2.初中", "3.高中职","4.专科", "5.本科及以上"))
table(TCS2015sc$edu.cat5.label)
##
## 1.小学及以下 2.初中 3.高中职 4.专科 5.本科及以上
## 303 234 540 256 669
TCS2015sc$V1.5.cat3.label <- mapvalues(TCS2015sc$V1.5.cat3,
from = c("1","2", "3"),
to = c("1.不快乐", "2.快乐", "3.无法选择"))
table(TCS2015sc$V1.5.cat3.label)
##
## 1.不快乐 2.快乐 3.无法选择
## 253 1693 56
#在RCPA3套件下,descr::crosstab不会产生作用,所以要先卸载RCPA3
library(RCPA3)
##
## 载入程辑包:'RCPA3'
## The following object is masked from 'package:plyr':
##
## ddply
detach("package:RCPA3", unload = TRUE)
library(descr)#调用descr套件
##
## 载入程辑包:'descr'
## The following object is masked from 'package:sjmisc':
##
## descr
crosstab(TCS2015sc$edu.cat5.label, TCS2015sc$V1.5.cat3.label, #使用crosstab函数
#row自变量edu.cat5.label #col因变量V1.5.cat3.label
TCS2015sc$weight1, #加权
prop.r = TRUE, # 顯示row百分比
expected = TRUE, #顯示卡方期望值
chisq = TRUE, # 顯示卡方值
#sresid = TRUE,#顯示标准化残差值
asresid = TRUE) # 顯示调整后的标准化残差值
## Cell Contents
## |-------------------------|
## | Count |
## | Expected Values |
## | Row Percent |
## | Adj Std Resid |
## |-------------------------|
##
## ==================================================================
## V1.5.cat3日子过的快不快乐三分类
## edu.cat5受教育程度五分类 1.不快乐 2.快乐 3.无法选择 Total
## ------------------------------------------------------------------
## 1.小学及以下 37 249 4 290
## 36.8 245.1 8.1
## 12.8% 85.9% 1.4% 14.5%
## 0.043 0.682 -1.582
## ------------------------------------------------------------------
## 2.初中 42 171 6 219
## 27.8 185.1 6.1
## 19.2% 78.1% 2.7% 10.9%
## 3.062 -2.792 -0.053
## ------------------------------------------------------------------
## 3.高中职 69 444 13 526
## 66.7 444.6 14.7
## 13.1% 84.4% 2.5% 26.3%
## 0.351 -0.083 -0.525
## ------------------------------------------------------------------
## 4.专科 30 211 7 248
## 31.4 209.6 6.9
## 12.1% 85.1% 2.8% 12.4%
## -0.295 0.259 0.027
## ------------------------------------------------------------------
## 5.本科及以上 76 618 26 720
## 91.3 608.6 20.1
## 10.6% 85.8% 3.6% 35.9%
## -2.141 1.214 1.658
## ------------------------------------------------------------------
## Total 254 1693 56 2003
## ==================================================================
##
## Statistics for All Table Factors
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 15.28888 d.f. = 8 p = 0.0538
##
## Minimum expected frequency: 6.122816
图7- 中,受教度程度为”初中”者,所属方格的”Adj Std Resid”值为 +3.062 (绝对值大于1.96),代表初中教育程度者自觉”不快乐”的比例(19.2%),显着 「高于」(▲)全体自觉”不快乐”的比例。另一方面,“本科及以上”者所属方格的”Adj Std Resid”值为-2.141(绝对值大于1.96),代表本科及以上教育程度者自觉”不快乐”的比例 (10.6%),显着「低于」(▼)全体自觉”不快乐”的比例。同理可以得知,初中教育程度者自觉 “快乐”的比例(78.1%),显着「低于」(▼)全体自觉”快乐”的比例。
图 调整后标准化残差示例
所以,通过皮尔森卡方检验以及调整后的标准化残差分析,我们可以得到以下的结论: 1. 民众的”快乐感”会因为其”受教育程度”的不同,而存在统计上的显着差异(卡方值=15.289, df=8, p=0.005)。 2. 具体来说,“初中”教育程度者有较高的”不快乐”比例,较低的”快乐”比例。“本科及以上”教育程度”者有较低的”不快乐”比例。
#呈现Association #Plot(標準化殘差圖sresid)(非調整後的標準化殘差asresid)
#library(vcd)
#cotabplot(~edu.cat5+V1.5.cat3, data = TCS2015sc, shade = T)
#assoc(~edu.cat5+V1.5.cat3, data = TCS2015sc, shade = T)
#col: 自变量
library(RCPA3)#调用RCPA3套件
##
## 载入程辑包:'RCPA3'
## The following objects are masked from 'package:descr':
##
## compmeans, crosstab, freq
## The following object is masked from 'package:plyr':
##
## ddply
crosstabC(dv = V1.5.cat3,iv = edu.cat5, w = weight1,
data = TCS2015sc,
dvlabs = c("不快乐", "快乐", "无法选择"),
ivlabs = c("小学及以下", "初中", "高中职", "专科", "本科及以上"),
digits = 1,
compact = TRUE, #(default:compact = F),
plot.response = "all",
plot = "mosaic", #"line", "bar", "mosaic",
ylab = "%",
xlab = "edu.cat5教育五分类",
main = "教育程度*快乐程度交叉分析表",
chisq = TRUE,
cramers = T,#呈现Cramers'V 相关系数
lambda = T, #呈现lambda相关系数,
printC =T,
)
## ===========================================================================
## Cross-Tabulation Analysis
## ===========================================================================
##
##
## Table: Cross-Tabulation of V1.5.cat3 and edu.cat5, weighted by weight1
##
## 小学及以下 初中 高中职 专科 本科及以上 Totals
## ----------- ----------- ------ ------- ------ ----------- -------
## % 不快乐 12.8 19.2 13.1 12.0 10.5 12.7
## % 快乐 85.7 77.9 84.4 85.3 85.9 84.5
## % 无法选择 1.5 2.9 2.4 2.7 3.5 2.8
## Count 291.1 219.0 525.8 246.9 719.1 2002.0
## Table appended to Table.Output. 61123.html in /Users/simonfair/Desktop/闽南师范大学/量化培训班/(9)20230611
## ---------------------------------------------------------------------------
## Chi-Squared Test of Independence
## ---------------------------------------------------------------------------
## Null hypothesis: V1.5.cat3 and edu.cat5 are independent.
##
##
## Pearson's Chi-squared test
##
## data: crosstab.observed.frequencies
## X-squared = 14.792, df = 8, p-value = 0.06332
## Statement appended to Table.Output. 61123.html in /Users/simonfair/Desktop/闽南师范大学/量化培训班/(9)20230611
##
##
## ---------------------------------------------------------------------------
## Lambda Measure of Association
## ---------------------------------------------------------------------------
##
##
## Table: Lambda Measure of Association
##
## Naive Errors Prediction Errors Lambda
## ------------- ------------------ -------
## 309.5 309.5 0.0
## Table appended to Table.Output. 61123.html in /Users/simonfair/Desktop/闽南师范大学/量化培训班/(9)20230611
##
## ---------------------------------------------------------------------------
## Cramer's V Measure of Association
## ---------------------------------------------------------------------------
## Cramer's V
## 0.1
## Statement appended to Table.Output. 61123.html in /Users/simonfair/Desktop/闽南师范大学/量化培训班/(9)20230611
## Image file added to Table.Output. 61123.html in /Users/simonfair/Desktop/闽南师范大学/量化培训班/(9)20230611
22表格交叉分析基本上和R*C表格有着相同的分析步骤; 但22交叉分析在卡方值的选择上,主要是以Yates’s Continuity correction的卡方值, 来代替Pearson卡方值;而在相关系数上,则是选择使用φ(读做Phi)(0~无限大),来代替 Cramer’s V值,做为相关系数的测量统计值。 此处一样以具体例子来展示2*2表格的交叉分析步骤。
rm(list = ls()) #清除记忆体中所有物件与资料
#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R
TCS2015sc <- read_spss("TCS2015sc.sav")
## Converting atomic to factors. Please wait...
此处先将V1.5变量的原始五分类(1.非常不快乐, 2. 不快乐, 3.快乐, 4. 非常快乐, 94.无法选择),转换为一个新的二分类变量V1.5.cat2(1.快乐, 0.其他)
将原始变量(V1.5)依照我们的编码规则(3,4=1; else=0),重新编码(rec)为另一 新的变量(V1.5.cat2);给予变量名称(var.label)和变量标签名称(val.labels); 将新的变量(V1.5.ca2)设置为类别变量(as.num=FALSE);检查编码转换是否正确(table); 并呈现重新编码后的频数分布(frq)。
library(sjmisc) #调用sjmisc套件
TCS2015sc$V1.5.cat2 <- rec(TCS2015sc$V1.5, #使用rec函数重新编码
rec = "else=0; 3,4 = 1",
var.label = "V1.5.cat2日子过的快不快乐二分类",
val.labels = c("其他","快乐"),
as.num = FALSE) #设定为类别变量
table(TCS2015sc$V1.5, TCS2015sc$V1.5.cat2)#使用table函数检查编码转换是否正确
##
## 0 1
## 1 21 0
## 2 232 0
## 3 0 1498
## 4 0 195
## 94 56 0
frq(TCS2015sc$V1.5.cat2, out = "v")#使用frq函数做V1.5.cat2频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
0 | 其他 | 309 | 15.43 | 15.43 | 15.43 | |
1 | 快乐 | 1693 | 84.57 | 84.57 | 100.00 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=0.85 · σ=0.36 |
将原始变量(A1)依照我们的编码规则(1=1; 2=2),重新编码(rec)为另一 新的变量(sex);给予变量名称(var.label)和变量标签名称(val.labels); 将新的变量(sex)设置为类别变量(as.num=FALSE);检查编码转换是否正确(table); 并呈现重新编码后的频数分布(frq)。
library(sjmisc) #调用sjmisc套件
frq(TCS2015sc$A1)#使用frq函数做A1频数分布
## 性别 (x) <categorical>
## # total N=2002 valid N=2002 mean=1.54 sd=0.50
##
## Value | Label | N | Raw % | Valid % | Cum. %
## -----------------------------------------------
## 1 | 男 | 928 | 46.35 | 46.35 | 46.35
## 2 | 女 | 1074 | 53.65 | 53.65 | 100.00
## <NA> | <NA> | 0 | 0.00 | <NA> | <NA>
TCS2015sc$sex <- rec(TCS2015sc$A1, #使用rec函数重新编码
rec = "1=1; 2 = 2",
var.label = "sex性别",
val.labels = c("男","女"),
as.num = FALSE) #设定为类别变量
table(TCS2015sc$A1, TCS2015sc$sex)#使用table函数检查编码转换是否正确
##
## 1 2
## 1 928 0
## 2 0 1074
frq(TCS2015sc$sex, out = "v")#使用frq函数做sex频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
1 | 男 | 928 | 46.35 | 46.35 | 46.35 | |
2 | 女 | 1074 | 53.65 | 53.65 | 100.00 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=1.54 · σ=0.50 |
此处我们使用两种方式来呈现2*2交叉表格: (1)调用descr套件的crosstab函数呈现;(2)调用siPlot套件的tab_xtab函数呈现, 藉以比较两种统计表格呈现方式的不同之处。
#调用base套件中的levels函数,赋予变量值标签
#levels(TCS2015sc$sex) <- c("1.男", "2.女")
#levels(TCS2015sc$V1.5.cat2) <- c("0.其他", "1.快乐")
#使用dplyr套件的mapvalues函数赋予变量值标签
library(dplyr)
##
## 载入程辑包:'dplyr'
## The following objects are masked from 'package:plyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
## The following object is masked from 'package:sjlabelled':
##
## as_label
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
TCS2015sc$sex.label <- mapvalues(TCS2015sc$sex,
from = c("1","2"),
to = c("1.男", "2.女"))
table(TCS2015sc$sex.label)
##
## 1.男 2.女
## 928 1074
TCS2015sc$V1.5.cat2.label <- mapvalues(TCS2015sc$V1.5.cat2,
from = c("0","1"),
to = c("0.其他", "1.快乐"))
table(TCS2015sc$V1.5.cat2.label)
##
## 0.其他 1.快乐
## 309 1693
#调用descr套件的crosstab函数,做交叉分析(一)
detach("package:RCPA3")
library(descr) #调用descr套件
crosstab(TCS2015sc$sex.label, TCS2015sc$V1.5.cat2.label, #使用crosstab函数做交叉
#row自变量sex.label #col因变量V1.5.cat2.label
TCS2015sc$weight1, #加權
expected = TRUE,#顯示卡方期望值
prop.r=TRUE, #顯示row %
chisq = TRUE)# 顯示卡方值
## Cell Contents
## |-------------------------|
## | Count |
## | Expected Values |
## | Row Percent |
## |-------------------------|
##
## ==================================
## V1.5.cat2日子过的快不快乐二分类
## sex性别 0.其他 1.快乐 Total
## ----------------------------------
## 1.男 170 818 988
## 152.6 835.4
## 17.2% 82.8% 49.4%
## ----------------------------------
## 2.女 139 874 1013
## 156.4 856.6
## 13.7% 86.3% 50.6%
## ----------------------------------
## Total 309 1692 2001
## ==================================
##
## Statistics for All Table Factors
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 4.651843 d.f. = 1 p = 0.031
##
## Pearson's Chi-squared test with Yates' continuity correction
## ------------------------------------------------------------
## Chi^2 = 4.388788 d.f. = 1 p = 0.0362
## Minimum expected frequency: 152.5697
#调用sjPlot套件的tab_xtab函数,做交叉分析(二)
library(sjPlot)#调用sjPlot套件
tab_xtab(TCS2015sc$sex.label, TCS2015sc$V1.5.cat2.label, #使用tab_xtab函数做交叉
#row自变量sex, col因变量V1.5.cat2
weight.by = TCS2015sc$weight1,#加權
show.row.prc = TRUE, # 呈现 row %
show.summary = TRUE) #呈现卡方检验值,P值,以及φ(读做Phi)相关系数
sex性别 | V1.5.cat2日子过的快不快乐二分类 | Total | |
---|---|---|---|
0.其他 | 1.快乐 | ||
1.男 |
170 17.2 % |
818 82.8 % |
988 100 % |
2.女 |
139 13.7 % |
874 86.3 % |
1013 100 % |
Total |
309 15.4 % |
1692 84.6 % |
2001 100 % |
χ2=4.389 · df=1 · φ=0.048 · p=0.036 |
#χ2=4.389(=descr::crosstab::Yates' continuity correction, Chi^2 = 4.388788)
以图 为例,使用descr::crosstab 指令所产生的Pearson’s Chi-squared test的值为4.651843,Yates’s continuity correction Chi-squared test的值为4.38, 此时,我们应以Yates’s continuity correction Chi-squared test的值(4.38)为准, 其所对应的p-value = 0.0362<0.05,代表民众日子过的快不快乐,会因为其性别不同而有差异。
再以图 为例,使用sjPlot::tab_xtab 指令所产生的卡方值=4.389, 此值即是Yates’s continuity correction 的卡方值。另外,在图 亦呈现了φ 相关系数的大小(0.048)。
图7- Yates’s continuity correction Chi-square示例
图- φ 相关系数示例
因此,不管是哪一种形式都呈现出一致的结论,就是民众的”快乐感”会因为”性别”的不同, 而呈现显着差异(Yates’s Chi2=4.389, df=1, p=0.036)。学习者可继续按照前述RC表格中所 介绍的方式,呈现22交叉方格的调整后标准化残差,具体观察显着差异之所在。
另外,在22交叉表格中,如果有任何一方格的期望值<5,此时就会违反了其分析前提。因为 在这种情况下,期望值小于5的方格数,就占了全部方格数的25%(1/4=25%)。 22表格已经是最少类别的交叉表,由于无法再进行归并分类,因此,卡方值的选用就需要 使用Fisher’s exact test(费雪精确检验) 来代替。(Everitt, 1992: 14)。 遇到这种情况时,统计软体都会自动跑出Fisher’s exact test,供研究者选用。
另一方面,2*2交叉表格还可以用”发生比”(odds)与”发生比的倍数变化”(odds ratio)的概念来做分析。
以图7-为例,我们可以得知, 男性自觉”快乐”相对于”其他”的比例,是4.81(82.8%/17.2%);(odds) 女性自觉”快乐”相对于”其他”的比例,是6.30(86.3%/13.7%);(odds) 全体自觉”快乐”相对于”其他”的比例,是5.49(84.6%/15.4%);(odds)
所以, 男性自觉”快乐”相对于”其他”的比例,是女性的0.763倍(4.81/6.30);odds ratio 女性自觉”快乐”相对于”其他”的比例,是男性的1.31倍(6.30/4.81);odds ratio
男性自觉”快乐”相对于”其他”的比例,是全体的0.876倍(4.81/5.49);odds ratio 女性自觉”快乐”相对于”其他”的比例,是全体的1.15倍;(6.30/5.49);odds ratio
简单来说,就是女性比男性更觉得自己过的比较快乐。
“发生比”(odds)与”发生比的倍数变化”(odds ratio)的概念很有用,特别是在进行logistic regression(逻辑回归时),必定会用到这组概念,此处先简单介绍。
进行交叉分析卡方检验时,有一个重要的前提是:“期望值”小于5的方格数,不能超过 全部方格数的20%;如果超过,研究者需要将变量进行适度的类别合并,再进行卡方检验, 这样得到的卡方值以及p值检验,才会是比较正确的。(Everitt, 1992:39)
什么是”期望值”呢?“期望值”(expected value)指的是如果兩变量无关,则交叉表格中每一 方格内理论上应该要出现的期望次数。具体来说,就是如果自变量在该方格内的反应比例与 总体的反应比例并无二致的话,理论上该方格应该要出现的期望次数。
至于合并类别的原则,一般的经验是,自变量与因变量的交叉方格数目,最好不要超过 40(R*C <=40)(Fogarty, 2019: 241)。 实务上,自变量与因变量的类别数,各以6类以下为宜,
此处以age_strata(年龄分层,7分类)与V1.5(民众过的快不快乐, 5分类)的7*5交叉分析, 做为一个不佳的卡方检验例子。
rm(list = ls()) #清除记忆体中所有物件与资料
#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R
TCS2015sc <- read_spss("TCS2015sc.sav")
## Converting atomic to factors. Please wait...
class(TCS2015sc$age_strata)#查看age_strata變量的屬性
## [1] "factor"
frq(TCS2015sc$age_strata, out = "v")#使用frq函数做age_strata的频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
1 | 18-19 | 38 | 1.90 | 1.90 | 1.90 | |
2 | 20-29 | 242 | 12.09 | 12.09 | 13.99 | |
3 | 30-39 | 460 | 22.98 | 22.98 | 36.96 | |
4 | 40-49 | 363 | 18.13 | 18.13 | 55.09 | |
5 | 50-59 | 423 | 21.13 | 21.13 | 76.22 | |
6 | 60-69 | 294 | 14.69 | 14.69 | 90.91 | |
7 | 70以上 | 182 | 9.09 | 9.09 | 100.00 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=4.25 · σ=1.56 |
#调用base套件中的levels函数,赋予变量值标签
#levels(TCS2015sc$age_strata) <- c("18-19", "20-29", "30-39", "40-49", "50-59",
#"60-69", "70以上")
#levels(TCS2015sc$V1.5) <- c("非常不快樂", "不快乐", "快乐", "非常快乐",
#"無法选择")
#使用plyr套件的mapvalues函数赋予变量值标签
library(dplyr)
TCS2015sc$age_strata.label <- mapvalues(TCS2015sc$age_strata,
from = c("1","2", "3", "4", "5", "6", "7"),
to = c("18-19", "20-29", "30-39", "40-49", "50-59","60-69", "70以上"))
table(TCS2015sc$age_strata.label)
##
## 18-19 20-29 30-39 40-49 50-59 60-69 70以上
## 38 242 460 363 423 294 182
TCS2015sc$V1.5.label <- mapvalues(TCS2015sc$V1.5,
from = c("1","2", "3", "4", "94"),
to = c("非常不快樂", "不快樂", "快樂", "非常快樂", "無法選擇"))
table(TCS2015sc$V1.5.label)
##
## 非常不快樂 不快樂 快樂 非常快樂 無法選擇
## 21 232 1498 195 56
#交叉分析
library(descr)#调用descr套件
crosstab(TCS2015sc$age_strata.label, TCS2015sc$V1.5.label,#使用crosstab函数做交叉
TCS2015sc$weight1, #加權
expected = TRUE, #呈現期望值
prop.r=TRUE, #呈現row %
chisq = TRUE)# 呈現卡方值
## Warning in chisq.test(tab, correct = FALSE, ...): Chi-squared近似算法有可能不准
## Cell Contents
## |-------------------------|
## | Count |
## | Expected Values |
## | Row Percent |
## |-------------------------|
##
## =====================================================================
## V1.5. 整体来说,你觉得目前的日子过得快不快乐?
## 年龄分层 非常不快樂 不快樂 快樂 非常快樂 無法選擇 Total
## ---------------------------------------------------------------------
## 18-19 0 5 41 18 2 66
## 0.7 7.6 49.1 6.7 1.8
## 0.0% 7.6% 62.1% 27.3% 3.0% 3.3%
## ---------------------------------------------------------------------
## 20-29 7 30 239 43 10 329
## 3.6 38.1 244.8 33.3 9.2
## 2.1% 9.1% 72.6% 13.1% 3.0% 16.4%
## ---------------------------------------------------------------------
## 30-39 5 56 298 35 10 404
## 4.4 46.8 300.6 40.9 11.3
## 1.2% 13.9% 73.8% 8.7% 2.5% 20.2%
## ---------------------------------------------------------------------
## 40-49 3 58 277 21 14 373
## 4.1 43.2 277.5 37.8 10.4
## 0.8% 15.5% 74.3% 5.6% 3.8% 18.6%
## ---------------------------------------------------------------------
## 50-59 5 42 275 38 12 372
## 4.1 43.1 276.8 37.7 10.4
## 1.3% 11.3% 73.9% 10.2% 3.2% 18.6%
## ---------------------------------------------------------------------
## 60-69 2 26 193 31 6 258
## 2.8 29.9 192.0 26.1 7.2
## 0.8% 10.1% 74.8% 12.0% 2.3% 12.9%
## ---------------------------------------------------------------------
## 70以上 0 15 168 17 2 202
## 2.2 23.4 150.3 20.5 5.6
## 0.0% 7.4% 83.2% 8.4% 1.0% 10.1%
## ---------------------------------------------------------------------
## Total 22 232 1491 203 56 2004
## =====================================================================
##
## Statistics for All Table Factors
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 59.6325 d.f. = 24 p = 7.2e-05
##
## Minimum expected frequency: 0.7245509
## Cells with Expected Frequency < 5: 8 of 35 (22.85714%)
#Cells with Expected Frequency < 5: 8 of 35 (22.857%)
#(違反分析前提 Chi-squared Chi-squared近似算法有可能不准)
图 与图 显示,交叉表中,期望值小于5的方格数约有8个,占全部35方格数的22.85%。 已违反卡方检验的分析前提,据此而计算出来的卡方值,有可能不准确。 因此,研究者需要合并类别,重新进行交叉分析与卡方检验,方为正道。
图7- 不佳的交叉分析卡方检验示例
图 不佳的交叉分析卡方检验示例
rm(list = ls()) #清除记忆体中所有物件与资料
#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R
TCS2015sc <- read_spss("TCS2015sc.sav")
## Converting atomic to factors. Please wait...
将原始变量(V1.5)依照我们的编码规则(1,2=1; 3,4=2; 94=3),重新编码(rec)为另一 新的变量(V1.5.cat3);给予变量名称(var.label)和变量标签名称(val.labels); 将新的变量(V1.5.ca3)设置为类别变量(as.num=FALSE);检查编码转换是否正确(table); 并呈现重新编码后的频数分布(frq)。
library(sjmisc)#调用sjmisc套件
frq(TCS2015sc$V1.5, out = "v") #使用frq函数做V1.5频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
1 | 非常不快樂 | 21 | 1.05 | 1.05 | 1.05 | |
2 | 不快乐 | 232 | 11.59 | 11.59 | 12.64 | |
3 | 快乐 | 1498 | 74.83 | 74.83 | 87.46 | |
4 | 非常快乐 | 195 | 9.74 | 9.74 | 97.20 | |
94 | 無法选择 | 56 | 2.80 | 2.80 | 100.00 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=5.51 · σ=15.02 |
TCS2015sc$V1.5.cat3 <- rec(TCS2015sc$V1.5, #使用rec函数重新编码
rec = "1,2=1; 3,4=2; 94=3;",
var.label = "V1.5.cat3快不快乐三分类",
val.labels = c("不快乐","快乐", "无法选择"),
as.num = FALSE) #设定为类别变量
table(TCS2015sc$V1.5, TCS2015sc$V1.5.cat3)#使用table函数检查编码转换是否正确
##
## 1 2 3
## 1 21 0 0
## 2 232 0 0
## 3 0 1498 0
## 4 0 195 0
## 94 0 0 56
frq(TCS2015sc$V1.5.cat3, out = "v") #使用frq函数做V1.5.cat3的频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
1 | 不快乐 | 253 | 12.64 | 12.64 | 12.64 | |
2 | 快乐 | 1693 | 84.57 | 84.57 | 97.20 | |
3 | 无法选择 | 56 | 2.80 | 2.80 | 100.00 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=1.90 · σ=0.38 |
将原始变量(age_strata)依照我们的编码规则(1,2=1; 3=2; 4=3; 5=4; 6,7=5), 重新编码(rec)为另一新的变量(age.cat5); 给予变量名称(var.label)和变量标签名称(val.labels); 将新的变量(age.cat5)设置为类别变量(as.num=FALSE);检查编码转换是否正确(table); 并呈现重新编码后的频数分布(frq)。
library(sjmisc)#调用sjmisc套件
frq(TCS2015sc$age_strata) #使用frq函数做age_strata频数分布
## 年龄分层 (x) <categorical>
## # total N=2002 valid N=2002 mean=4.25 sd=1.56
##
## Value | Label | N | Raw % | Valid % | Cum. %
## -----------------------------------------------
## 1 | 18-19 | 38 | 1.90 | 1.90 | 1.90
## 2 | 20-29 | 242 | 12.09 | 12.09 | 13.99
## 3 | 30-39 | 460 | 22.98 | 22.98 | 36.96
## 4 | 40-49 | 363 | 18.13 | 18.13 | 55.09
## 5 | 50-59 | 423 | 21.13 | 21.13 | 76.22
## 6 | 60-69 | 294 | 14.69 | 14.69 | 90.91
## 7 | 70以上 | 182 | 9.09 | 9.09 | 100.00
## <NA> | <NA> | 0 | 0.00 | <NA> | <NA>
TCS2015sc$age.cat5 <- rec(TCS2015sc$age_strata, #使用rec函数重新编码
rec = "1,2=1; 3=2; 4=3; 5=4; 6,7=5",
var.label = "age.cat5年龄五分类",
val.labels = c("18-29","30-39", "40-49", "50-59", "60以上"),
as.num = FALSE) #设定为类别变量
table(TCS2015sc$age_strata, TCS2015sc$age.cat5)#使用table函数检查编码转换是否正确
##
## 1 2 3 4 5
## 1 38 0 0 0 0
## 2 242 0 0 0 0
## 3 0 460 0 0 0
## 4 0 0 363 0 0
## 5 0 0 0 423 0
## 6 0 0 0 0 294
## 7 0 0 0 0 182
frq(TCS2015sc$age.cat5, out = "v") #使用frq函数做age.cat5的频数分布
val | label | frq | raw.prc | valid.prc | cum.prc | |
---|---|---|---|---|---|---|
1 | 18-29 | 280 | 13.99 | 13.99 | 13.99 | |
2 | 30-39 | 460 | 22.98 | 22.98 | 36.96 | |
3 | 40-49 | 363 | 18.13 | 18.13 | 55.09 | |
4 | 50-59 | 423 | 21.13 | 21.13 | 76.22 | |
5 | 60以上 | 476 | 23.78 | 23.78 | 100.00 | |
NA | NA | 0 | 0.00 | NA | NA | |
total N=2002 · valid N=2002 · x̄=3.18 · σ=1.39 |
经过对于变量类别进行合并后,统计报表显示,重新进行的卡方检验结果,并无任何一个方 格的期望值小于或等于5。所以这是一个合格的卡方检验分析。
### 调用base套件中的levels函数,赋予变量值标签
#levels(TCS2015sc$age.cat5) <- c("18-29", "30-39", "40-49", "50-59", "60以上")
#levels(TCS2015sc$V1.5.cat3) <- c("不快樂", "快乐", "無法选择")
#使用plyr套件的mapvalues函数赋予变量值标签
library(dplyr)#调用dplyr套件
TCS2015sc$age.cat5.label <- mapvalues(TCS2015sc$age.cat5, #使用mapvalues函数
from = c("1","2", "3", "4","5"), #界定变量值
to = c("18-29", "30-39", "40-49", "50-59", "60以上"))#給予变量标签
table(TCS2015sc$age.cat5.label) #察看频数及标签
##
## 18-29 30-39 40-49 50-59 60以上
## 280 460 363 423 476
TCS2015sc$V1.5.cat3.label <- mapvalues(TCS2015sc$V1.5.cat3,#使用mapvalues函数
from = c("1","2", "3"),#界定变量值
to = c("不快樂", "快乐", "無法选择"))#給予变量标签
table(TCS2015sc$V1.5.cat3.label)
##
## 不快樂 快乐 無法选择
## 253 1693 56
### 交叉分析及卡方检验
library(descr)#调用descr套件
crosstab(TCS2015sc$age.cat5.label, TCS2015sc$V1.5.cat3.label,
#使用crosstab函数做交叉分析
TCS2015sc$weight1, #加權
expected = TRUE, #顯示期望值
prop.r=TRUE, #顯示row %
chisq = TRUE)# 顯示卡方值
## Cell Contents
## |-------------------------|
## | Count |
## | Expected Values |
## | Row Percent |
## |-------------------------|
##
## =======================================================
## V1.5.cat3快不快乐三分类
## age.cat5年龄五分类 不快樂 快乐 無法选择 Total
## -------------------------------------------------------
## 18-29 41 341 12 394
## 49.8 333.2 11.0
## 10.4% 86.5% 3.0% 19.7%
## -------------------------------------------------------
## 30-39 61 333 10 404
## 51.1 341.6 11.3
## 15.1% 82.4% 2.5% 20.2%
## -------------------------------------------------------
## 40-49 61 298 14 373
## 47.1 315.4 10.4
## 16.4% 79.9% 3.8% 18.6%
## -------------------------------------------------------
## 50-59 47 313 12 372
## 47.0 314.6 10.4
## 12.6% 84.1% 3.2% 18.6%
## -------------------------------------------------------
## 60以上 43 408 8 459
## 58.0 388.2 12.8
## 9.4% 88.9% 1.7% 22.9%
## -------------------------------------------------------
## Total 253 1693 56 2002
## =======================================================
##
## Statistics for All Table Factors
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 17.35951 d.f. = 8 p = 0.0266
##
## Minimum expected frequency: 10.40559
数学公式如下图:(Salkind & Shaw, 2020: 684)
图- 皮尔森卡方值计算公式
这公式有三步骤: (1)将交叉表每一细格内的「观察值」(O)减去「期望值」(E),得到「观察值与期望值的差距」 (O-E), (2)将该差距予以「平方」后((O-E)^2),再除以该细格的「期望值」(E),以得到每一细格的 「卡方分值」 (3)将每一细格的「卡方分值」进行加总,即得到「整个交叉表的卡方值」
我们可以透过R的相关套件,一次得到每一细格的观察值与期望值,以及整个交叉表的卡方值。
将资料汇入到R
#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R
TCS2015sc <- read_spss("TCS2015sc.sav")
## Converting atomic to factors. Please wait...
#察看数据档中的变量名称
names(TCS2015sc)
## [1] "ID" "strata" "A1" "A2.year" "A2.age"
## [6] "age_strata" "A7" "A8" "B1a" "B1b"
## [11] "B2" "C1a" "C1b.1" "C1b.2" "C3"
## [16] "C4a" "C4b.1" "C4b.2" "D1a" "D1b.1"
## [21] "D1b.2" "E1" "E2.1" "E2.2" "F6"
## [26] "F7.1" "F7.2" "G1.1.A" "G1.1.B" "G1.1.C"
## [31] "G2.1" "G2.2" "G2.3" "G2.4" "G2.5"
## [36] "G2.6" "G2.7" "G4.1" "G4.2" "G4.3.1"
## [41] "G4.3.2" "G5.1" "G5.2" "G5.3" "G5.4"
## [46] "H1" "H2" "H3" "H4.1" "H4.2"
## [51] "H4.3" "H4.4" "H4.5" "I1" "I3.1"
## [56] "I3.2" "I3.3" "I3.4" "I3.5" "I3.6"
## [61] "I3.7" "I3.8" "I3.9" "I3.10" "I3.11"
## [66] "I3.12" "I3.13" "I3.14" "I3.88" "J1.1"
## [71] "J1.2" "J1.3" "J1.4" "J1.5" "J2.1"
## [76] "J2.2" "J2.3" "J2.4" "J2.5" "S1.1"
## [81] "S1.2" "S1.3" "S1.4" "S1.5" "S1.6"
## [86] "S1.7" "S1.8" "S1.9" "S1.10" "V1.1"
## [91] "V1.2" "V1.3" "V1.4" "V1.5" "W3"
## [96] "weight1" "W_Raking" "V1.5.cat3" "S1.9.cat3" "V1.5.cat2"
## [101] "sex" "edu.cat5"
调用R的套件,得到交叉表每一细格的观察值与期望值,以及整个交叉表的卡方值。
#变量转换(1):V1.5->V1.5.cat3
library(sjmisc) #调用sjmisc套件
TCS2015sc$V1.5.cat3 <- rec(TCS2015sc$V1.5, #使用rec函数重新编码
rec = "1:2=1; 3:4=2; 94=3",
var.label = "V1.5.cat3日子过的快不快乐三分类",
val.labels = c("不快乐","快乐","无法选择"),
as.num = FALSE #设置为类别变量
)
#变量转换(2):A8->edu.cat5
TCS2015sc$edu.cat5 <- rec(TCS2015sc$A8, #使用rec函数重新编码
rec = "1:3=1; 4:5=2; 6:9=3; 10:15=4; 16:21=5",
var.label = "edu.cat5受教育程度五分类",
val.labels = c("小学及以下","初中","高中职", "专科",
"本科及以上"),
as.num = FALSE #设定为类别变量
)
#调用base套件中的levels函数,赋予变量值标签
levels(TCS2015sc$V1.5.cat3) <- c("不快樂", "快乐", "無法选择")
levels(TCS2015sc$edu.cat5) <- c("小学及以下", "初中", "高中职", "专科", "本科及以上")
#呈现交叉分析表(观察值, 期望值,row%,皮尔森卡方值)
library(descr) #調用descr套件
crosstab(TCS2015sc$edu.cat5, TCS2015sc$V1.5.cat3, #使用crosstab函数
TCS2015sc$weight1, #加权
prop.r = TRUE, # 顯示row百分比
expected = TRUE, #顯示期望值
chisq = TRUE)# 顯示皮尔森卡方值
## Cell Contents
## |-------------------------|
## | Count |
## | Expected Values |
## | Row Percent |
## |-------------------------|
##
## =============================================================
## V1.5.cat3日子过的快不快乐三分类
## edu.cat5受教育程度五分类 不快樂 快乐 無法选择 Total
## -------------------------------------------------------------
## 小学及以下 37 249 4 290
## 36.8 245.1 8.1
## 12.8% 85.9% 1.4% 14.5%
## -------------------------------------------------------------
## 初中 42 171 6 219
## 27.8 185.1 6.1
## 19.2% 78.1% 2.7% 10.9%
## -------------------------------------------------------------
## 高中职 69 444 13 526
## 66.7 444.6 14.7
## 13.1% 84.4% 2.5% 26.3%
## -------------------------------------------------------------
## 专科 30 211 7 248
## 31.4 209.6 6.9
## 12.1% 85.1% 2.8% 12.4%
## -------------------------------------------------------------
## 本科及以上 76 618 26 720
## 91.3 608.6 20.1
## 10.6% 85.8% 3.6% 35.9%
## -------------------------------------------------------------
## Total 254 1693 56 2003
## =============================================================
##
## Statistics for All Table Factors
##
## Pearson's Chi-squared test
## ------------------------------------------------------------
## Chi^2 = 15.28888 d.f. = 8 p = 0.0538
##
## Minimum expected frequency: 6.122816
期望值的計算公式如下:(Salkind & show, 2020: 690)
图- 期望值计算公示
舉例來說,
图7 中,edu.cat5的第1类(小学及以下)和V1.5.cat3的第2类(快乐)所形成的交叉细格中,观察值(count)=249,期望值(Expected Values)=245.1。 这个245.1,其实等于该方格所对应row的边缘次数290,乘以col的边缘次数1693,再除以总次数2003而得,即(290*1693)/2003=245.1。其他细格内的期望次数,可依理类推。
图- 期望值计算示例
根据皮尔森卡方值的计算公式,我们可以手动计算皮尔森卡方值,程式代码例示如下:
x2<-(37-36.8)^2/36.8 + (249-245.1)^2 /245.1+ (4-8.1)^2/8.1 +
(42-27.8)^2/27.8 +(171-185.1)^2/185.1+(6-6.1)^2/6.1+
(69-66.7)^2/66.7+(444-444.6)^2/444.6+(13-14.7)^2/14.7+
(30-31.4)^2/31.4+(211-209.6)^2/209.6+(7-6.9)^2/6.9+
(76-91.3)^2/91.3+(618-608.6)^2/608.6+(26-20.1)^2/20.1
print(x2) #(should be: 15.25833=交叉表中出现的数据15.28888
## [1] 15.25833
交叉分析表中的「自由度」(degree of freedom,df)=(r-1)(c-1)。此例,r=5, c=3, (r-1)(c-1) = (5-1)*(3-1) = 8
如果两变量无关,则在自由度=8的情况下,得到此一卡方值=15.258的概率(P),会是多少呢? 根据图7,我们知道此一概率P为0.0543,可看成p=0.05(小数点第3位四舍五入)。
图 卡方检验与对应的概率P示例
我们可以透过R的stats套件”pchisq”函数,来得到卡方值15.258所对应的概率(P)。
library(stats)#调用stats套件
#使用stats套件的pchisq函数,计算某一特定卡方值所对应的概率(P)
pchisq(15.258, 8,) #(卡方值, 自由度)计算左尾到卡方值的面积(0.9457)
## [1] 0.9456813
1-pchisq(q=15.258, df=8)#计算卡方值右边的面积(should be 0.0543)
## [1] 0.05431874
#or
pchisq(q=15.258, df=8,lower.tail = F) #(卡方值, 自由度,计算卡方值右边面积)
## [1] 0.05431874
#(should be 0.0543)
95%置信水平(只容许5%的错误),自由度=8的情况下,拒决或接受H0的临界值,会是多少呢? 根据图,我们知道此一卡方临界值为15.507。
library(stats)#调用stats套件
qchisq(p=.05, df=8, lower.tail=F) #should be 15.50731
## [1] 15.50731
图 95%置信水平,自由度=8的卡方临界值示例
Cramer’s V的计算公式如下:(Everitt, 1992: 55)
图 Cramer’s V的计算公式
如果将图7 的相关数据代入公式,我们即可以计算得到Cramer’s V数据=0.0616 χ2=15.25833 n=2003 min(c-1,r-1)=min(3-1,5-1)=min(2,4)=2
sqrt ((15.25833 /2003) / min(3-1,5-1))
## [1] 0.06171604
sqrt (0.0076/2)
## [1] 0.06164414
0.0616
## [1] 0.0616
另外,我們也可调用sjstats套件的weighted_chisqtest函数, 得到Cramer’s V=0.0618
library(sjstats) #调用sjstats套件
#使用weighted_chisqtest函数,计算加权后的卡方统计值
weighted_chisqtest(TCS2015sc, edu.cat5, V1.5.cat3,weights = weight1)
##
## # Measure of Association for Contingency Tables
##
## Chi-squared: 15.2889
## Cramer's V: 0.0618
## df: 8
## p-value: 0.054
## Observations: 2003
#Chi-squared: 15.2889
#Cramer's V: 0.0618
#df=8
#p-value: 0.054
此外,也可以调用RCPA3套件的CramersV函数,得到Cramer’s V=0.062
library(RCPA3)#调用poliscidata套件
##
## 载入程辑包:'RCPA3'
## The following objects are masked from 'package:descr':
##
## compmeans, crosstab, freq
## The following object is masked from 'package:plyr':
##
## ddply
#使用CramersV函数
CramersV(15.289, 5, 3, 2003) #(卡方值,row类别数,col類別数,n样本数)
## [1] 0.06177803
#should be 0.06177803=0.062
调整后标准化残差的计算公式如下:(from: Agresti ,2018: 225; Everitt, 1992:47)
Oij 所在方格的 观察 样本数 Eij
所在方格的 期望 样本数 mi 所在方格的 row边缘 样本数 nj 所在方格的
col边缘 样本数
如果将图 的数据代入公式,以「初中教育程度&不快乐」的受访者為例, 此类受访者的调整后标准化残差=3.053898
ASR <- (42-27.8) / sqrt(27.8*(1-(219/2003)) * (1-(254/2003)))
print(ASR) #should be 3.053898
## [1] 3.053898
这个公式很容易理解,就是以皮尔森卡方值为基础,但在公式分子的地方,再减去0.5
图 Yates’ continuity correction 卡方值的计算公式
φ(Phi)的公式,很容易理解,就是将卡方值除以样本数后,再取平方根。 值域介于[0~无限大] (Everitt, 1992: 54)
图7 φ(Phi)的的计算公式
Pullock, Philip H.III, & Edwards, Barry C. (2022). An R companion to political analysis (3rd ed.). Thousand Oaks, CA: SAGE Publications & CQ Press. Ch10. pp.300-319.
Pullock, Philip H.III, & Edwards, Barry C. (2020). The essentials of political analysis (6th ed.). Thousand Oaks, CA: SAGE Publications & CQ Press. Ch10. pp.259-274.
Salkind, Neil J., & Shaw, Leslie A. (2020). Statistics for people who (think they) hate statistics using R. Thousand Oaks, CA: SAGE Publications, Inc. Ch.19
Fogarty, Brian J. (2019). Quantitative social sciences data with R: An introduction. Thousand Oaks, CA: SAGE Publications, Inc. Ch10. pp.241-261.
刘正山(2019)。《民意调查资料分析的R实战手册》. 台北:五南。Ch6. pp.140-150。
邱皓政(2019)《量化研究與統計分析:SPSS與R資料分析範例解析》(六版)。台北:五南。Ch.6。
Everitt, B. S. (1992). The analysis of contingency tables (2nd ed.). London: Chapman & Hall. Ch2. PP.11-14; Ch3.pp.38-47.