写在前面
R语言拥有丰富的数据处理、统计分析和机器学习工具包,涵盖了从简单的描述统计到复杂的模型建立的各个方面。再加上数据的处理可以完美的衔接后续的可视化,这使得它成为处理各种类型和规模的数据集的理想选择。
完整R语言教程和测试数据可见:R语言基础学习手册
7.1 描述性统计分析
总体反应连续型变量的中心趋势、变化性和分布形状的分析方法。
7.1.1 基本方法
1) summary()函数:提供数值型变量的max,min,mean,四分位数;描述因子向量和逻辑向量的频数统计。
语法:
summary(x)
举例:
mycars <- c("mpg","hp","wt")
summary(mtcars[mycars])
## mpg hp wt
## Min. :10.40 Min. : 52.0 Min. :1.513
## 1st Qu.:15.43 1st Qu.: 96.5 1st Qu.:2.581
## Median :19.20 Median :123.0 Median :3.325
## Mean :20.09 Mean :146.7 Mean :3.217
## 3rd Qu.:22.80 3rd Qu.:180.0 3rd Qu.:3.610
## Max. :33.90 Max. :335.0 Max. :5.424
2) sapply()函数
语法:
sapply(x,FUN,options)
x:是一个向量、列表或数据框,表示要应用函数的对象。
FUN:是要应用的函数。可以是内置的 R 函数(eg:sd、mean、min、length等)、匿名函数(使用 function(x) 形式定义的函数),或者自定义的函数。
options:指定选项的值
举例:
mystats <- function(x,na.omit=FALSE){
if(na.omit)
x <- x[!is.na(x)]
m <- mean(x)
n <- length(x)
s <- sd(x)
skew <- sum((x-m)^3/s^3)/n
kurt <- sum((x-m)^3/s^4)/n-3
return(c(n=n,mean=m,stdev=s,skew=skew,kurtosis=kurt))
}#这里的mystats就是一个function定义的匿名函数
myvars <- c("mpg","hp","wt")
sapply(mtcars[myvars],mystats)#这里用中括号是选择特定列
## mpg hp wt
## n 32.000000 32.0000000 32.0000000
## mean 20.090625 146.6875000 3.2172500
## stdev 6.026948 68.5628685 0.9784574
## skew 0.610655 0.7260237 0.4231465
## kurtosis -2.898679 -2.9894108 -2.5675372
除了以上两种,还有用户贡献的包中包含描述性统计函数,包例如Hmisc,pastecs,psych,skimr,summytools
3) Hmisc包中的describe()函数:变量和观测值的数量、缺失值和唯一值的数目、均值、分位数,最大和最小的5个值
语法:
install.packages("Hmisc")
library(Hmisc)
describe(x)
举例:
library(Hmisc)
## Warning: 程辑包'Hmisc'是用R版本4.3.2 来建造的
##
## 载入程辑包:'Hmisc'
## The following objects are masked from 'package:dplyr':
##
## src, summarize
## The following objects are masked from 'package:base':
##
## format.pval, units
myvars <- c("mpg","hp","wt")
describe(mtcars[myvars])
## mtcars[myvars]
##
## 3 Variables 32 Observations
## --------------------------------------------------------------------------------
## mpg
## n missing distinct Info Mean Gmd .05 .10
## 32 0 25 0.999 20.09 6.796 12.00 14.34
## .25 .50 .75 .90 .95
## 15.43 19.20 22.80 30.09 31.30
##
## lowest : 10.4 13.3 14.3 14.7 15 , highest: 26 27.3 30.4 32.4 33.9
## --------------------------------------------------------------------------------
## hp
## n missing distinct Info Mean Gmd .05 .10
## 32 0 22 0.997 146.7 77.04 63.65 66.00
## .25 .50 .75 .90 .95
## 96.50 123.00 180.00 243.50 253.55
##
## lowest : 52 62 65 66 91, highest: 215 230 245 264 335
## --------------------------------------------------------------------------------
## wt
## n missing distinct Info Mean Gmd .05 .10
## 32 0 29 0.999 3.217 1.089 1.736 1.956
## .25 .50 .75 .90 .95
## 2.581 3.325 3.610 4.048 5.293
##
## lowest : 1.513 1.615 1.835 1.935 2.14 , highest: 3.845 4.07 5.25 5.345 5.424
## --------------------------------------------------------------------------------
4) pastecs包中的stat.desc()函数
语法:
stat.desc(x,basic=TRUE,desc=TRUE,norm=FALSE,p=0.95)
x:要计算统计描述的向量。
basic:一个逻辑值,指示是否计算基本的统计描述。如果设置为 TRUE,则计算最小值、最大值、均值、中位数、标准差和样本大小。默认值为 TRUE。
desc:一个逻辑值,指示是否计算更详细的统计描述。如果设置为 TRUE,则计算偏度、峰度和各种分位数(例如四分位数和百分位数)。默认值为 TRUE。
norm:一个逻辑值,指示是否进行正态性检验。如果设置为 TRUE,则进行正态性检验。默认值为 FALSE。
p:置信水平,用于计算置信区间。默认值为 0.95,表示计算 95% 置信区间。
举例(需安装pastecs包):
library(pastecs)
## Warning: 程辑包'pastecs'是用R版本4.3.2 来建造的
##
## 载入程辑包:'pastecs'
## The following objects are masked from 'package:dplyr':
##
## first, last
myvars <- c("mpg","hp","wt")
stat.desc(mtcars[myvars])
## mpg hp wt
## nbr.val 32.0000000 32.0000000 32.0000000
## nbr.null 0.0000000 0.0000000 0.0000000
## nbr.na 0.0000000 0.0000000 0.0000000
## min 10.4000000 52.0000000 1.5130000
## max 33.9000000 335.0000000 5.4240000
## range 23.5000000 283.0000000 3.9110000
## sum 642.9000000 4694.0000000 102.9520000
## median 19.2000000 123.0000000 3.3250000
## mean 20.0906250 146.6875000 3.2172500
## SE.mean 1.0654240 12.1203173 0.1729685
## CI.mean.0.95 2.1729465 24.7195501 0.3527715
## var 36.3241028 4700.8669355 0.9573790
## std.dev 6.0269481 68.5628685 0.9784574
## coef.var 0.2999881 0.4674077 0.3041285
5) psych包中的describe()函数
语法:
describe(x)
举例(需安装psych包):
library(psych)
## Warning: 程辑包'psych'是用R版本4.3.2 来建造的
##
## 载入程辑包:'psych'
## The following object is masked from 'package:Hmisc':
##
## describe
## The following objects are masked from 'package:scales':
##
## alpha, rescale
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
myvars <- c("mpg","hp","wt")
describe(mtcars[myvars])
## vars n mean sd median trimmed mad min max range skew kurtosis
## mpg 1 32 20.09 6.03 19.20 19.70 5.41 10.40 33.90 23.50 0.61 -0.37
## hp 2 32 146.69 68.56 123.00 141.19 77.10 52.00 335.00 283.00 0.73 -0.14
## wt 3 32 3.22 0.98 3.33 3.15 0.77 1.51 5.42 3.91 0.42 -0.02
## se
## mpg 1.07
## hp 12.12
## wt 0.17
pysch和Hmisc包中均有describ()函数,一般最后加载的包优先
7.1.2 分组计算描述性统计量
前面学习的都是反映数据整体的描述性统计量,而在比较多组个体或观测值时需要关注各组的描述性统计量。一般用by()函数
语法:
by(data,Indices,FUN)
by(data,list(),FUN)
data:指定要进行分组和计算的数据框、数据表或向量。
Indices:指定用于分组的索引变量。可以是单个变量名或变量的列表,当对多个变量分组做描述性统计时,即用到list()。
FUN:是要应用于每个分组的函数。可以是内置的 R 函数、匿名函数或自定义的函数。
举例:
dstats <- function(x)sapply(x,mystats)
myvars <- c("mpg","hp","wt")
by(mtcars[myvars],
list(Transmission=mtcars$am,
Engine=mtcars$vs),
dstats)#这里的FUN引用的是前面sapply函数中的用function自定义的mystats函数
## Transmission: 0
## Engine: 0
## mpg hp wt
## n 12.0000000 12.0000000 12.0000000
## mean 15.0500000 194.1666667 4.1040833
## stdev 2.7743959 33.3598379 0.7683069
## skew -0.2843325 0.2785849 0.8542070
## kurtosis -3.1024845 -2.9916491 -1.8881956
## ------------------------------------------------------------
## Transmission: 1
## Engine: 0
## mpg hp wt
## n 6.0000000 6.0000000 6.00000000
## mean 19.7500000 180.8333333 2.85750000
## stdev 4.0088652 98.8158219 0.48672117
## skew 0.2050011 0.4842372 0.01270294
## kurtosis -2.9488631 -2.9950996 -2.97390099
## ------------------------------------------------------------
## Transmission: 0
## Engine: 1
## mpg hp wt
## n 7.0000000 7.0000000 7.0000000
## mean 20.7428571 102.1428571 3.1942857
## stdev 2.4710707 20.9318622 0.3477598
## skew 0.1014749 -0.7248459 -1.1532766
## kurtosis -2.9589349 -3.0346288 -6.3163019
## ------------------------------------------------------------
## Transmission: 1
## Engine: 1
## mpg hp wt
## n 7.0000000 7.0000000 7.0000000
## mean 28.3714286 80.5714286 2.0282857
## stdev 4.7577005 24.1444068 0.4400840
## skew -0.3474537 0.2609545 0.4009511
## kurtosis -3.0730297 -2.9891919 -2.0889215
7.1.3 用dplyr做交互式汇总描述性统计
dplyr中summarize()和summarize_all()可以计算任何指定的统计量,group_by()可用来指定要计算这些统计量的分组。
这里用carData包中的Salaries数据框举例。
library(dplyr)
library(carData)
## Warning: 程辑包'carData'是用R版本4.3.2 来建造的
head(Salaries)
## rank discipline yrs.since.phd yrs.service sex salary
## 1 Prof B 19 18 Male 139750
## 2 Prof B 20 16 Male 173200
## 3 AsstProf B 4 3 Male 79750
## 4 Prof B 45 39 Male 115000
## 5 Prof B 40 41 Male 141500
## 6 AssocProf B 6 6 Male 97000
举例1:397名教授的薪水中位数和薪水范围是多少?
Salaries %>%
summarise(med=median(salary),
min=min(salary),
max=max(salary))
## med min max
## 1 107300 57800 231545
举例2:不同性别和级别的教授数量,薪水的中位数和薪资范围是多少?
Salaries %>%
group_by(rank,sex) %>%
summarise(n=length(salary),
med=median(salary),
min=min(salary),
max=max(salary))
## `summarise()` has grouped output by 'rank'. You can override using the
## `.groups` argument.
## # A tibble: 6 × 6
## # Groups: rank [3]
## rank sex n med min max
## <fct> <fct> <int> <dbl> <int> <int>
## 1 AsstProf Female 11 77000 63100 97032
## 2 AsstProf Male 56 80182 63900 95079
## 3 AssocProf Female 10 90556. 62884 109650
## 4 AssocProf Male 54 95626. 70000 126431
## 5 Prof Female 18 120258. 90450 161101
## 6 Prof Male 248 123996 57800 231545
举例3:不同性别和级别的教授平均任职年限和获得博士后的平均任职年限是多少,以及中位数?
Salaries %>%
group_by(rank,sex) %>%
select(yrs.service,yrs.since.phd) %>%
summarise_all(list(mean=mean,med=median))
## Adding missing grouping variables: `rank`, `sex`
## # A tibble: 6 × 6
## # Groups: rank [3]
## rank sex yrs.service_mean yrs.since.phd_mean yrs.service_med
## <fct> <fct> <dbl> <dbl> <dbl>
## 1 AsstProf Female 2.55 5.64 3
## 2 AsstProf Male 2.34 5 3
## 3 AssocProf Female 11.5 15.5 9.5
## 4 AssocProf Male 12.0 15.4 8
## 5 Prof Female 17.1 23.7 17
## 6 Prof Male 23.2 28.6 22
## # ℹ 1 more variable: yrs.since.phd_med <dbl>
select()函数用于选择数据框中的列,list()用来指定多个统计量
7.2 频数和列联表
聚焦分类型变量的频数、列联表和相应的独立性检验、相关性的度量和图形化展示方法。
7.2.1 生成频数表
用于创建和处理列联表的函数:

