可用于多元正态的参数估计 及 均值向量和协差阵检验 的R语言函数总结

一、多元正态的参数估计

1.1 样本均值

        在R语言中,均值通常用函数mean()得到,但是mean()只能计算一维变量的样本均值,在面对多元随机变量的样本时,假设我们以数据框的形式保存样本,我们有以下方法可以得到样本均值:

  1. 对多元样本的每一个分量用mean()函数,可以用apply()或sapply()函数
  2. 以数据框类型保存的样本,可以用summary()函数返回各个变量的各项描述性数据,其中包括均值

例1.1:

        计算有割草机家庭的样本均值向量

有割草机家庭 无割草机家庭
x1 x2 x1 x2
20.0 9.2 25.0 9.8
28.5 8.4 17.6 10.4
21.6 10.8 21.6 8.6
20.5 10.4 14.4 10.2
29.0 11.8 28.0 8.8
36.7 9.6 16.4 8.8
36.0 8.8 19.8 8.0
27.6 11.2 22.0 9.2
23.0 10.0 15.8 8.2
31.0 10.4 11.0 9.4
17.0 11.0 17.0 7.0
27.0 10.0 21.0 7.4

 注:在输入数据时,通常会用一个新的变量(假设命名为Y)来表示每个观测所属的组,称为分组变量,这个变量在R中通常要转换成因子

> data4.1=read.csv('Table4-1.csv')
> head(data4.1)
###                y是分组变量,y=1表示有割草机家庭
     x1   x2 y
1  20.0  9.2 1
2  28.5  8.4 1
3  21.6 10.8 1
4  20.5 10.4 1
5  29.0 11.8 1
6  36.7  9.6 1
###
> apply(data4.1[data4.1$y==1,],2,mean)[1:2]    #用apply()函数运算
###
      x1       x2 
26.49167 10.13333 
###
> summary(data4.1[data4.1$y==1,])           #用summary()获取各分量的样本均值
###
       x1              x2              y    
 Min.   :17.00   Min.   : 8.40   Min.   :1  
 1st Qu.:21.32   1st Qu.: 9.50   1st Qu.:1  
 Median :27.30   Median :10.20   Median :1  
 Mean   :26.49   Mean   :10.13   Mean   :1   #该行为均值
 3rd Qu.:29.50   3rd Qu.:10.85   3rd Qu.:1  
 Max.   :36.70   Max.   :11.80   Max.   :1 
###
  • apply()用法:apply(A,margin,fun,...) 

        apply()函数用来对矩阵或数据框的每行或每列进行指定函数的运算。其中A为矩阵或数据框;margin指定对行或对列进行运算,当margin=1时对行进行运算,当margin=2时对列进行运算;fun是指定的函数 

  • summary()用法:summary(object,...)

        summary()多用于获取项目的摘要,包含部分信息。当object为数据框时,会返回各个变量的五数(最小值,下四分位数,中位数,上四分为数,最大值)和均值

1.2 样本协差阵

        在R中,样本协差阵的获取非常简便, 对数据框使用cov()函数即可

例1.2:

        继上题,计算有割草机组的样本协差阵

> cov(data4.1[data4.1$y==1,][,1:2])
###
          x1        x2
x1 39.182652 -1.969697
x2 -1.969697  1.020606
###
  • cov()用法:cov(x,y=NULL,...)

        当指定cov()的参数x和y,且两者都为一维向量时,会返回两个向量的样本协方差;而未指定参数y,且x为矩阵或数据框时,会返回以x每一列作为变量样本的协差阵

1.3  样本相关阵

        获取样本相关阵的函数是cor(),其用法与cov()相同,两个一维向量返回相关系数;数据框返回相关阵

二、各类检验

2.1 正态性检验

        正态性检验即检验样本是否来自正态总体的检验,原假设都为来自正态总体。正态性的检验方法有许多种,此处介绍小样本量(3~50)时所用的夏皮洛-威尔克检验。R中的夏皮洛-威尔克检验的函数为shapiro.test()

        shapiro.test()一次只能对一维变量进行正态性检验,当面对多元随机变量的样本时,有以下方法

  1. 我们可以对其每一个分量都进行一次正态性检验,当所有分量都检验得出服从正态分布后,可以认为该多元随机变量服从多元正态分布
  2. 运用mvnormtest包内的mshapiro.test()函数进行多元正态性检验

        实现时可能会用到的函数有:

  • sapply(),对每个分量进行指定的检验
  • tapply(),对以分组变量指定的不同组别分别进行指定的检验

