R语言基础| 基本统计分析

写在前面

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: 表示包含要分析的数据的数据框或数据集。

完整教程请查看

R语言基础学习手册

相关推荐
爱跨境的笑笑38 分钟前
Skype for Business网络延迟怎么办?
大数据·开发语言·网络·tcp/ip·php
我爱喝伊利1 小时前
C#中使用System.Net库实现自动发送邮件功能
开发语言·c#
NoneCoder2 小时前
JavaScript系列(86)--现代构建工具详解
开发语言·javascript·rust
Zhen (Evan) Wang2 小时前
C#中提供的多种集合类以及适用场景
开发语言·c#
weixin_444009002 小时前
浏览器JS打不上断点,一点就跳到其他文件里。浏览器控制台 js打断点,指定的位置打不上断点,一打就跳到其他地方了。
开发语言·javascript·ecmascript
郑祎亦3 小时前
Java 关键字 volatile
java·开发语言·jvm
BTU_YC3 小时前
Failed to start The PHP FastCGI Process Manager.
开发语言·php
诗诗的博客3 小时前
jmeter聚合报告如何添加单位_性能测试连载(8)jmeter压力测试中的难点解析
java·开发语言
xidianhuihui3 小时前
go如何排查某个依赖是哪里引入的
开发语言·后端·golang
怡~3 小时前
Golang适配达梦数据库连接指定模式
开发语言·数据库·golang