1 工作环境设置

我们通常会将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)

2 使用时机

在传播研究中,我们经常需要探索两个变量之间的关系,例如,A变量的变化会不会与B变量 的变化有关系?B变量的变化会不会因为A变量的不同变化而有差异?当自变量与因变量两者 皆属于类别变量时,我们一般会通过百分比比较分析,来探索两者之间的关系,最常用的是 “交叉分析与卡方检验”。

3 R*C 交叉分析(一):sjPlot::tab_xtab

假设我们想要知道,民众的”快乐感”(分为:不快乐、快乐、无法选择三类),会不会因为受 教育程度的不同(分为:小学及以下、初中、高中职、专科、本科及以上五类)而有差异? 我们该如何使用R软进行分析呢?

3.1 Step 1:将资料档汇入到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"

3.2 Step 2:呈现分析变量的频数分布

在TCS2015sc数据档中,变量V1.5是快乐程度,将其设置为因变量;A8是教育程度,将其设 置为自变量。我们可以使用sjmisc套件的frq函数,呈现这两个变量的频数分布。

library(sjmisc)#调用sjmisc套件
frq(TCS2015sc$V1.5,out = "v")#使用frq函数做V1.5的频数分布
V1.5. 整体来说,你觉得目前的日子过得快不快乐? (x) <categorical>
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的频数分布
A8. 教育程度 (x) <categorical>
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

3.3 Step 3:进行变量的编码转换

3.3.1 将变量重新编码(1):V1.5(过的快不快乐)(5分类) -> V1.5.cat3(3分类)

将原始变量(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>

3.3.2 将变量重新编码(2):A8(教育程度)(21分类) -> edu.cat5(5分类),

将原始变量(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的频数分布
edu.cat5受教育程度五分类 (x) <categorical>
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

3.4 Step 4:呈现交叉分析频数百分比表

在进行交叉分析时,每个交叉细格通常可以呈现三种百分比:row%, col%, 以及total%。 学习者最困扰的是,不知要选择哪一种百分比作为比较的标准。 我们的建议是:「呈现自变量所在的百分比」。 如果我们想将自变量放在表格的「左边」,就要呈现「row」百分比。(这也是作者所 偏好的交叉表呈现方式)。

3.4.1 呈现方式(1):自变量在row, 因变量在column

就此处例子来说,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 简体中文电脑

3.4.2 呈现方式(2):自变量在column, 因变量在row

另外一种呈现方式是将自变量放在表格的「上头」,此时就要呈现「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 简体中文电脑

3.5 Step 5:呈现交叉分析频数百分比图

在进行交叉分析时,我们也可以调用sjPlot套件的plot_xtab函数,呈现交叉分析百分比的 条形图(type=“bar”)以及折线图(type=“line”),以视觉化的方式,查看两变量间的关系。

3.5.1 呈现方式(1):交叉分析频数百分比条形图

自变量在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)#加权

3.5.2 呈现方式(2):交叉分析频数百分比折线图

自变量在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)#加权

3.5.3 呈现方式(3):交叉分析频数百分比雷达图

#输入表格资料
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)

3.6 Step 6:呈现卡方检验值,对应的P值,以及Cramer’s V

为了要检验在”样本”交叉表中(例如: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民众的”受教育程度”)而存在显著差异时,我们进一步可以观察交叉 方格的”调整后标准化残差”,判断到底是哪一类别或哪一细格产生显着差异。

3.7 Step 7:呈现交叉方格的调整后标准化残差

要观察卡方检验的显着差异是发生在那一方格,需要借重”调整后标准化残差”(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)

4 R*C 交叉分析(二):RCPA3::crosstabC

#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

5 2*2 交叉分析

22表格交叉分析基本上和R*C表格有着相同的分析步骤; 但22交叉分析在卡方值的选择上,主要是以Yates’s Continuity correction的卡方值, 来代替Pearson卡方值;而在相关系数上,则是选择使用φ(读做Phi)(0~无限大),来代替 Cramer’s V值,做为相关系数的测量统计值。 此处一样以具体例子来展示2*2表格的交叉分析步骤。

5.1 Step 1:将资料档汇入到R

rm(list = ls()) #清除记忆体中所有物件与资料
#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R
TCS2015sc <- read_spss("TCS2015sc.sav")
## Converting atomic to factors. Please wait...

5.2 Step 2:进行编码转换

5.2.1 将变量重新编码(1):V1.5(过的快不快乐)(5分类) -> V1.5.cat2(2分类)