例2.1:

        继上题,对不同类型家庭的随机向量数据进行正态性检验

> sapply(data4.1[,-3],shapiro.test)    #对各分量进行正态性检验,但是未分组
###
          x1                            x2                           
statistic 0.9654387                     0.9880936                    
p.value   0.5568611                     0.9897171                    
method    "Shapiro-Wilk normality test" "Shapiro-Wilk normality test"
data.name "X[[i]]"                      "X[[i]]" 
###
> tapply(data4.1[,1],data4.1$y,shapiro.test)
###                            对分组后的x1进行正态性检验
$`0`

        Shapiro-Wilk normality test

data:  X[[i]]
W = 0.98551, p-value = 0.9971


$`1`

        Shapiro-Wilk normality test

data:  X[[i]]
W = 0.95332, p-value = 0.6859

###
> tapply(data4.1[,2],data4.1$y,shapiro.test)
###                            对分组后的x2进行正态性检验
$`0`

        Shapiro-Wilk normality test

data:  X[[i]]
W = 0.97557, p-value = 0.9596


$`1`

        Shapiro-Wilk normality test

data:  X[[i]]
W = 0.98262, p-value = 0.992
###
##对有割草机家庭的随机向量数据进行正态性检验
> mshapiro.test(t(as.matrix(data4.1[data4.1$y==1,-3])))

        Shapiro-Wilk normality test

data:  Z
W = 0.96877, p-value = 0.8975

##对无割草机家庭的随机向量数据进行正态性检验
> mshapiro.test(t(as.matrix(data4.1[data4.1$y==0,-3])))

        Shapiro-Wilk normality test

data:  Z
W = 0.98001, p-value = 0.9837

         检验结果为均服从正态分布


  • sapply():sapply(X,Fun,...)

        sapply()用于对X的每个分量进行Fun函数运算,X应该是矩阵或数据框

  • tapply():tapply(X,Index,Fun=NULL,...)

        tapply()用于对以分组变量Index指示的每个组中对应的X的数据进行Fun函数运算

  • mshapiro.test():mshapiro.test(U)

        mshapiro.test()用于进行多元的夏皮洛-威尔克正态性检验,需要注意U只能是数据矩阵,当遇到用数据框存储的数据时要用as.matrix()转化为矩阵,且这个函数默认变量的数据按行排放,通常我们需要对矩阵再进行一次转置

        另外,可以画出Q-Q图查看样本的正态性,常用的函数有qqnorm()和qqline()

  • qqnorm(x),其中x为一维变量的样本,当画出的散点图越接近一条斜线,其正态性越强
  • qqline(x),其中x为一维变量的样本,当画出散点的Q-Q图后,添加点所靠近的斜线,该斜线的斜率为标准差,截距为均值

2.2  均值向量的检验

        一维的均值检验有很多,若样本服从正态分布我们可以用t.test()单个总体或双总体的t检验;若不服从正态分布,我们可以用wilcox.test()进行秩和检验,用法与t.test()类似;当遇到多个总体时,若各个变量的方差相差不大,我们可以用将各个变量的数据放到一列,然后用一个分组变量表示数据属于哪个变量,运用aov()进行方差分析,从而进行多总体的均值检验

        当遇到多元随机变量的均值检验时,我们有以下方法:

  1. 对每个分量进行均值检验,通过正态性检验的用t检验,未通过正态性检验的用秩和检验
  2. 对通过多元正态检验的数据,运用ICSNP包中的HotellingsT2()函数进行均值向量的检验
  3. 多总体时,若协差阵齐性检验通过,可以用manova()进行多元方差分析

 例2.2.1:

        继上题,检验有割草机家庭和无割草机家庭的向量均值是否相同

#上题已得出各类家庭的数据均通过正态检验

> t.test(x1~y,data=data4.1)            #对x1分量进行t检验

        Welch Two Sample t-test

data:  x1 by y
t = -3.2508, df = 20.458, p-value = 0.003919
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
 -12.073229  -2.643437
sample estimates:
mean in group 0 mean in group 1 
       19.13333        26.49167 

