【数据分析 R语言实战】学习笔记 第七章 假设检验及R实现(上)

2019-04-10 16:44:09 浏览数 (1)

假设检验及R实现

7.1假设检验概述

对总体参数的具体数值所作的陈述,称为假设;再利用样本信息判断假设足否成立,这整个过程称为假设检验。

7.1.1理论依据

假设检验之所以可行,其理沦背景是小概率理论。小概率事件在一次试验中儿乎是不可能发生的,但是它一以发生,我们就有理由拒绝原假设:反之,小概率事件没有发生,则认为原假设是合理的。这个小概率的标准由研究者事先确定,即以所谓的显著性水平α(0<α<1)作为小概率的界限,α的取值与实际问题的性质相关,通常我们取α=0.1, 0.05或0.01,假设检验也称为显著性检验。

7 .1.2检验步骤

(1)提出假设

(2)确定检验统计量,计算统计量的值

(3)规定显著性水平,建立检验规则

(4)作出统计决策

临界值规则:

双侧检验:|统计量|>临界值时,拒绝H0

左侧检验:统计量<=临界值时,拒绝H0

右侧检验:统计量>临界值时,拒绝H0

p值规则:

在一个假设检验问题中,拒绝原假设H0,的最小显著性水平称为检验的p值。p值可以告诉我们,如果原假设是正确的话,我们得到目前这个样本统计值的可能性有多人,如果这个可能性很小,就应该拒绝原假设。也就是说,P值越小,拒绝H0的可能性越大。在显著性水平α下,P值规则为:如果P≤α,则拒绝H0;如果P>a,则不拒绝原假设。

7.1.3两类错误

7.2单正态总体的检验

单正态总体的假设检验方法:

7.2.1均值μ的检验

(1) σ2已知

R自带的函数中只提供了t检验的函数t.test(),而没有Z检验的函数,自己编写函数z.test(),用于计算z统计量的值以及P值:

> z.test=function(x,mu,sigma,alternative="two.sided"){ n=length(x) result=list() #构造一个空的list,用于存放输出结果 mean=mean(x) z=(mean-mu)/(sigma/sqrt(n)) #计算z统计量的值 options(digits=4) #结果显示至小数点后4位 result$mean=mean;result$z=z #将均值、z值存入结果 result$P=2*pnorm(abs(z),lower.tail=FALSE) #根据z计算P值 #若是单侧检验,重新计算P值 if(alternative=="greater")result$P=pnorm(z,lower.tail=FALSE) else if(alternative=="less")result$P=pnorm(z) result }

BSDA包提供了函数z.test( ),它可以对基于正态分布的单样本和双样本进行假设检验,其使用方法如下:

代码语言:javascript复制
z.test(x,y=NULL,alternative="two.sided",mu=0,sigma.x=NULL,
代码语言:javascript复制
sigma.y=NULL, onf.level = 0.95)
代码语言:javascript复制
其中,x和Y为数值向量,默认y=NULL,即进行单样本的假设检验:alternative用于指定求置信区问的类型,默认为two.sided>表示求双尾的置信区间,为less则求置信上限,greater求置信F限:mu表示均值,仅在假设检验中起作用,默认为0;sigma.x和sigma.y分别指定两个样本总体的标准差。
代码语言:javascript复制
例:
代码语言:javascript复制
东方财富数据中心可以获得2012年各月北京市的新建住宅价格指数,是否服从均值为102.4、方差为0.45(标准差为0.67)的正态分布

代码语言:javascript复制
> bj=c(102.5,102.4,102.0,101.8,101.8,102.1,102.3,102.5,102.6,102.8,103.4,104.2)
代码语言:javascript复制
> z.test(x=bj,mu=102.4,sigma=0.67,alternative="two.sided")
代码语言:javascript复制
$mean
代码语言:javascript复制
[1] 102.5
代码语言:javascript复制
代码语言:javascript复制
$z
代码语言:javascript复制
[1] 0.6894
代码语言:javascript复制
代码语言:javascript复制
$P
代码语言:javascript复制
[1] 0.4906
代码语言:javascript复制
使用程序包BSDA中的函数z.test()

代码语言:javascript复制
> library(BSDA)
代码语言:javascript复制
> z.test(x=bj,mu=102.4,sigma=0.67,alternative="two.sided")
代码语言:javascript复制
$mean
代码语言:javascript复制
[1] 102.5
代码语言:javascript复制
代码语言:javascript复制
$z
代码语言:javascript复制
[1] 0.6894
代码语言:javascript复制
代码语言:javascript复制
$P
代码语言:javascript复制
[1] 0.4906
代码语言:javascript复制
检验的结果是,由于P =0.4906> a =0.05,因此在0.05的显署性水平下,不能拒绝原假设,认为2012年各月北京的新建住宅价格指数服从均值为102.4的正态分布。

(1)σ2未知

代码语言:javascript复制
代码语言:javascript复制
直接调用t检验函数t.test()即可:

代码语言:javascript复制
t.test(x, y = NULL,alternative = c("two.sided", "less", "greater"),mu = 0, paired = FALSE, var.equal = FALSE,conf.level = 0.95, ...)
代码语言:javascript复制
其中,x为样本数据,若仅出现x,则进行单样本t检验:若x和Y同时输入,则做双样本t检验;alternative用于指定所求置信区间的类型,默认为two.sided,表示求双尾的置信区问,若为less则求置信上限,greater求置信下限:mu表示均值,表示原假设中事先判断的均值,默认值为0 ;  paired是逻辑值,表示是否进行配对样本t检验,默认为不配对;var.equal也是逻辑值,表示双样本检验时两个总体的方差是否相等;另外,这个函数还可以直接计算置信IX问,conf.level用来表示区间的置信水平。

代码语言:javascript复制
> t.test(x=bj,mu=102.4,alternative="less")
代码语言:javascript复制
代码语言:javascript复制
        One Sample t-test
代码语言:javascript复制
data:  bj
代码语言:javascript复制
t = 0.67, df = 11, p-value = 0.7
代码语言:javascript复制
alternative hypothesis: true mean is less than 102.4
代码语言:javascript复制
95 percent confidence interval:
代码语言:javascript复制
  -Inf 102.9
代码语言:javascript复制
sample estimates:
代码语言:javascript复制
mean of x 
代码语言:javascript复制
    102.5 
代码语言:javascript复制
7.2.2方差σ2的检验
代码语言:javascript复制
(1) μ已知
代码语言:javascript复制
代码语言:javascript复制
(2)μ未知
代码语言:javascript复制
代码语言:javascript复制
R中没有直接的函数可以做样本方差的卡方检验(只有检验卡方分布的函数),所以我们把上述两种情形写在同一个函数chisq.var.test()中,调用它就可以直接做各种情形的单样本方差检验。应用到2012年北京市新建住宅价格指数的案例中,如果样本方差保持在一定范围内,则说明房价比较稳定,l}}此我们在0.05的显著性水平下检验总体方差是否不超过0.25。