此处先将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频数分布
V1.5.cat2日子过的快不快乐二分类 (x) <categorical>
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

5.2.2 将变量重新编码(2):A1(性别)->sex(2分类)

将原始变量(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频数分布
sex性别 (x) <categorical>
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

5.3 Step 3:呈现2*2表格交叉分析+Yates’ continuity correction卡方检验+相关系数φ

此处我们使用两种方式来呈现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(逻辑回归时),必定会用到这组概念,此处先简单介绍。

6 交叉分析卡方检验的前提及违反前提时之处理

进行交叉分析卡方检验时,有一个重要的前提是:“期望值”小于5的方格数,不能超过 全部方格数的20%;如果超过,研究者需要将变量进行适度的类别合并,再进行卡方检验, 这样得到的卡方值以及p值检验,才会是比较正确的。(Everitt, 1992:39)

什么是”期望值”呢?“期望值”(expected value)指的是如果兩变量无关,则交叉表格中每一 方格内理论上应该要出现的期望次数。具体来说,就是如果自变量在该方格内的反应比例与 总体的反应比例并无二致的话,理论上该方格应该要出现的期望次数。

至于合并类别的原则,一般的经验是,自变量与因变量的交叉方格数目,最好不要超过 40(R*C <=40)(Fogarty, 2019: 241)。 实务上,自变量与因变量的类别数,各以6类以下为宜,

6.1 一个不佳的交叉分析卡方检验例子

此处以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的频数分布
年龄分层 (x) <categorical>
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- 不佳的交叉分析卡方检验示例

图 不佳的交叉分析卡方检验示例

6.2 合并类别后重新进行交叉分析卡方检验

6.2.1 Step 1:重新载入资料档

rm(list = ls()) #清除记忆体中所有物件与资料

#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R
TCS2015sc <- read_spss("TCS2015sc.sav")
## Converting atomic to factors. Please wait...

6.2.2 Step 2:进行编码转换

6.2.2.1 将变量重新编码(1):V1.5(过的快不快乐)(5分类) -> V1.5.cat3(3分类)

将原始变量(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频数分布
V1.5. 整体来说,你觉得目前的日子过得快不快乐? (x) <categorical>
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的频数分布
V1.5.cat3快不快乐三分类 (x) <categorical>
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

6.2.2.2 将变量重新编码(2):age_strata(年龄分层)(7分类) -> age.cat5(5分类)

将原始变量(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的频数分布
age.cat5年龄五分类 (x) <categorical>
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

6.2.3 Step 3:呈现交叉分析及卡方检验(合并类别后)

经过对于变量类别进行合并后,统计报表显示,重新进行的卡方检验结果,并无任何一个方 格的期望值小于或等于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

7 补充:一些以卡方检验为基础统计数据的计算

7.1 皮尔森卡方值的计算公式

数学公式如下图:(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

7.2 每一细格内期望值的计算

期望值的計算公式如下:(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。其他细格内的期望次数,可依理类推。

图- 期望值计算示例

7.3 手动计算皮尔森卡方值

根据皮尔森卡方值的计算公式,我们可以手动计算皮尔森卡方值,程式代码例示如下:

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

7.4 df(自由度)的计算

交叉分析表中的「自由度」(degree of freedom,df)=(r-1)(c-1)。此例,r=5, c=3, (r-1)(c-1) = (5-1)*(3-1) = 8

7.5 P值的计算

如果两变量无关,则在自由度=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)

7.6 临界值的计算

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的卡方临界值示例

7.7 Cramer’s V的计算公式

Cramer’s V的计算公式如下:(Everitt, 1992: 55)

图 Cramer’s V的计算公式

7.7.1 获得Cramers’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

7.7.2 获得Cramers’s V的第二种方法

另外,我們也可调用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

7.7.3 获得Cramers’s V的第三种方法

此外,也可以调用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

7.8 调整后标准化残差的计算公式

调整后标准化残差的计算公式如下:(from: Agresti ,2018: 225; Everitt, 1992:47)

图7 调整后标准化残差的计算公式 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

7.9 Yates’ continuity correction 卡方值的计算公式

这个公式很容易理解,就是以皮尔森卡方值为基础,但在公式分子的地方,再减去0.5

图 Yates’ continuity correction 卡方值的计算公式

7.10 Phi的计算公式

φ(Phi)的公式,很容易理解,就是将卡方值除以样本数后,再取平方根。 值域介于[0~无限大] (Everitt, 1992: 54)

图7 φ(Phi)的的计算公式

8 本讲参考文献

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.