1) 一维列联表
使用的是vcd包中的Arthritis数据集
语法:
library(vcd)
head(Arthritis)
## ID Treatment Sex Age Improved
## 1 57 Treated Male 27 Some
## 2 46 Treated Male 29 None
## 3 77 Treated Male 30 None
## 4 17 Treated Male 32 Marked
## 5 36 Treated Male 46 Marked
## 6 23 Treated Male 58 Marked
mytable <- with(Arthritis,table(Improved))
mytable
## Improved
## None Some Marked
## 42 14 28
用prop.table()将频数转化为比例值:
mytable <- prop.table(mytable)
mytable
## Improved
## None Some Marked
## 0.5000000 0.1666667 0.3333333
用prop.table()*100将频数转化为百分比:
mytable <- prop.table(mytable)*100
mytable
## Improved
## None Some Marked
## 50.00000 16.66667 33.33333
2) 二维列联表
语法1:
mytable <- table(A,B)#A为行变量,B为列变量
语法2:
mytable <-xtabs(~A+B,data=mydata)
~ A + B 是一个公式,指定了要在交叉表中交叉的两个变量 A 和 B。~ 符号表示使用公式语法。交叉表将统计变量 A 和 B 之间的频数或频率分布。
data = mydata 指定数据集 mydata,它是包含变量 A 和 B 的数据框或数据集。
举例:
mytable <-xtabs(~Treatment+Improved,data=Arthritis)
mytable
## Improved
## Treatment None Some Marked
## Placebo 29 7 7
## Treated 13 7 21
(1)使用prop.table()生成比例:
margins=1是使得每一行的比例之和为1,margins=2时使得每一列的比例之和为1,不设置margin时,所有单元格比例之和为1
mytable1 <-prop.table(mytable,1)
mytable1
## Improved
## Treatment None Some Marked
## Placebo 0.6744186 0.1627907 0.1627907
## Treated 0.3170732 0.1707317 0.5121951
mytable2 <- prop.table(mytable,2)
mytable2
## Improved
## Treatment None Some Marked
## Placebo 0.6904762 0.5000000 0.2500000
## Treated 0.3095238 0.5000000 0.7500000
mytable3 <- prop.table(mytable)
mytable3
## Improved
## Treatment None Some Marked
## Placebo 0.34523810 0.08333333 0.08333333
## Treated 0.15476190 0.08333333 0.25000000
(2)使用margin.table()生成边际频数之和:
margins=1是代指行变量,margins=2代指列变量
mytable1 <-margin.table(mytable,1)
mytable1
## Treatment
## Placebo Treated
## 43 41
mytable2 <- margin.table(mytable,2)
mytable2
## Improved
## None Some Marked
## 42 14 28
(3)使用addmargins()生成边际频数之和:
这里需要注意:margins=1是会添加一个新行来反应列的频数之和,margins=2会添加一个新列来反应行的频数之和,不做margin设定则在最后一行和一列均添加频数之和
addmargins(mytable)
## Improved
## Treatment None Some Marked Sum
## Placebo 29 7 7 43
## Treated 13 7 21 41
## Sum 42 14 28 84
addmargins(mytable,1)
## Improved
## Treatment None Some Marked
## Placebo 29 7 7
## Treated 13 7 21
## Sum 42 14 28
addmargins(mytable,2)
## Improved
## Treatment None Some Marked Sum
## Placebo 29 7 7 43
## Treated 13 7 21 41
3) 二维列联表的特殊格式
gmodels包中的CrossTable()函数可生成类似于SAS或SPSS形式的二维列联表
install.packages("gmodels")
library(gmodels)
## Warning: 程辑包'gmodels'是用R版本4.3.2 来建造的
CrossTable(Arthritis$Treatment,Arthritis$Improved)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 84
##
##
## | Arthritis$Improved
## Arthritis$Treatment | None | Some | Marked | Row Total |
## --------------------|-----------|-----------|-----------|-----------|
## Placebo | 29 | 7 | 7 | 43 |
## | 2.616 | 0.004 | 3.752 | |
## | 0.674 | 0.163 | 0.163 | 0.512 |
## | 0.690 | 0.500 | 0.250 | |
## | 0.345 | 0.083 | 0.083 | |
## --------------------|-----------|-----------|-----------|-----------|
## Treated | 13 | 7 | 21 | 41 |
## | 2.744 | 0.004 | 3.935 | |
## | 0.317 | 0.171 | 0.512 | 0.488 |
## | 0.310 | 0.500 | 0.750 | |
## | 0.155 | 0.083 | 0.250 | |
## --------------------|-----------|-----------|-----------|-----------|
## Column Total | 42 | 14 | 28 | 84 |
## | 0.500 | 0.167 | 0.333 | |
## --------------------|-----------|-----------|-----------|-----------|
##
##
4) 多维列联表
刚刚用的函数均可以基于三维或更多的分类变量生成多维列联表,另外ftable()可以一种紧凑且吸引人的方式输出多维列联表
mytable <- xtabs(~Treatment+Sex+Improved,data = Arthritis) #xtabs(~A+B+C)中的ABC分别对应x、y、z
mytable
## , , Improved = None
##
## Sex
## Treatment Female Male
## Placebo 19 10
## Treated 6 7
##
## , , Improved = Some
##
## Sex
## Treatment Female Male
## Placebo 7 0
## Treated 5 2
##
## , , Improved = Marked
##
## Sex
## Treatment Female Male
## Placebo 6 1
## Treated 16 5
ftable(mytable)
## Improved None Some Marked
## Treatment Sex
## Placebo Female 19 7 6
## Male 10 0 1
## Treated Female 6 5 16
## Male 7 2 5
7.2.2 独立性检验
独立性检验是统计学中常用的一种假设检验方法,用于确定两个或多个分类变量之间是否存在显著的关联或独立性。在R中,独立性检验的应用场景包括以下几个方面:
-
1)列联表分析:独立性检验可用于分析列联表数据,即两个分类变量之间的交叉表。通过独立性检验,可以确定这两个变量之间是否存在显著的关联。常见的独立性检验方法包括卡方检验(chi-square test)和 Fisher精确检验(Fisher's exact test)。
-
2)实验设计分析:在实验设计中,独立性检验可用于确定处理因素(例如不同的治疗方法或处理组)和响应变量(例如疾病治愈率或满意度评分)之间的关联。独立性检验可以帮助确定处理因素是否对响应变量产生显著影响。
-
3)财务分析:独立性检验可用于分析财务数据中的变量之间的关联。例如,可以使用独立性检验来确定公司的销售额是否与广告支出存在显著关联,或者是否存在与经济指标相关的财务变量。
-
4)社会科学研究:独立性检验在社会科学研究中也有广泛应用。例如,可以使用独立性检验来分析调查数据,以确定个人的性别是否与其政治观点存在关联,或者个人的教育水平是否与其收入水平相关。
-
5)医学研究:在医学研究中,独立性检验可用于确定两个或多个因素之间是否存在关联。例如,可以使用独立性检验来确定某种治疗方法是否与患者康复状况之间存在关联,或者某种疾病是否与食物摄入习惯之间存在关联。
(1)卡方独立性检验chisq.test(),是检验二维表的行列变量之间是否独立
原假设是相互独立,当P<0.05则拒绝原假设,两者之间不独立有关联;P>0.05接受原假设,两者之间独立。
library(vcd)
mytable <- xtabs(~Treatment+Improved,data = Arthritis)
chisq.test(mytable)
##
## Pearson's Chi-squared test
##
## data: mytable
## X-squared = 13.055, df = 2, p-value = 0.001463
P<0.05,说明两者之间有关联,不独立。
(2)Fisher精确检验fisher.test(),是检验二维表的行列变量之间是否独立
原假设是相互独立,当P<0.05则拒绝原假设,两者这间不独立有关联;P>0.05接受原假设,两者之间独立。
library(vcd)
mytable <- xtabs(~Treatment+Improved,data = Arthritis)
fisher.test(mytable)
##
## Fisher's Exact Test for Count Data
##
## data: mytable
## p-value = 0.001393
## alternative hypothesis: two.sided
P<0.05,说明两者之间有关联,不独立。
(3)Cochran-Mantel-Haenszel检验mantelhaen.test()
原假设两个名义变量在第三个变量的每一层中都是条件独立的。
library(vcd)
mytable <- xtabs(~Treatment+Improved+Sex,data = Arthritis)
mantelhaen.test(mytable)
##
## Cochran-Mantel-Haenszel test
##
## data: mytable
## Cochran-Mantel-Haenszel M^2 = 14.632, df = 2, p-value = 0.0006647
P<0.05,因此说明在不同性别下,药物和治疗效果之间都具有联系,不独立。
7.2.3 相关性度量
当前面独立性检验后发现不独立,则下一步考虑相关性的强弱。
vcd包中的assocstate()函数可以操作。
7.3 相关分析
描述定量变量之间的关系,+和---分别为正、负相关,值反应相关的强弱程度,完全不相关为0,完全相关为1。
首先明确一下协方差和相关性的关系和差异:
协方差和相关性是用于衡量两个变量之间关系的统计量,它们在某种程度上相关,但并不完全相同。
a.协方差(Covariance)衡量的是两个变量的总体间的线性关系强度和方向。协方差可以为正、负或零,具体取决于两个变量的线性关系。协方差的值越大(正或负),表示两个变量之间的线性关系越强。但协方差的值本身并不能直接用来比较不同数据集之间的关系强度,因为它受到变量单位的影响。
b.相关性(Correlation)衡量的是两个变量之间的线性关系强度和方向,但它还考虑了变量的标度差异。相关性的取值范围在-1到1之间,其中-1表示完全负相关,1表示完全正相关,0表示不存在线性关系。相关性的值不受变量单位的影响,因此可以用来比较不同数据集之间的线性关系强度。
7.3.1 皮尔逊Pearson,斯皮尔曼Spearman,肯德尔Kendall相关系数
1) 语法和参数
语法:
cor(x,use=,method=)
x:一个数值向量、矩阵或数据框,包含要计算相关性的变量。
use:用于指定相关性计算时的处理方法。可选值包括 "everything"、"all.obs"、"complete.obs"、"pairwise.complete.obs" 和 "na.or.complete"。默认为 "everything",表示使用所有可用的观测值进行计算。
method:用于指定相关性计算的方法。常见的方法包括 "pearson"(皮尔逊相关系数,用于衡量线性相关性)、"kendall"(肯德尔相关系数,用于衡量非线性相关性)和 "spearman"(斯皮尔曼相关系数,用于衡量非线性相关性)。默认为 "pearson"。
2) 举例
states <- state.x77[,1:6]
states
## Population Income Illiteracy Life Exp Murder HS Grad
## Alabama 3615 3624 2.1 69.05 15.1 41.3
## Alaska 365 6315 1.5 69.31 11.3 66.7
## Arizona 2212 4530 1.8 70.55 7.8 58.1
## Arkansas 2110 3378 1.9 70.66 10.1 39.9
## California 21198 5114 1.1 71.71 10.3 62.6
## Colorado 2541 4884 0.7 72.06 6.8 63.9
## Connecticut 3100 5348 1.1 72.48 3.1 56.0
## Delaware 579 4809 0.9 70.06 6.2 54.6
## Florida 8277 4815 1.3 70.66 10.7 52.6
## Georgia 4931 4091 2.0 68.54 13.9 40.6
## Hawaii 868 4963 1.9 73.60 6.2 61.9
## Idaho 813 4119 0.6 71.87 5.3 59.5
## Illinois 11197 5107 0.9 70.14 10.3 52.6
## Indiana 5313 4458 0.7 70.88 7.1 52.9
## Iowa 2861 4628 0.5 72.56 2.3 59.0
## Kansas 2280 4669 0.6 72.58 4.5 59.9
## Kentucky 3387 3712 1.6 70.10 10.6 38.5
## Louisiana 3806 3545 2.8 68.76 13.2 42.2
## Maine 1058 3694 0.7 70.39 2.7 54.7
## Maryland 4122 5299 0.9 70.22 8.5 52.3
## Massachusetts 5814 4755 1.1 71.83 3.3 58.5
## Michigan 9111 4751 0.9 70.63 11.1 52.8
## Minnesota 3921 4675 0.6 72.96 2.3 57.6
## Mississippi 2341 3098 2.4 68.09 12.5 41.0
## Missouri 4767 4254 0.8 70.69 9.3 48.8
## Montana 746 4347 0.6 70.56 5.0 59.2
## Nebraska 1544 4508 0.6 72.60 2.9 59.3
## Nevada 590 5149 0.5 69.03 11.5 65.2
## New Hampshire 812 4281 0.7 71.23 3.3 57.6
## New Jersey 7333 5237 1.1 70.93 5.2 52.5
## New Mexico 1144 3601 2.2 70.32 9.7 55.2
## New York 18076 4903 1.4 70.55 10.9 52.7
## North Carolina 5441 3875 1.8 69.21 11.1 38.5
## North Dakota 637 5087 0.8 72.78 1.4 50.3
## Ohio 10735 4561 0.8 70.82 7.4 53.2
## Oklahoma 2715 3983 1.1 71.42 6.4 51.6
## Oregon 2284 4660 0.6 72.13 4.2 60.0
## Pennsylvania 11860 4449 1.0 70.43 6.1 50.2
## Rhode Island 931 4558 1.3 71.90 2.4 46.4
## South Carolina 2816 3635 2.3 67.96 11.6 37.8
## South Dakota 681 4167 0.5 72.08 1.7 53.3
## Tennessee 4173 3821 1.7 70.11 11.0 41.8
## Texas 12237 4188 2.2 70.90 12.2 47.4
## Utah 1203 4022 0.6 72.90 4.5 67.3
## Vermont 472 3907 0.6 71.64 5.5 57.1
## Virginia 4981 4701 1.4 70.08 9.5 47.8
## Washington 3559 4864 0.6 71.72 4.3 63.5
## West Virginia 1799 3617 1.4 69.48 6.7 41.6
## Wisconsin 4589 4468 0.7 72.48 3.0 54.5
## Wyoming 376 4566 0.6 70.29 6.9 62.9
cor(states,method="pearson")
## Population Income Illiteracy Life Exp Murder HS Grad
## Population 1.00000000 0.2082276 0.1076224 -0.06805195 0.3436428 -0.09848975
## Income 0.20822756 1.0000000 -0.4370752 0.34025534 -0.2300776 0.61993232
## Illiteracy 0.10762237 -0.4370752 1.0000000 -0.58847793 0.7029752 -0.65718861
## Life Exp -0.06805195 0.3402553 -0.5884779 1.00000000 -0.7808458 0.58221620
## Murder 0.34364275 -0.2300776 0.7029752 -0.78084575 1.0000000 -0.48797102
## HS Grad -0.09848975 0.6199323 -0.6571886 0.58221620 -0.4879710 1.00000000
这里我们得到的结果是一个方阵,但不想得到方阵而是不同变量之间的相关性(x与y不同),可以:
states <- state.x77[,1:6]
x <- states[,c("Population","Income","Illiteracy","HS Grad")]
y <- states[,c("Life Exp","Murder")]
cor(x,y,method="spearman")
## Life Exp Murder
## Population -0.1040171 0.3457401
## Income 0.3241050 -0.2174623
## Illiteracy -0.5553735 0.6723592
## HS Grad 0.5239410 -0.4367330
可以看到,x和y分别对应结果中的x和y。
7.3.2 相关性的显著性检验
1) cor.test()适用于计算两个变量之间的相关性和显著性检验,返回相关系数、p值和置信区间
语法:
cor.test(x,y,alternative = ,method=)
alternative参数用于指定假设检验的备择假设:
"two.sided"(双侧检验,默认值)、"less"(检验相关系数小于零)和"greater"(检验相关系数大于零)。
method参数用于指定相关性的计算方法:
"pearson"(皮尔逊相关系数,线性关系,默认值)、"kendall"(肯德尔相关系数,非线性关系)和"spearman"(斯皮尔曼相关系数,非线性关系)。
举例:
cor.test(states[,3],states[,6],method="spearman")
## Warning in cor.test.default(states[, 3], states[, 6], method = "spearman"):
## 无法给连结计算精確p值
##
## Spearman's rank correlation rho
##
## data: states[, 3] and states[, 6]
## S = 34456, p-value = 2.524e-07
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## -0.6545396
2) corr.test()适用于计算多个变量之间的相关性、显著性检验和多重校正,返回相关系数和P值
是psych包中的函数,因此需要先安装并加载该包,语法:
corr.test(x,method=, adjust = ,use = )#或
corr.test(x,y,method=, adjust = ,use =)
x:是包含多个变量的矩阵或数据框。x,y则是两个多变量
method:pearson(默认值)、kendall或spearman。
adjust:参数用于指定多重校正方法,可以是none(默认值),bonferroni,holm,hochberg等。
use:可以取值为pairwise或complete,分别表示对缺失值执行成对删除或行删除
举例:
library(psych)
corr.test(states[,1:3],states[,4:6])
## Call:corr.test(x = states[, 1:3], y = states[, 4:6])
## Correlation matrix
## Life Exp Murder HS Grad
## Population -0.07 0.34 -0.10
## Income 0.34 -0.23 0.62
## Illiteracy -0.59 0.70 -0.66
## Sample Size
## [1] 50
## These are the unadjusted probability values.
## The probability values adjusted for multiple tests are in the p.adj object.
## Life Exp Murder HS Grad
## Population 0.64 0.01 0.5
## Income 0.02 0.11 0.0
## Illiteracy 0.00 0.00 0.0
##
## To see confidence intervals of the correlations, print with the short=FALSE option
7.4 t检验
主要用于对连续型变量+分布呈正态分布的两个组之间的比较。分为独立性样本和非独立性样本的t检验。
独立性样本:
独立t检验用于比较两组独立的样本之间的均值差异。这意味着两组样本是相互独立的,每个样本观测之间没有相关性。独立t检验适用于以下情况:
a.两组样本是不同的个体或实验单元。
b.每个样本的观测值之间没有相关性。
c.样本之间的方差相等(又称为方差齐性)。
非独立性样本:
非独立t检验用于比较同一组样本在不同条件下或不同时间点的均值差异。这意味着两组样本是相关的,每个样本观测之间存在某种关联或配对。非独立t检验适用于以下情况:
a.同一组样本在不同条件下或不同时间点进行了测量。
b.样本之间存在配对关系,例如同一组实验参与者在两个时间点的测量。
7.4.1 独立性样本的t检验
原假设:两组的均值相等,当P>0,05时接受原假设,当P<0.05时拒绝原假设,两组均值有较大差异
语法:
t.test(y~x,data)#或
t.test(y1,y2)
y:表示因变量(或响应变量),它是一个数值型变量,用于测量或观察感兴趣的数量或特征。
x:表示自变量(或组别变量),它是一个二分变量(例如:0和1,A和B等),用于将样本分为两个组别。
data:表示数据集,它包含了用于分析的所有变量,包括因变量和自变量。
举例(这里使用MASS包中的UScrime数据集,因变量为Prob(监禁概率),二分变量为So(该州是否位于南方):
library(MASS)
##
## 载入程辑包:'MASS'
## The following object is masked from 'package:dplyr':
##
## select
t.test(Prob~So,UScrime)
##
## Welch Two Sample t-test
##
## data: Prob by So
## t = -3.8954, df = 24.925, p-value = 0.0006506
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -0.03852569 -0.01187439
## sample estimates:
## mean in group 0 mean in group 1
## 0.03851265 0.06371269
结果显示:P<0.05,因此拒绝原假设,即两组的均值不一样,有显著差异。
7.4.2 非独立性样本的t检验
原假设:两组的均值相等,当P>0,05时接受原假设,当P<0.05时拒绝原假设,两组均值有较大差异
语法:
t.test(y1,y2,paired=TRUE)
"y1"和"y2":表示配对样本的两个变量,它们都是数值型变量,用于测量或观察感兴趣的数量或特征。这两个变量应具有相同的长度,每个对应相同的观测单位。
"paired":一个逻辑参数,用于指示是否进行配对样本的t检验。当设置为TRUE时,表示进行配对样本t检验;当设置为FALSE时,表示进行独立样本t检验。
配对样本t检验适用于比较同一组观测单位在两个时间点或两种条件下的差异。例如,可以使用配对样本t检验来比较同一组学生在一项测试前后的成绩差异,或者比较同一组参与者接受两种不同治疗条件时的效果差异。
举例(比较较年轻(U1)和较年长U2的失业率):
library(MASS)
sapply(UScrime[c("U1","U2")],function(x)(c(mean=mean(x),sd=sd(x))))
## U1 U2
## mean 95.46809 33.97872
## sd 18.02878 8.44545
with(UScrime,t.test(U1,U2,paired=TRUE))
##
## Paired t-test
##
## data: U1 and U2
## t = 32.407, df = 46, p-value < 2.2e-16
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## 57.67003 65.30870
## sample estimates:
## mean difference
## 61.48936
7.4.3 大于2组之间比较时使用方差分析(ANOVA),在第九章中学习
7.5 组间差异的非参数检验请输入标题
当数据分布不能满足参数检验时,或者不清楚数据的分布情况,可以用非参数检验。
7.5.1 两组的比较:Wilcoxon秩和检验(又称Mann-Whitney U)
1)独立两个变量
原假设:通常是指两个相关样本之间没有显著的差异。两个相关样本的中位数没有显著差异。
语法:
wilcox.test(y~x,data)#或
wilcox.test(y1,y2)
y:数值型变量,x:二分变量
y1,y2:各组的结果变量
举例:
library(MASS)
wilcox.test(Prob~So,data = UScrime)
##
## Wilcoxon rank sum exact test
##
## data: Prob by So
## W = 81, p-value = 8.488e-05
## alternative hypothesis: true location shift is not equal to 0
P<0.05,故拒绝原假设,两组有显著差异。
2)非独立两个变量
语法,注意添加paired=TRUE,表示进行的是配对样本的Wilcoxon秩和检验:
wilcox.test(y1,y2,paired=TRUE)
举例
with(UScrime,wilcox.test(U1,U2,paired=TRUE))
## Warning in wilcox.test.default(U1, U2, paired = TRUE): 无法精確計算带连结的p值
##
## Wilcoxon signed rank test with continuity correction
##
## data: U1 and U2
## V = 1128, p-value = 2.464e-09
## alternative hypothesis: true location shift is not equal to 0
P<0.05,拒绝原假设。
7.5.2 多组的比较
1)各组独立:Kruskal-Wallis检验
当数据分布无法满足ANOVA设计的假设,可以用非参数方法来评估组间的差异。
语法:
kruskal.test(y~A,data)
y:数值型结果变量
A:一个拥有两个或更多水平的分组变量,若只有2个,则与Mann-Whitney U检验等价。
举例(比较美国4个地区的文盲率):
states <- data.frame(state.region,state.x77)
kruskal.test(Illiteracy~state.region,states)
##
## Kruskal-Wallis rank sum test
##
## data: Illiteracy by state.region
## Kruskal-Wallis chi-squared = 22.672, df = 3, p-value = 4.726e-05
2)各组不独立:Kruskal-Wallis检验
当数据分布无法满足ANOVA设计的假设,可以用非参数方法来评估组间的差异。
语法:
friedman.test(y~A|B,data)
A:一个分组变量
B:表示第二个因子变量,用于考虑不同组之间的相关性。
data: 表示包含要分析的数据的数据框或数据集。
完整教程请查看