> t.test(x2~y,data=data4.1)            #对x2分量进行t检验

        Welch Two Sample t-test

data:  x2 by y
t = -3.1203, df = 21.956, p-value = 0.004991
alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
95 percent confidence interval:
 -2.1918725 -0.4414609
sample estimates:
mean in group 0 mean in group 1 
       8.816667       10.133333 

> library(ICSNP)
> attach(data4.1)
> HotellingsT2(cbind(x1,x2)~y)            #霍特林T方检验,用于多元正态向量

        Hotelling's two sample T2-test

data:  cbind(x1, x2) by y
T.2 = 12.257, df1 = 2, df2 = 21, p-value = 0.000297
alternative hypothesis: true location difference is not equal to c(0,0)

        对各分量进行t检验的结果是:有割草机家庭与无割草机家庭的两个分量都不相等 

        对向量整体进行霍特林T方检验的结果是:有割草机家庭与无割草机家庭的向量均值不相等

         该题也可以用多元方差分析,只是水平数为2,其实也是通过对每个分量进行检验


例2.2.2:

        现有如下表所示各省统计数据,试检验它们的均值向量是否等于  (1081,1822,115,179)

序号

省份

工资性收入

家庭性收入

财产性收入

转移性收入

1

北京

4524.25

1778.33

588.04

455.64

2

天津

2720.85

2626.46

152.88

79.64

3

河北

1293.50

1988.58

93.74

105.81

4

山西

1177.94

1563.52

62.70

86.49

5

内蒙古

504.46

2223.26

73.05

188.10

6

辽宁

1212.20

2163.49

113.24

201.28

注:以上为部分表格,表格全部内容在此不展示

> data3=read.csv('Table_0.csv',encoding='UTF-8')    #读取数据
> mu_bar=c(1081,1882,115,179)
> rownames(data3)=data3[,1]            #将省名赋给数据框行名
> data3=data3[,-1]                     #去除省名一列
###
假设通过了正态性检验
###
> HotellingsT2(data3,mu=mu_bar)

        Hotelling's one sample T2-test

data:  data3
T.2 = 1.8443, df1 = 4, df2 = 27, p-value = 0.1494
alternative hypothesis: true location is not equal to c(1081,1882,115,179)

        检验结果为各省统计数据的均值向量等于(1081,1822,115,179)


例2.2.3:

在数据New drug.xls中,各变量的意义为drug(药),取值1表示对病人给以新药,取值2表示对病人给以安慰剂,resp1-resp3是治疗后病人三个时点的呼吸状况,pulse1-pulse3是病人三个时点的脉搏。试分析这两方法的各次重复测定均值向量是否有显著差异?

drug resp1 resp2 resp3 pulse1 pulse2 pulse3
1 3.4 3.3 3.3 2.2 2.1 2.1
1 3.4 3.4 3.3 2.2 2.1 2.2
1 3.3 3.4 3.4 2.3 2.4 2.3
2 3.3 3.3 3.3 2.8 2.9 2.7
2 3.2 3.3 3.4 2.6 2.7 2.7
2 3.2 3.2 3.2 2.7 2.9 2.7

 注:以上为部分表格,表格全部内容在此不展示

        题目要求检验不用用药的组之间,向量(resp1,resp2,resp3,pulse1,pulse2,pulse3)的均值是否相等。因为drug只有2个水平,可以对每个分量进行t检验,但是分量比较多会比较麻烦;也可以用多元方差分析,查看结果也是对每个分量的检验,不过需要先进行协差阵检验;用霍特林T2检验会比较简单。

> data_drug=read.csv('new drug.csv',encoding='UTF-8')
> names(data_drug)[1]='drug'        #UTF-8格式的csv文件读取后,第一列的名字会有变动,此处改回
> attach(data_drug)
###
对每个变量进行正态性检验后
得知随机向量不服从多元正态分布
因此不能用t检验和霍特林T方检验,不过可以对每个分量进行秩和检验
假设数据通过了协差阵检验
接下来进行多元方差分析
###
> modle_drug=manova(cbind(resp1,resp2,resp3,pulse1,pulse2,pulse3)~drug,data=data_drug)
> summary.aov(modle_drug)
 Response resp1 :
            Df   Sum Sq  Mean Sq F value   Pr(>F)   