代码语言:javascript复制
> chisq.var.test=function(x,var,mu=Inf,alternative="two.sided"){
代码语言:javascript复制
    n=length(x)
代码语言:javascript复制
    df=n-1  #均值未知时的自由度
代码语言:javascript复制
    v=var(x)  #均值未知时的方差估计值
代码语言:javascript复制
    #总体均值已知的情况
代码语言:javascript复制
    if(mu<Inf){df=n;v=sum((x-mu)^2)/n}
代码语言:javascript复制
    chi2=df*v/var  #卡方统计量
代码语言:javascript复制
    options(digits=4)
代码语言:javascript复制
    result=list()  #产生存放结果的列表
代码语言:javascript复制
    result$df=df;result$var=v;result$chi2=chi2;
代码语言:javascript复制
    result$P=2*min(pchisq(chi2,df),pchisq(chi2,df,lower.tail=F))
代码语言:javascript复制
    #若是单侧检验,重新计算P值
代码语言:javascript复制
    if(alternative=="greater") result$P=pchisq(chi2,df,lower.tail=F)
代码语言:javascript复制
    else if(alternative=="less") result$P=pchisq(chi2,df)
代码语言:javascript复制
    result
代码语言:javascript复制
  }
代码语言:javascript复制
> chisq.var.test(bj,0.25,alternative="less")
代码语言:javascript复制
$df
代码语言:javascript复制
[1] 11
代码语言:javascript复制
代码语言:javascript复制
$var
代码语言:javascript复制
[1] 0.4752
代码语言:javascript复制
代码语言:javascript复制
$chi2
代码语言:javascript复制
[1] 20.91
代码语言:javascript复制
代码语言:javascript复制
$P
代码语言:javascript复制
[1] 0.9656
代码语言:javascript复制
检验的结果为P值非常大,远大于a=0.05 ,因此不能拒绝原假设,说明新建住宅价格指数的方差大于0.25,变动很大。

0 人点赞