drug         1 0.040833 0.040833  14.412 0.003507 **
Residuals   10 0.028333 0.002833                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Response resp2 :
            Df   Sum Sq  Mean Sq F value   Pr(>F)   
drug         1 0.040833 0.040833  14.412 0.003507 **
Residuals   10 0.028333 0.002833                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Response resp3 :
            Df   Sum Sq   Mean Sq F value Pr(>F)
drug         1 0.020833 0.0208333  3.0488 0.1114
Residuals   10 0.068333 0.0068333               

 Response pulse1 :
            Df  Sum Sq Mean Sq F value    Pr(>F)    
drug         1 0.65333 0.65333      70 7.936e-06 ***
Residuals   10 0.09333 0.00933                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Response pulse2 :
            Df  Sum Sq Mean Sq F value    Pr(>F)    
drug         1 1.08000 1.08000  79.024 4.623e-06 ***
Residuals   10 0.13667 0.01367                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Response pulse3 :
            Df  Sum Sq Mean Sq F value    Pr(>F)    
drug         1 0.75000 0.75000  64.286 1.155e-05 ***
Residuals   10 0.11667 0.01167                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

        只有resp3的检验结果为相同,其他都为不同,所以认为两方法的各次重复测定均值向量有显著差异


  • t.test()用法:

t.test(x,y=NULL,alternative=c("two.sided","less","greater"),mu=0,...)或

t.test(formula,data,...)

指定x未指定y时,进行单总体的t检验,可以指定mu检验其是否与mu相同

alternative指定双边检验或左尾检验或右尾检验

也可以用formula类的参数,即x~y的类型,y是分组变量,会对不同组的x进行双总体t检验

  • wilcox.test()用法:

wilcox.test()用法与t.test()相同,此处不赘述

  • HotellingsT2()用法:

HotellingsT2(X,Y=NULL,mu=NULL,test="f",...)或

HotellingsT2(formula,...)

X与Y为矩阵或数据框,未指定Y时进行单总体的检验,可以指定mu检验其是否与mu相同

test参数指定近似统计量,默认为f,即F近似,可以指定"chi",即卡方近似

可以用formula类参数,与先前用法相同,但是HotellingsT2()没有data参数

  • manova()用法:

manova(formula,data,...)

manova()的formula参数用法aov()类似,manova()返回的是多元方差分析的模型,将其赋给某个变量,然后用aov.summary()函数可以看每个变量的检验

2.3  协差阵检验

        在进行多元方差分析前需要进行协差阵齐性检验,协差阵检验可以用heplots包内的boxM()函数。

例2.3:

        继有无割草机家庭数据,检验两组的协差阵是否有差异

> boxM(data4.1[,-3],group=data4.1[,3])

        Box's M-test for Homogeneity of Covariance Matrices

data:  data4.1[, -3]
Chi-Sq (approx.) = 0.99346, df = 3, p-value = 0.8028

        检验结果为两组协差阵相同

  • boxM()用法:

boxM(formula,data,...)或

boxM(Y,group,...)

formula类参数的用法与之前的函数相同

Y是数据矩阵或数据框,group是指定的分组变量

boxM()函数进行的是协差阵齐性检验,在分组变量的水平数大于2时也可以使用

三、小结

总结本文提到的函数和应用场景

参数估计 正态性检验
函数 应用场景 函数 应用场景
mean() 计算一维变量的样本均值 shapiro.test() 小样本正态性检验
apply() 对矩阵或数据框的行或列进行运算 mshapiro.test() 多元小样本正态性检验
sapply() 对矩阵或数据框的每个变量进行运算 sapply() 对每个变量进行指定运算或检验
summary() 对数据框使用时返回每个变量的统计描述 tapply() 对以分组变量指定的不同组别分别进行指定的运算或检验
cov() 获取协方差或协差阵 qqnorm() 画Q-Q图
cor() 获取相关系数或相关阵 qqline() 在Q-Q图中添加正态标准线
均值向量检验 协差阵检验
函数 应用场景 函数 应用场景
t.test() 正态样本的单双总体均值检验 boxM() 协差阵齐性检验
wilcox.test() 非正态样本的单双总体均值检验
HotellingsT2() 多元正态样本的单双总体均值检验
aov() 方差齐性情况下的方差分析
manova() 协差阵齐性下的多元方差分析
aov.summary() 获取方差分析模型的检验结果

你可能感兴趣的:(r语言,统计学)